收藏
回答

服务商模式小程序支付签名失败,请求管理员和大牛解决!!!

框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
小程序 Bug wx.requestPayment 工具 6.6.3 2.4.1

服务商模式小程序支付签名失败,请求管理员和大牛解决!!!





根据服务商模式的小程序支付文档:

①商户server调用支付统一下单:

统一下单成功返回预付单:



②商户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);


返回


③小程序调起支付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"}



最后一次编辑于  2018-12-10
回答关注问题邀请回答
收藏

5 个回答

  • 失忆的故事
    失忆的故事
    2020-06-04

    1。二次签名用的key要是服务商所属的APPID的秘钥,而不是特约商户 2.加密试必须要是 MD5而不能是 HMAC-SHA256 。

    //我也是试了N久看了很多百度资料才搞定的。

    2020-06-04
    有用
    回复
  • 波
    2018-12-11

    1. $stringA = "appId=".$appId."&nonceStr=".$nonceStr."&package=".$package."&signType=".$signType."&timeStamp=".$timeStamp; 请从官网下载SDK参考签名过程, 这里appId一定是小程序的appid

    2.密钥是服务商的密钥,不是子商户的

    2018-12-11
    有用
    回复 1
    • Johnny
      Johnny
      2018-12-11

      谢谢。问题已经解决,的确是密钥的问题。希望官方要备注一下。

      2018-12-11
      回复
  • 疯狂的小辣椒
    疯狂的小辣椒
    2018-12-10

    你好,首先可以用微信支付提供的签名校验工具对比下签名结果是否一致(工具地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1),如果一致大概率是你使用的密钥key错了,key可以前往微信商户平台--》api安全---》api密钥重新设置,注意保管好你的key,不要外泄哦!


    2018-12-10
    有用
    回复 6
    • Johnny
      Johnny
      2018-12-10

      这个密钥key是特约商户密钥key吗?appId是特约商户小程序的appid吗?

      2018-12-10
      回复
    • Johnny
      Johnny
      2018-12-10

      特约商户密钥key,我重新设置了。还差报错哦,{err_code: 2, err_desc: "支付验证签名失败", errMsg: "requestPayment:fail"}

      2018-12-10
      回复
    • Johnny
      Johnny
      2018-12-10

      是不是我的域名还没ICP备案,才会导致这样?

      2018-12-10
      回复
    • 疯狂的小辣椒
      疯狂的小辣椒
      2018-12-10回复Johnny

      我反馈给支付侧的同学看看哈

      2018-12-10
      回复
    • Johnny
      Johnny
      2018-12-11回复疯狂的小辣椒

      麻烦咯

      2018-12-11
      回复
    查看更多(1)
  • Johnny
    Johnny
    2018-12-10

    后台计算:


    使用签名校验工具(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1):


    paySign结果都一样:05FF63B2CF5F1B79D087AEBD025D9EE14BC8E25B16A5A548DBE6EA61BE240223

    哪位大牛可以解决,,,等待ING

    2018-12-10
    有用
    回复
  • 2018-12-10

    这个问题很常见,特别是服务商模式下,任何一个字段不匹配就会报这个错。。。我们用的是 HMAC-SHA256  这种加密方式

    2018-12-10
    有用
    回复 1
    • Johnny
      Johnny
      2018-12-10

              $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);



      还是一样出现支付验证签名失败

      2018-12-10
      回复
登录 后发表内容