经验分享

个人免签支付开发原理和示例源码分享

我的站长站 2023-04-06 人阅读

个人免签是什么?

官方支付接口比如支付宝微信支付接口都需要营业执照才能申请,个人没有资质是无法申请的,想用官方支付是需要和商家签约的。

个人免签支付就是专门为没资质的个人使用的在线支付接口,无需签约,就可以使用。

个人免签原理

1、APP监听收款码的支付结果,然后修改页面的支付结果。

2、二次清算。款先到拥有官方支付接口的商户中,由商户给你结算。

3、Xposed微信插件实现全自动监听创建收款码、以及收款过程,容易封号。

方案其实有很多种,但是以上的方案都有不少的缺点,当然这些方案仍有不少人在用,没办法,确实是解决问题的一种办法。

实战示例分享

以下示例实现是用的第一种APP监听收款码的免签支付方式,整个过程很简单:访问URL -> 检查数据库2分钟内未支付的订单金额 -> 如果2分钟内未支付的订单金额中存在当前订单一样的金额,需要在当前金额基础上+0.01元用于区分订单的唯一性 -> 用户扫码支付 -> 安卓手机APP监听到这笔订单的收款 -> 将收款金额异步发送到服务器 -> 服务器修改数据库该笔订单金额的支付状态 -> 扫码页面一直在轮询订单的支付状态,发现已支付就修改页面的支付结果 -> 完成支付。

创建支付请求代码

index.php

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0,viewport-fit=cover">
    <meta charset="utf-8">
    <script src="./js/jquery.min.js"></script>
    <link rel="stylesheet" href="./css/style.css">
    <title>微信赞赏码免签约支付实现原理Demo</title>
</head>
 
<body>
     
    <?php
     
        // 数据库配置
        include './Db.php';
         
        // 实例化类
        $db = new DB_API($config);
         
        // 订单号
        $order_num = date('Ymd').time();
         
        // 订单金额
        $order_price = 0.01;
         
        // 获取未支付订单列表
        $getOrderList = $db->set_table('mqpay_order')->findAll(['order_status' => 1]);
         
        // 遍历订单
        $orderNoExpire = array();
        for ($i = 0; $i < count($getOrderList); $i++) {
             
            // 订单时间
            $order_time = json_decode(json_encode($getOrderList[$i]))->order_time;
             
            // 订单金额
            $order_money = json_decode(json_encode($getOrderList[$i]))->order_money;
             
            // 获取2分钟未支付的订单
            if(countTimes(time(),strtotime($order_time)) <= 2){
                 
                // 如果存在
                $orderNoExpire[] = $order_money;
     
            }
        }
         
        // 判断是否有2分钟未支付的订单
        if(count($orderNoExpire) == 0){
             
            $needPay = $order_price;
        }else{
             
            // 获取2分钟未支付的订单的最大金额+0.01
            $needPay = max($orderNoExpire) + 0.01;
             
        }
         
        // 创建订单
        creatOrder($order_num,$order_price,$needPay,$db);
         
         
        // 创建订单
        function creatOrder($order_num,$order_price,$needPay,$db){
             
            // 订单参数
            $createOrder = [
                'order_num' => $order_num,
                'order_price' => $order_price,
                'order_money' => $needPay,
            ];
             
            // 创建
            $createOrderResult = $db->set_table('mqpay_order')->add($createOrder);
            if($createOrderResult){
                 
                // 成功
                echo '<div class="payInfoCard">
                    <div class="header">里客云科技</div>
                    <div class="moneyCard">
                        <div class="text">支付金额</div>
                        <div class="money"><span class="rmb">¥</span>'.$needPay.'</div>
                        <!--二维码-->
                        <img src="./img/zsm.jpg" id="zsmQrcode" class="zsmQrcode" />
                        <p class="payWarning">请识别上方赞赏码</p>
                        <p class="payWarning">点击<span class="blueFont">其他金额</span>输入'.$needPay.'元</p>
                        <p class="payWarningMini">输入的金额必须要完全一致</p>
                        <p id="orderExpireTime"></p>
                        <p id="orderNum" style="display:none;">'.$order_num.'</p>
                        <p id="needPay" style="display:none;">'.$needPay.'</p>
                    </div>
                </div>
                 
                <!--提示-->
                <p class="payTips">我们通过机器人监测本次支付<br/>支付后会立刻显示支付结果<br/>支付后没显示支付结果请联系人工处理<br/>微信号:xxx</p>';
            }else{
                 
                // 失败
                echo '<div class="payInfoCard">
                    <div class="header">里客云科技</div>
                    <div class="moneyCard" style="padding:20px 20px;">
                        创建订单失败!
                    </div>
                </div>';
            }
        }
         
         
        // 计算时间戳的差值
        function countTimes($begin,$end){
             
            $begintimes = $begin;
            $endtimes = $end;
            $timediff = abs($endtimes - $begintimes);
            $days = intval($timediff / 86400);
            $remain = $timediff % 86400;
            $hours = intval($remain / 3600);
            $remain = $remain % 3600;
            $mins = intval($remain / 60);
            $secs = $remain % 60;
            return $mins;
        }
         
    ?>
     
    <script>
     
        // 每2秒获取一次支付结果
        var checkPayInterval = setInterval('checkPay()',2000);
         
        // 获取支付结果
        function checkPay(){
             
            // 获取订单号和支付金额
            var orderNum = $("#orderNum").text();
            var needPay = $("#needPay").text();
             
            $.ajax({
                type: "GET",
                url: "./checkPay.php?order_num="+orderNum+"&order_money="+needPay,
                success: function(res){
   
                    // 判断支付结果
                    if(res.code == 200){
                         
                        console.log('支付成功');
                        $("#zsmQrcode").prop("src","./img/success.png");
                        $('#orderExpireTime').css('display','none');
                        clearInterval(checkPayInterval);
   
                    }else{
                         
                        console.log(res.msg);
                    }
                }
            });
        }
         
        // 倒计时
        function clock(times){
             
            // 获取时分秒
            var h=parseInt(times/3600);
            var m=parseInt((times%3600)/60);
            var s=(times%3600)%60;
             
            // 在页面中显示倒计时
            $('#orderExpireTime').html(m+"分"+s+"秒后过期");
             
            // 倒计时
            if(times > 0){
                times = times-1;
                setTimeout(function (){
                    clock(times);
                }, 1000);
            }else{
                 
                // 显示订单过期
                $("#zsmQrcode").prop("src","./img/expire.png");
                $('#orderExpireTime').text('订单已过期,请刷新页面!');
                 
                // 结束轮询
                clearInterval(checkPayInterval);
                 
                console.log('订单过期,停止监听');
            }
        }
    </script>
