收藏
回答

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

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

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





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

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


返回

timeStamp1544428725
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"}



最后一次编辑于  2018-12-10  (未经腾讯允许,不得转载)
回答关注问题邀请回答
收藏

4 个回答

  • 娇华
    娇华
    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)
  • 波
    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
      回复
  • Johnny
    Johnny
    2018-12-10

    后台计算:

    timeStamp1544436564
    nonceStr"4FE35B26E47D0666F15A4F10924AA915"
    package"prepay_id=wx10180924407742977e1ceaa40822018777"
    signType"HMAC-SHA256"
    paySign"05FF63B2CF5F1B79D087AEBD025D9EE14BC8E25B16A5A548DBE6EA61BE240223"


    使用签名校验工具(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
      回复