PHP实现个人免签约微信支付接口原理+源码

article/2025/4/4 16:43:13

什么是个人免签支付

个人免签支付就是给个人用的支付接口,一般的支付接口都需要营业执照才能申请,个人很难申请的到,或者是没有资质去申请,要和支付商进行签约的。免签,顾名思义就是不需要签约。那么个人免签支付就有市场了,就是为了解决个人无法轻易申请到支付接口的问题。

免签的方案有很多种

  1. APP监听收款码的支付结果,然后修改页面的支付结果。
  2. 二次清算。款先到拥有官方支付接口的商户中,由商户给你结算。
  3. Xposed微信插件实现全自动监听创建收款码、以及收款过程,容易封号。

方案其实有很多种,但是以上的方案都有不少的缺点,当然这些方案仍有不少人在用,没办法,确实是解决问题的一种办法。而本次文章我也是通过简单的技术开发实现第一种APP监听收款码的免签支付方式。

APP监听收款码的支付结果

整个过程很简单:

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

上代码

index.php

该页面是用于创建订单的,其中 $order_price = 0.01; 就是创建一笔0.01元的订单。创建订单前,程序会查询数据库来确定当前金额是否存在未支付的订单,如果存在,需支付的金额会在当前订单金额基础上+0.01元。

为什么要这么做?因为APP监听只能监听到收到了多少钱,无法监听到订单号,所以无法区分这个金额是你支付的还是其他人支付的。

所以在当前订单有效期内,你需要注意两件事,第一,你这个程序的访问量一定不能太高,不允许高并发的情况出现,适合小众,小规模,小流量的业务使用,一旦人多了,短时间内订单量多了,很难做到精准的监听支付结果。

<!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 onload="clock(120)"><?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/>人工微信号:sansure2016</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>

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' => '未支付');}// 返回JSONecho 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);}}// 返回JSONecho json_encode($ret,JSON_UNESCAPED_UNICODE);?>

完整代码

以上3个文件是核心代码,仅作技术分析实现原理。完整的代码涉及到样式、图片、数据库操作类、以及数据库表SQL语句、监听APP源码及安装包。

在这里插入图片描述

Demo图片

页面也是非常简单的,也是由本人设计,页面精简美观。

在这里插入图片描述

监听APP配置

监听APP配置也挺简单的,只需要将notify.php的线上URL配置至APP即可。具体操作请看截图:

1、打开APP,选择**【发送通道】点击【Webhook】,选择【GET请求】** ,输入notify.php 所在服务器的URL,下面的参数填写**【orderMsg=[msg]】**即可。

在这里插入图片描述

2、选择**【转发规则】,点击【应用】,添加转发规则,【APP包名】,选择【是】,包名输入【com.tencent.mm】**,选择的发送通道是上一步你创建的通道,下方的模板直接选择通知内容即可。

在这里插入图片描述

到这里,APP基本完成配置,然后将这个APP的自动启动开启,以及加入电池优化白名单,保证这个APP能一直在后台运行不被杀死。

赞赏码获取

为什么用赞赏码而不用收款码?因为收款码更容易被风控,收款码更加适合面对面扫码收款,而不适合线上远程收款,因为你的每一笔支付,都会记录付款ip地址,定位等信息,扫码次数多了,就会被系统判断远程付款,容易触发风控。赞赏码是用于网络上的赞赏使用,相对来说是比收款码安全的。

在这里插入图片描述

获得自己的赞赏码后,将赞赏码的那部分裁剪出来,替换掉源码中 zsm.jpg 这个文件就行了。赞赏码是可以设置赞赏的引导语的,可以将引导语修改为【请点击其他金额输入】,引导用户。

源码下载

这个源码只有单页面,没有后台,只适合个人单页部署使用或者研究、学习、二次开发,不适合开箱即用,当然其实你有点基础,也算是开箱即用,上传到服务器,修改数据库配置,导入数据库表,配置好赞赏码,配制好APP异步回调,也是可以用来做单页的收款的,只要你的金额是固定的,确实是开箱即用。

https://github.com/likeyun/liKeYun_MqPay

