PHP对微信支付v2回调进行验签并将相关数据加入数据库

本文介绍如何在PHP中处理微信支付V2版本的回调验证,并将回调数据存入数据库。代码可能较为杂乱,注释详细,需按个人需求调整。回调数据以XML格式返回,数据结构对隐私已做处理。

PS:对于V2版本微信支付的回调需要在线上环境进行,本文中出现的数据库的相关字段,各位请按照个人需求进行修改,此处只对微信回调数据进行相关解析; 代码方面写的比较杂乱,多看注释,相关代码根据个人需求进行修改;

文章中出现的所有require_once都使用的是绝对路径,按照自身需求进行修改

PHP配置文件:
appConfig.php

<?php

const appid = 'appid';
const mch_id = 'mch_id';
const APIv2 = 'APIv2';
const APIv3 = 'APIv3';
const serial_no = '证书序列号';
const secret = '小程序secret';

上方代码中的相关数据因为个人隐私,此处已经全部隐去,请按照个人需求进行修改

PHP数据库配置文件
database/config.php

<?php
const databaseHost = '127.0.0.1:3306';
const databaseUser = 'root';
const databasePassword = 'root';
const databaseName = 'onlyproject';

PHP处理微信回调数据文件
callBackAction.php

<?php
require_once dirname(__FILE__,3).'/config/appConfig.php';
require_once dirname(__FILE__,3).'/database/connect.php';

$getResult = file_get_contents('php://input');  //接受微信发送的回调通知
$content = $getResult;  //将回调的内容赋值给另一个变量
file_put_contents('./getResultData.xml',$content."\n\r",FILE_APPEND); //将回调的内容存入对应的文件中,用于查看数据格式,根据用途可将此段删除

$returnData = file_get_contents('./returnData.xml');  //获取返回给微信的数据
echo $returnData;

$disposeData = simplexml_load_string($content,null,LIBXML_NOCDATA); //解析接受到的xml数据
$json_data = json_encode($disposeData);  //将xml数据转换为JSON数据
$array_data = json_decode($json_data,true); //再次将JSON数据转换为数组
$sign = $array_data['sign']; //获取到微信回调数据的签名值

unset($array_data['sign']); //将签名值从数组中剔除

$APIv2 = APIv2; //获取APIv2密钥
$signBody = ''; //遍历数组生成签名数据主体
foreach($array_data as $key => $val){
    $signBody .= "$key=$val&";
}
$signBody .= "key=$APIv2";

$signature = strtoupper(MD5($signBody)); //对参与签名的数据进行MD5签名并转化为大写

if($sign == $signature){  //判断生成的签名值与微信回调的签名值是否一致
    $return_code = $disposeData -> return_code;  //获取返回状态码
    $result_code = $disposeData -> result_code;  //获取业务结果
    $transaction_id = $disposeData -> transaction_id; //获取微信支付订单号
    $pay_total_fee = $disposeData -> cash_fee;  //获取现金支付金额
    $pay_time_data = $disposeData -> time_end;  //获取支付时间字符串
    $dispose_payTime = date('Y-m-d H:i:s',strtotime($pay_time_data)); //将字符串类型的支付时间转换格式
    $out_trade_no = $disposeData -> out_trade_no;  //获取商户订单号
    if($return_code == 'SUCCESS' && $result_code == 'SUCCESS'){  //判断业务结果
        $update = new Connect;  //将数据存入数据库中
        $sql = 'update order_basic_information set status = 2,transaction_id = "'.$transaction_id.'",pay_total_fee = "'.$pay_total_fee.'",pay_time = "'.$dispose_payTime.'" where out_trade_no = "'.$out_trade_no.'";';
        $result = $update -> querySql($sql);
    }
}

文章中将微信回调的数据存入了相关文件之中,目的是为了查看返回数据的数据结构,并无其他用途,请各位按照自身需求进行删除或保留

附上微信回调数据格式,xml数据如下:

<xml><appid><![CDATA[小程序appid]]></appid>
    <bank_type><![CDATA[OTHERS]]></bank_type>
    <cash_fee><![CDATA[1]]></cash_fee>
    <fee_type><![CDATA[CNY]]></fee_type>
    <is_subscribe><![CDATA[N]]></is_subscribe>
    <mch_id><![CDATA[商户号mch_id]]></mch_id>
    <nonce_str><![CDATA[sKL9o2GDNOdwHmx1YMtgA0vkqa4PiJWc]]></nonce_str>
    <openid><![CDATA[小程序微信用户openid]]></openid>
    <out_trade_no><![CDATA[2022080416280816596016884608]]></out_trade_no>  //注:商户订单号
    <result_code><![CDATA[SUCCESS]]></result_code>
    <return_code><![CDATA[SUCCESS]]></return_code>
    <sign><![CDATA[签名值]]></sign>
    <time_end><![CDATA[20220804162823]]></time_end>  //支付时间
    <total_fee>1</total_fee>
    <trade_type><![CDATA[JSAPI]]></trade_type>
    <transaction_id><![CDATA[微信支付订单号]]></transaction_id>
</xml>

为了个人隐私考虑,我已将上访部分隐私数据进行隐藏,但对看数据结构无影响


本文由CSDN用户:缱绻淡蓝海 原创,代码具有时效性,作者会不定时进行更新,有任何疑问欢迎私信或者评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值