服务商模式小程序支付签名失败,请求管理员和大牛解决!!!
根据服务商模式的小程序支付文档:
①商户server调用支付统一下单:
统一下单成功返回预付单:
order | |
appid | "wx11aa86ff470f0e4f" // 服务商的appid |
mch_id | "1518613291" // 服务商的mch_id |
nonce_str | "3acnTtQYjSqgbZL8" |
prepay_id | "wx10155845519876977e1ceaa42184415093" |
result_code | "SUCCESS" |
return_code | "SUCCESS" |
return_msg | "OK" |
sign | "5EBF79C3D17140CF4946985C4E1C4A00B9472BB3DE5E30FD3546E0AB216BAA62" |
sub_appid | "wx7ba8336d4ed76238" // 特约商户号小程序的appid |
sub_mch_id | "1520123771" // 特约商户号 |
trade_type | "JSAPI" |
②商户server调用再次签名:
生成签名PHP代码:
$appId = $order['sub_appid']; // 特约商户小程序的appid:wx7ba8336d4ed76238
$nonceStr = $order['nonce_str']; // 随机串
$package = "prepay_id=".$order['prepay_id']; // 数据包
$signType = "MD5"; // 签名方式
$timeStamp = time(); // 时间戳
$key = "XXXXXXXXXXXXXXXXXXXXXXXX"; // 特约商户的密钥key
// 第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:
$stringA = "appId=".$appId."&nonceStr=".$nonceStr."&package=".$package."&signType=".$signType."&timeStamp=".$timeStamp;
// 第二步:拼接API密钥
$stringSignTemp = $stringA ."&key=".$key;
// MD5签名方式
$sign = md5($stringSignTemp);
// 字符串所有字符转换为大写
$paySign = strtoupper($sign);
返回
timeStamp | 1544428725 |
nonceStr | "3acnTtQYjSqgbZL8" |
package | "prepay_id=wx10155845519876977e1ceaa42184415093" |
signType | "MD5" |
paySign | "2A6BBEBE8B4DB46A9E6BB52233F77D2D" |
③小程序调起支付API:
wx.requestPayment({
'timeStamp': "1544428725",
'nonceStr': "3acnTtQYjSqgbZL8",
'package': "prepay_id=wx10155845519876977e1ceaa42184415093",
'signType': "MD5",
'paySign': "2A6BBEBE8B4DB46A9E6BB52233F77D2D",
'success': function (res) {
console.log(res)
},
'fail': function (res) {
console.log(res)
},
'complete': function (res) {
console.log(res)
},
})
返回
{err_code: 2, err_desc: "支付验证签名失败", errMsg: "requestPayment:fail"}
1。二次签名用的key要是服务商所属的APPID的秘钥,而不是特约商户 2.加密试必须要是 MD5而不能是 HMAC-SHA256 。
//我也是试了N久看了很多百度资料才搞定的。
1. $stringA = "appId=".$appId."&nonceStr=".$nonceStr."&package=".$package."&signType=".$signType."&timeStamp=".$timeStamp; 请从官网下载SDK参考签名过程, 这里appId一定是小程序的appid
2.密钥是服务商的密钥,不是子商户的
谢谢。问题已经解决,的确是密钥的问题。希望官方要备注一下。
你好,首先可以用微信支付提供的签名校验工具对比下签名结果是否一致(工具地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1),如果一致大概率是你使用的密钥key错了,key可以前往微信商户平台--》api安全---》api密钥重新设置,注意保管好你的key,不要外泄哦!
这个密钥key是特约商户的密钥key吗?appId是特约商户小程序的appid吗?
特约商户的密钥key,我重新设置了。还差报错哦,{err_code: 2, err_desc: "支付验证签名失败", errMsg: "requestPayment:fail"}
是不是我的域名还没ICP备案,才会导致这样?
我反馈给支付侧的同学看看哈
麻烦咯
后台计算:
使用签名校验工具(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1):
paySign结果都一样:05FF63B2CF5F1B79D087AEBD025D9EE14BC8E25B16A5A548DBE6EA61BE240223
哪位大牛可以解决,,,等待ING
这个问题很常见,特别是服务商模式下,任何一个字段不匹配就会报这个错。。。我们用的是 HMAC-SHA256 这种加密方式
$appId = $order['sub_appid']; // 特约商户appid:wx7ba8336d4ed76238
$nonceStr = $order['nonce_str']; // 随机串
$package = "prepay_id=".$order['prepay_id']; // 数据包
$signType = "HMAC-SHA256"; // 签名方式
$timeStamp = time(); // 时间戳
$key = "XXXXXXXXXXXXXXXXXXXXXXXX"; // 特约商户密钥key
// 第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:
$stringA = "appId=".$appId."&nonceStr=".$nonceStr."&package=".$package."&signType=".$signType."&timeStamp=".$timeStamp;
// 第二步:拼接API密钥
$stringSignTemp = $stringA."&key=".$key;
// HMAC-SHA256
$sign = hash_hmac("sha256", $stringSignTemp, $key);
// 字符串所有字符转换为大写
$paySign = strtoupper($sign);
还是一样出现支付验证签名失败