PHP微信小程序-微信支付分-APIv3
弄到凌晨4点半,终于把微信支付分接口的坑给躺平了。。肝
微信APIv3与v2区别
格式:v3用json,v2用xml
回调:v3需要AES-256-GCM加密
签名方式:v3用非对称密钥SHA256-RSA
小程序支付-官方文档
指引
https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_2.shtml
微信生成签名
https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_0.shtml
微信签名验证
https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_1.shtml
微信回调
https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter6_1_22.shtml
测试微信回调
<?php $url = 'https://www.xxx.cn/v1/wx/wechatpay/notify_url'; //你的微信支付回调域名 $ch = curl_init($url); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_POSTFIELDS,'你的XML数据(从第一次支付成功保存到数据库或者日志里查看'); curl_setopt($ch, CURLOPT_RETURNTRANSFER,true); curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type:text/xml; charset=utf-8")); $result = curl_exec($ch); // 抓取URL并把它传递给浏览器 exit($result);
常见问题及错误码(用ctrl+f搜索)
https://developers.weixin.qq.com/community/pay/doc/0004060fa7c65855d698166145b808?blockType=8
函数:
openssl_get_publickey()
openssl_verify()
parse_url($url);//拆分url为数组
遇到的坑:
1、微信支付的APIV3还不完善,比如查询‘支付分-订单’就无法使用语法糖的方法。还得自己生成签名,然后用guzzle去请求,其他接口都没问题。所以目前使用APIV3的话,如果要查询订单,2套方法都的写,有点坑。
2、自己生成签名去请求,必须带签名,而且按照他的格式,比如
$res = $client->request('GET', $url_all, [
'headers' => [
'Authorization'=>'WECHATPAY2-SHA256-RSA2048 '.$token,
'Content-Type'=>'application/json',
'Accept'=>'application/json',
'User-Agent'=>'wx_play/v1',
]
]);
Authorization里面不是只有token,前面要加上WECHATPAY2-SHA256-RSA2048和空格。
3、windows本地开发使用ssl时报错:CURLE_PEER_FAILED_VERIFICATION (60)
解决:https://www.jianshu.com/p/a5f11c448436
4、请求v3接口必须带签名证书
5、微信支付回调,必须证书解密,尽量签名验证来源。