</body>
 
</html>

该页面是用于创建订单的,其中 $order_price = 0.01; 就是创建一笔0.01元的订单。
创建订单前,程序会查询数据库来确定当前金额是否存在未支付的订单,如果存在,需支付的金额会在当前订单金额基础上+0.01元。
为什么要这么做?因为APP监听只能监听到收到了多少钱,无法监听到订单号,所以无法区分这个金额是你支付的还是其他人支付的。 所以在当前订单有效期内,你需要注意两件事,第一,你这个程序的访问量一定不能太高,不允许高并发的情况出现,适合小众,小规模,小流量的业务使用,一旦人多了,短时间内订单量多了,很难做到精准的监听支付结果。

实时监听支付代码

checkPay.php
这个是用于订单页面实时监听支付结果的,每2秒就查一次数据库获取订单的支付结果,2分钟后未支付会停止查询。

<?php
 
    // 页面编码
    header("Content-type:application/json");
     
    // 数据库配置
    include './Db.php';
 
    // 实例化类
    $db = new DB_API($config);
     
    // 获取订单号和支付金额
    $order_num = $_GET['order_num'];
    $order_money = $_GET['order_money'];
     
    // 根据订单号和订单金额来查询支付结果
    $getOrderPayStatus = $db->set_table('mqpay_order')->find(['order_num'=>$order_num,'order_money'=>$order_money]);
     
    // 判断支付结果
    if($getOrderPayStatus){
         
        // 支付状态
        $order_status = json_decode(json_encode($getOrderPayStatus))->order_status;
         
        if($order_status == 2){
             
            // 支付成功
            $payResult = array(
                'code' => 200,
                'msg' => '支付成功'
            );
        }else{
             
            // 未支付
            $payResult = array(
                'code' => 202,
                'msg' => '未支付'
            );
        }
         
    }else{
         
        // 无结果
        $payResult = array(
            'code' => 201,
            'msg' => '未支付'
        );
    }
     
    // 返回JSON
    echo json_encode($payResult,JSON_UNESCAPED_UNICODE);
     
?>

异步回调代码

notify.php
这个是异步回调,在APP监听软件需要配置这个文件的URL和传递的参数,将监听到的金额post给你的服务器然后修改数据库的支付结果,以实现支付回调的目的。