作者

TANKING


http://chatgpt.dhexx.cn/article/Gek6xPve.shtml

相关文章

有PHP接口回调 个人收款好助手,谈一下关于个人网站实现免签支付接口自动收款...

由于本人有一个项目需要用到支付收款功能&#xff0c;只有企业资质才能申请支付宝和微信支付接口&#xff0c;我也看了下市面上的 一些个人收款码的方案&#xff0c;来实现自动收款&#xff0c;感觉这样做有很大的风险&#xff0c;用个人码收款也会让人感觉项目网站不太正规 我…

个人网站对接支付宝,微信支付接口史上最详细教程

对接支付宝支付接口&#xff0c;官方文档已经写的很清楚了&#xff0c;但是也有很多像我一样的小白&#xff0c;第一次对接支付宝支付接口&#xff0c;会有些迷茫&#xff0c;所以我在此写下这篇文章&#xff0c;给我和我一样的同学&#xff0c;一点思路吧。三分钟就可以申请&a…

android个人支付功能,个人app支付接入(三分钟搞定个人微信支付,支付宝支付问题)---贝贝支付...

前言 想必很多人个人开发者和我有同样的感触&#xff0c;想要在自己开发的app中接入微信支付和支付宝支付&#xff0c;仅仅是去申请支付接口就把我们挡在了门外&#xff0c;微信和支付宝都只对接企业的&#xff0c;那不是想逼死我们个人开发者吗&#xff1f;一开始使用过waps的…

2022年最新个人免签易支付源码网站对接支付教程

安装环境: 1.宝塔面板中新建网站安装环境需要设置&#xff1a; 2.运行环境为PHP7.0MYsql5.6 网站目录->运行目录 设置为public并保存&#xff0c; 3.伪静态 设置为thinkphp并保存&#xff0c; 4.默认文档 设置将index.html放在第一行并保存 ​。 安装教程: 1.打开网站目录…

有赞云支付php接口,有赞个人免签支付设置

释放双眼&#xff0c;带上耳机&#xff0c;听听看~&#xff01; 随着网站越来越普及&#xff0c;市面上的支付接口申请难度越来越大&#xff0c;又有很多用户向我们推荐集成有赞云支付接口&#xff0c;所以我们今天集成了一下&#xff0c;经亲自测试后可行。 现在说下接口申请的…

JavaWeb个人网站对接支付宝支付接口教程

第一步&#xff1a;&#xff08;先要在支付宝进行操做&#xff0c;拿到我们需要开发的信息后在动代码&#xff09; 进入蚂蚁金服&#xff0c;我们先要创建应用 看到图下的应用按钮了吗&#xff1f; 扫码登录 进入沙盒环境使用 接入支付宝的步骤大致如下&#xff1a; 申请一…

个人网站如何选择支付接口(API回调)

本人持续关注“个人网站支付接口”这个话题已久,期间也开发、对接过很多支付方的接口,如Paypal、支付宝、微信、环迅等。终于决定花点时间写一款WordPress付费阅读工具然后写几篇相关的文章。当然跟近期盛传的“内容付费时代来了”没有关系(Are you sure about that?),“…

互联网医院智慧医院系统

什么是互联网医院&#xff1f;我们来看一下百度百科的定义 “互联网医院系统”带有在线问诊、随访、慢病管理等功能&#xff0c;它有实体医院作强有力的支撑&#xff0c;线上方便病人&#xff0c;就是简单的问题不需要到医院&#xff0c;在网上就可以进行。 可见在线问诊、随访…

神经外科病人资料管理系统

神经外科病人资料管理系统 神经外科病人资料管理系统&#xff0c;该软件管理科室相关资料&#xff0c;包括病人资料、随访信息、科室人员资料、光盘录像带资料等科室日常数据&#xff0c;软件支持丰富的查询检索、数据导入导出、高级查询、统计报表、列表打印&#xff0c;以及字…

实现智能化的慢性病管理,慢病监护系统

