动态资讯

微信小程序支付通知处理的注意事项与方法

发布日期:2025-03-13 点击量:

在微信小程序支付的过程中,当我们完成支付后,但是怎么能拿到支付的交易号transaction_id呢?有些开发者往往在这一步被卡住,不知道如何正确处理,下面针对支付通知/支付回调的处理重点简要说明一下。

备注:
1.本文是采用的服务端是thinkphp底层框架,使用V2支付密钥;
2.强调支付通知地址必须能联网的,不是本地的地址,url结尾不要携带参数,如 'https://www.gzhijing.cn/weapplet/notify/handle';
3.强调必须要连接远程服务器中的数据库,不是本地环境的数据库

逻辑处理:
前提是 微信小程序中 点击支付/吊起支付 后插入了一条支付数据到数据库,但不知是否真正付款的状态
当支付成功后,微信会不定时向服务端发送通知消息
1. 接收数据流
$weixinData = file_get_contents("php://input");
2.数据流放在远程服务器一级目录中的notify.txt文件中
file_put_contents('notify.txt', $weixinData, FILE_APPEND); //是xml格式
3.把接受的xml格式数据流转成数据
$weixinArr = $this->xmlToArray($weixinData);
4.获取数组中对应元素的值【这里就能拿到交易号等】
$transaction_id=$weixinArr['transaction_id'];
$total_fee = $weixinArr['total_fee'];
$out_trade_no = $weixinArr['out_trade_no'];
//如果成功返回了 $weixinArr['return_code'] == 'SUCCESS' && $weixinArr['result_code'] == 'SUCCESS'
5.则验证签名是否正确
 $weixinArr=$this->xmlToArray($weixinData);
$sign=$weixinArr['sign'];
unset($weixinArr['sign']);//去除原先的签名
$newsign=$this->MakeSign($weixinArr,'07e1fedaae9706c90c0**********');//v2 数组中去除sign后重新进行签名,得到newsign
if($sign==$newsign){
Db::query('UPDATE wx_order SET status=1 , transaction_id=' . $transaction_id);//修改支付状态与添加交易号到数据库
}else{
    echo '签名不正确!';
}
6.验证支付金额是否相同
//查询吊起支付后添加的支付数据中的金额
$indata_total_fee = Db::table('gn_wx_order')->where('out_trade_no',$out_trade_no)->field('total_fee')->find();
//支付通知金额与数据库中金额二者进行比较,如果相同,则执行
if($total_fee==$indata_total_fee['total_fee']*100){
    Db::query('UPDATE gn_wx_order SET confirm_pay=1 WHERE out_trade_no=' . $out_trade_no);//修改确认支付为1
//[然后阻止重复发送支付通知]

 echo exit('');

//注意这里:return_msg 目前成功返回的 SUCCESS ,不是OK

}else{
    echo '支付金额验证不同,请技术人员尽快提供安全支持!';
}

代码块下载


首页
服务
小程序
电话