React-native-wechat: payment: 支付验证签名失败

Created on 30 Apr 2017  ·  4Comments  ·  Source: yorkie/react-native-wechat

我这后台使用 node-weixin-pay 来产生请求信息,结果到应用这提示「支付验证签名失败」。

而后台数据经微信公众平台支付接口调试工具验证,是没有问题的。

不知有人遇到这个问题没有?

known issue payment

Most helpful comment

的确是这个问题。我把代码帖一下,免得后面人也被坑。

server side

var reqparam = {
   appid: AppCfg.WXPayCfg.appid,
   partnerid:data.mch_id,
   prepayid:data.prepay_id,
   timestamp: generateTimeStamp(),
   noncestr: generateNonceStr(),
   package:'Sign=WXPay',
};
reqparam.sign = wxpay.sign(reqparam);

app side

let result = await WeChat.pay({
  partnerId: res.partnerid, /*商家向财付通申请的商家id*/
  prepayId: res.prepayid, /*预支付订单*/
  nonceStr: res.noncestr, /*随机串,防重发*/
  timeStamp: res.timestamp, /*时间戳,防重发*/
  package: res.package, /*商家根据财付通文档填写的数据和签名*/
  sign: res.sign, /*商家根据微信开放平台文档对数据做的签名*/
}); 

All 4 comments

问题已解决。

主要原因

根据微信开发文档,返回签名是根据如下字段生成的:

参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package

而根据开发文档的调起支付一节,请求参数就是上述6个再加上签名,只是参数名全是小写的。

也就是说,要使用小写的生成签名,而返回驼峰式的到前端 APP,奇葩吧!

参考资料

  1. 微信支付开发文档-App支付/业务流程
  2. 最近微信APP支付遇到的一些坑
  3. react-native-wechat

的确是这个问题。我把代码帖一下,免得后面人也被坑。

server side

var reqparam = {
   appid: AppCfg.WXPayCfg.appid,
   partnerid:data.mch_id,
   prepayid:data.prepay_id,
   timestamp: generateTimeStamp(),
   noncestr: generateNonceStr(),
   package:'Sign=WXPay',
};
reqparam.sign = wxpay.sign(reqparam);

app side

let result = await WeChat.pay({
  partnerId: res.partnerid, /*商家向财付通申请的商家id*/
  prepayId: res.prepayid, /*预支付订单*/
  nonceStr: res.noncestr, /*随机串,防重发*/
  timeStamp: res.timestamp, /*时间戳,防重发*/
  package: res.package, /*商家根据财付通文档填写的数据和签名*/
  sign: res.sign, /*商家根据微信开放平台文档对数据做的签名*/
}); 

还有就是 timestamp得是10位int, 这个问题困扰了我半天

Was this page helpful?
0 / 5 - 0 ratings