<?php
 
    // 页面编码
    header("Content-type:application/json");
 
    // 原文
    $orderMsg = $_GET['orderMsg'];
     
    // 数据库配置
    include './Db.php';
 
    // 实例化类
    $db = new DB_API($config);
     
    // 订单金额、需支付的金额、通知原文、db实例
    updateOrder($orderMsg,$db);
     
    // 修改支付结果
    function updateOrder($orderMsg,$db){
         
        // 截取
        // 示例:二维码赞赏到账1.00元
        // 截取【到账】后面的
        $money_1 = substr($orderMsg, strripos($orderMsg, "到账") + 6);
         
        // 截取【元】前面的
        $money_2 = substr($money_1, 0, strrpos($money_1, "元"));
         
        // 更新订单
        $updateOrderResult = $db->set_table('mqpay_order')->update(['order_status'=>1,'order_money'=>$money_2],['order_status'=>2,'order_paytime'=>time(),'order_msg'=>$orderMsg]);
 
        if($updateOrderResult){
             
            // 成功
            $ret = array(
                'code' => 200,
                'msg' => '支付成功',
                'order_num' => $order_num,
                'order_money' => $money_2,
                'order_msg' => $orderMsg
            );
        }else{
             
            // 失败
            $ret = array(
                'code' => 200,
                'msg' => '支付失败',
                'order_num' => $order_num
            );
        }
    }
     
    // 返回JSON
    echo json_encode($ret,JSON_UNESCAPED_UNICODE);
     
?>


相关专题
支付收银
支付收银
2021-10-04 262

支付收银专题为您整理本站关于网站支付相关程序源码、插件。对接教程等等资源,主要为目前热门的码支付、易支付和第三方第四方支付源码,还有各类CMS支付插件下载,...

相关推荐
  • 个人支付源码
  • 支付源码
  • 免签约源码
  • php个人支付宝收款源码
    php个人支付宝收款源码

    源码介绍一款挺好看的php个人支付宝收款源码,伪H5手机支付,可以作为示例参考。源码截图使用方法修改config.php里面的支付接口密钥//支付宝公钥&#39;alipay_public_key&#39; => "",//商户私钥&#39;...

    php源码 177 2年前
  • PHP第四方个人即时到账支付收款平台源码
    PHP第四方个人即时到账支付收款平台源码

    PHP支付源码介绍PHP第四方个人即时到账支付收款平台源码,竣成码支付微支付,微信支付宝QQ支付接口竣成码支付-微支付,独立开发者个人即时到账收款平台,无需担心第三方跑路资金直接到账,不经过第三方。...

    php源码 469 4年前
  • THinkPHP攸梦个人支付易支付完整网站源码
    THinkPHP攸梦个人支付易支付完整网站源码

    THinkPHP内核个人易支付完整 100可运行支付行业网站源码,完美可运行,tp 框架,支持支付宝,微信 qq 等主流支付接口可对接代刷等平台。易支付源码安装方法1、上传源码到网站根目录2、导入数据库文件3、...

    php源码 582 4年前
  • ASP微信支付接口代码 4.4.5
    ASP微信支付接口代码 4.4.5

    ASP微信支付接口代码 4.4.5说明ASP微信支付接口代码 4.4.5适用于电子商务。运行环境:ASP,源码语言:中文ASP扫码支付是用的最普遍的一种接口,所有ASP的网站都能整合使用,可实现支付下单结果返回,并入库...

    asp源码 230 4年前
  • 天方夜谭易支付全功能PHP版网站源码
    天方夜谭易支付全功能PHP版网站源码

    源码截图源码安装教程1、上传主机根目录也就是常见的wwwroot2、解压3、域名/install直接进入安装界面

    php源码 1014 4年前
  • Thinkphp内核小微支付源码
    Thinkphp内核小微支付源码

    最近很火的Thinkphp内核小微支付服务商专用源码,内附安装教程。本源码采用thinkphp框架开发,完全开源,你拿到的源码都可以自己做二开,无加密,目前市面最火的模式,微信服务商集成系统,可向用户提供微信...

    php源码 1213 4年前
  • 预约支付通用小程序模块源码v8.5.85
    预约支付通用小程序模块源码v8.5.85

    源码说明微预约支付版是一款可以自定义表单模型,基本上所有行业都能用:预约、报名、订单等场景的微信模块。适用范围:微预约支付版,运行环境:PHP+MYSQL+公众号模块截图主要功能1、在线支付:微信支付、...

    小程序源码 548 4年前
  • PHP支付宝免签约即时到帐程序网站源码
    PHP支付宝免签约即时到帐程序网站源码

    PHP支付宝免签约即时到帐程序网站源码是从作者彩虹那里200元买来的,无需挂机实现及时到账源码纯原版,原汁原味,没有进行任何更改源码里面有个includes/aop/Aop.php建议删掉,因为这个东西可以直接访问...

    php源码 261 4年前
  • PHP彩虹5.1免签约自动发卡源码
    PHP彩虹5.1免签约自动发卡源码

    PHP源码说明本源码运行环境要求PHP5.6及以上版本才行,编码为UTF-8编码。最新破解版测试无后面,新增了各种支付接口,还有卡盟社区对接更新。安装方法解压到PHP运行环境,浏览器运行 域名/install 进入...

    php源码 578 5年前
最新更新