收藏
回答

小程序支付验证签名失败



已成功通过统一支付接口获取到prepay_id,使用和统一下单同样的小程序appId和对应的商户API key对appId,nonceStr,package,signType,timeStamp这几个参数进行md5加密,参数传到小程序后调起支付时报支付验证签名失败


相关代码:

public Map getPayInfo(Map data)throws Exception {
   Map unifiedOrder = unifiedOrder(data);
   Map signData = Maps.newHashMap();
   signData.put("appId", this.config.getAppID());
   signData.put("timeStamp", String.valueOf(WXPayUtil.getCurrentTimestamp()));
   signData.put("nonceStr", WXPayUtil.generateNonceStr());
   signData.put("package", "prepay_id=" + unifiedOrder.get("prepay_id"));
   signData.put("signType", WXPayConstants.MD5);
   Map returnData = Maps.newHashMap();
   returnData.put("timeStamp", signData.get("timeStamp"));
   returnData.put("nonceStr", signData.get("nonceStr"));
   returnData.put("package", signData.get("package"));
   returnData.put("signType", signData.get("signType"));
   returnData.put("paySign", WXPayUtil.generateSignature(signData, this.config.getKey()));
   return returnData;
}


md5加密前的串是这样的:

appId=****&nonceStr=2f3c978b0e91435dab8b0f0045665158&package=prepay_id=wx201707141513256189b0503e0006016925&signType=MD5&timeStamp=1500016405&key=****


签名前有加key,签名时的appId和key和统一下单的appId和key是相同的。


md5加密算法没有问题,用微信签名校验工具也核对过了,参数名称检查了很多遍和文档上是一样的。


小程序代码:

var timeStamp = res.payInfo.timeStamp;
var nonceStr = res.payInfo.nonceStr;
var packageInfo = res.payInfo.package;
var signType = res.payInfo.signType;
var paySign = res.payInfo.paySign;
wx.requestPayment({
 'timeStamp': timeStamp,
 'nonceStr': nonceStr,
 'package': packageInfo,
 'signType': signType,
 'paySign': paySign,
 'success': function (res) {
   console.log(res);
 },
 'fail': function (res) {
   console.log(res);
 }
})


到底哪里有问题啊,求助!!!

最后一次编辑于  2017-07-14
回答关注问题邀请回答
收藏

15 个回答

  • 未那酱
    未那酱
    2017-07-14

    @杨木

    小程序端是能直接调起支付的,但是会弹出支付验证签名失败的提示。

    2017-07-14
    有用
    回复
  • 杨木
    杨木
    2017-07-14

    直接在前端JS试一下看能不能调起支付

    2017-07-14
    有用
    回复
  • 未那酱
    未那酱
    2017-07-14

    @Tooko

    timeStamp生成签名时不是字符串形式的,可以看我签名前打出来的串中

    appId=****&nonceStr=2f3c978b0e91435dab8b0f0045665158&package=prepay_id=wx201707141513256189b0503e0006016925&signType=MD5&timeStamp=1500016405&key=****

    timeStamp是10位数字形式的。

    我刚刚也尝试了你说的方法但还是签名验证失败。


    @杨木

    md5加密时是有添加key的,在最后

    appId=****&nonceStr=2f3c978b0e91435dab8b0f0045665158&package=prepay_id=wx201707141513256189b0503e0006016925&signType=MD5&timeStamp=1500016405&key=****

    2017-07-14
    有用
    回复
  • 杨木
    杨木
    2017-07-14

    加密还需要增加一个商户key才能验证签名的

    2017-07-14
    有用
    回复
  • Tooko
    Tooko
    2017-07-14

    timeStamp生成签名的时候不要转string。发起requestPayment入参的时候前台自己timestamp.toString()。

    2017-07-14
    有用
    回复

正在加载...

登录 后发表内容