文章目錄
  1. 1. 您没有JSAPI支付权限
  2. 2. 支付签名失效
    1. 2.1. app签名字段
    2. 2.2. 公众号支付jsapi

最近在添加微信支付的公众号支付功能,遇到一些问题,记录下来。

您没有JSAPI支付权限

这个是因为在商户后台的支付配置里,没有设置支付目录

支付签名失效

这里要注意app支付的签名字段和公众号支付的签名字是不一样

app签名字段

查看app支付的业务流程,可以看到

1
2
步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。
参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay

公众号支付jsapi

公众号支付的业务流程里,没有看到像APP支付那样的步骤,没有写明签名字段,查看H5调起支付API, 看到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function onBridgeReady(){
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId""wx2421b1c4370ec43b", //公众号名称,由商户传入
"timeStamp"" 1395712654", //时间戳,自1970年以来的秒数
"nonceStr""e61463f8efa94090b1f366cccfbbb444", //随机串
"package""prepay_id=u802345jgfjsdfgsdg888",
"signType""MD5", //微信签名方式:
"paySign""70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名
},
function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ) {} // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回 ok,但并不保证它绝对可靠。
}
);
}

还是没有弄清楚paySign字段的生成方式。

但是在公众平台的微信支付文档里, 又看到发起微信支付请求

1
2
3
4
5
6
7
8
9
10
11
12
wx.chooseWXPay({
timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
nonceStr: '', // 支付签名随机串,不长于 32 位
package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
paySign: '', // 支付签名
success: function (res) {
// 支付成功后的回调函数
}
});

备注:prepay_id 通过微信支付统一下单接口拿到,paySign 采用统一的微信支付 Sign 签名生成方法,注意这里 appId 也要参与签名,appId 与 config 中传入的 appId 一致,即最后参与签名的参数有appId, timeStamp, nonceStr, package, signType。

在这里提到了生成paySign需要的字段。但纳闷的是为何发起微信支付请求会有两种方式,难道是新旧方式?

需要注意的是,在getBrandWCPayRequest方式中,时间戳字段是timeStamp,而在chooseWXPay中,时间戳字段是timestamp.

在APP支付中,package字段的值是Sign=WXPay, 而在公众号支付中,package字段的值是 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***

打赏作者

文章目錄
  1. 1. 您没有JSAPI支付权限
  2. 2. 支付签名失效
    1. 2.1. app签名字段
    2. 2.2. 公众号支付jsapi