微信支付v3支付结果通知处理(php)

背景

微信支付V3与之前的版本相比有了较大的改动,但开发文档并没有demo。目前在网上搜到的多数是旧版本的处理方式,经过一番摸索终于搞定,因此做个记录。

开发文档地址在此

后端开发

获取支付结果

文档说:

支付结果通知是以POST 方法访问商户设置的通知url,通知的数据以JSON
格式通过请求主体(BODY)传输。通知的数据包括了加密的支付结果详情。

那么在php中可以这样获取数据:

$data = file_get_contents('php://input');
$data = json_decode($data, true);

现在报文不是xml格式了,而是json格式,简单快捷。

结果内容如下:

{
    "id":"EV-2018022511223320873",
    "create_time":"2015-05-20T13:29:35+08:00",
    "resource_type":"encrypt-resource",
    "event_type":"TRANSACTION.SUCCESS",
    "resource" : {
        "algorithm":"AEAD_AES_256_GCM",
        "ciphertext": "...",
        "nonce": "...",
        "original_type":"transaction",
        "associated_data": ""
    },
	"summary":"支付成功"
}

所以要判断字段summary是不是"支付成功"。

解密订单数据

上述的支付结果中,字段resource的值便包含了加密后的订单数据,因此在判断支付成功后,便需要对订单数据解密。

文档如是说:

下面详细描述对通知数据进行解密的流程:
1、用商户平台上设置的APIv3密钥【微信商户平台—>账户设置—>API安全—>设置APIv3密钥】,记为key;
2、针对resource.algorithm中描述的算法(目前为AEAD_AES_256_GCM),取得对应的参数nonce和associated_data;
3、使用key、nonce和associated_data,对数据密文resource.ciphertext进行解密,得到JSON形式的资源对象;

也就是说,订单数据密文是resource.ciphertext。

先简单处理一下:

$nonceStr = $resource['nonce'];
$associatedData = $resource['associated_data'];
$ciphertext = $resource['ciphertext'];
$ciphertext = \base64_decode($ciphertext);
if (strlen($ciphertext) <= 12) {
	return;
}

解密方法如下:


if (function_exists('\sodium_crypto_aead_aes256gcm_is_available') && \sodium_crypto_aead_aes256gcm_is_available()) {
	//$APIv3_KEY就是在商户平台后端设置是APIv3秘钥
	$orderData = \sodium_crypto_aead_aes256gcm_decrypt($ciphertext, $associatedData, $nonceStr, $APIv3_KEY);
	$orderData = json_decode($orderData, true);

	//到数据库查看订单状态是否已更新为"success"

	//应答微信支付已处理该订单的通知
	return ['code' => 'SUCCESS', 'message' => ''];
}

是不是跟旧版本相比简单了许多。

这里面可能需要去安装sodium,这个就自行百度就可以了,有详细的教程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值