随着人口老龄化的不断加剧&#xff0c;慢性病的发病率不断上升&#xff0c;对个人和社会健康带来了严重威胁。为了更好地管理和控制慢性病&#xff0c;智康护推出了一款全新的慢病监护系统。本文将对该系统的特点和优势进行详细介绍。 一、系统概述&#xff1a; 智康护慢病监护…

医院病例管理系统

技术&#xff1a;Java、JSP等摘要&#xff1a;随着计算机技术、网络技术和通信技术的不断发展和普及&#xff0c;医院很多领域都运用这些先进的技术实现了数字化、信息化和网络化[1]。通过这些技术可以很大程度的提高工作效率&#xff0c;节省人力、物力资源&#xff0c;减少错…

患者监护系统模型

患者监护系统模型 目前住院病人主要由护士护理&#xff0c;这样不仅需要大量护士,而且由于不能随时观察危重病人的病情变化,还可能会延误抢救时机。某医院打算开发一个以计算机为中心的患者监护系统。试建立它的对象模型&#xff0c;动态模型,功能模型及用例模型。 医院对患者…

慢病管理系统开发提升能区域医疗慢病管理服务吗

慢性病的治疗是一项长期并随病程的进展不断调整的管理过程。行为方式的干预贯穿全程,从认知到行动;从饮食到药物;从监测到治疗;从心理到生理,都需要改变不健康的行为方式,树立科学的整体健康观,实施多因素行为干预综合治疗。利用互联网、物联网、云计算技术用于慢性病管理,…

医院临床病例管理系统,促进医疗数据的管理

医疗行业的不断发展&#xff0c;临床病例管理系统也逐渐成为医院管理重要的一环&#xff0c;医院临床病例管理系统是一款集医学信息管理、科研分析以及教学为一体的平台&#xff0c;为医生提供更加高效、准确的病例管理方式&#xff0c;提高诊疗质量&#xff0c;为医学科研提供…

患者监护系统

问题定义&#xff1a; 患者监护系统以病人和时间为出发点&#xff0c;监测系统需要获取到病人的生理特征&#xff0c;将其数据生成报表。在该系统中&#xff0c;事务的终点是护士&#xff0c;通过病人的生理信号来了解病人情况&#xff0c;病人生理值超出&#xff0c;会发出警告…

智能随访系统助力三甲医院随访模式新升级,新探索,新创新

随访是指医院对曾在医院就诊的病人以通讯或其它的方式&#xff0c;进行对病人继续追踪、查访。从而了解患者病情变化。通过随访可以提高医院医前及医后服务水平&#xff0c;同时方便医生对病人进行跟踪观察&#xff0c;方便医生随时掌握患者病情&#xff0c;也有利于医学科研工…

智慧医院系统定制|慢病管理系统更全面

这几年【智慧医院系统】的应用越来越多&#xff0c;我国的慢性病发病率、致残率高、死亡率高&#xff0c;而现在慢性病越来越呈现出年轻化趋势&#xff0c;因此医疗行业迫切需要借助更高效、更规范化的管理模式来改善慢病易发高发、防控难度大的现状&#xff0c;于是智慧医院系…

Pythonxy'import sitecustomize'错误的解决办法

Pythonxy之前一直用得好好的&#xff0c;今天在使用Pythonxy启动Spyder时突然出现了’import sitecustomize’的错误&#xff0c;如下图 在网上搜了好久没有找到相应的解决方案&#xff0c;最后在Stack Overflow上找到了答案&#xff0c;原来是防火墙搞得鬼 于是我用了一个很…

Pythonxy批量修改变量名

最近学python用的pythonxy 批量修改变量名&#xff1a; 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 上面填原来的名字&#xff0c;下面填改动的名字&#xff0c;全部改动记得勾选Replace all 然后点击Replace/find就实现了 此方法要注意文本中的误改问题

Python(x,y)的安装

Python(x,y&#xff09;的安装 下载的网址为&#xff1a;http://pythonxy.connectmv.com/ 安装完成后&#xff0c;界面如图所示&#xff1a; Shortcuts&#xff1a;启动各种应用程序Documentation&#xff1a;打开各个软件包的文档About&#xff1a;查看所安装的程序库的版本…