收藏
回答

小程序调起支付时报支付签名验证失败



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

4 个回答

  • 明良
    明良
    2019-07-30

    微信支付的重点是两次签名,微信支付的核心都是计算签名与正在签名的路上。

    第一次签名是为了获得预支付ID即:

    只要调用统一下单接口就能获得这个参数。格式如下:

    "package": "prepay_id=wx30111002654823a0028a69991003130900",

    第二次签名是把微信服务器返回的参数再签名一次,这次签名主要是提供给前端调用,即调起微信支付时的必须参数。

    例如小程序:

    wx.requestPayment({
    timeStamp: '1564371379',
       nonceStr: 'JoTcEhgphkSAXPcpSqYFqKFUDMktGulc',
       package: 'prepay_id=wx29113619598850b0682884011250194100',
       signType: 'MD5',
       paySign: '86BFA0E44B87FF783BB575F0B9FE584C',
       success (res) { },
       fail (res) { }
    })


    例如公众号:

    WeixinJSBridge.invoke('getBrandWCPayRequest',{
    "appId":"你知道的",
       "timeStamp":"1564447668",
       "nonceStr":"GdvVpOMQMalJZRIWwqZdHhEfkgmTZrDl",
       "package":"prepay_id=wx30084748300502f4ebd6c03a1574592700",
       "signType" : "MD5",
       "paySign":"D99537A0D3AB73EE4E752B315974732E"
    },function(res){}

    一定要把签名搞明白了,sdk中已经写的很明白了,下面再说一下签名步骤,

    第一次签名有10个参数,必须按字典排序对了哦,然后把生成的签名当做一个参数传给xml

    这11个参数中只有三个是重要的【

    $appid  // 这个不用说了,公众号ID。
    $mch_id // 商户号,开通微信支付,这个就是V信给你的银行卡号
    $openid //自己去公众号后台看下关注列表,一定要是自己的,谁支付就是谁的

    】,其他都是随便写的。

    这里再跟大家普及一下签名:

    /**
    * 签名函数
    *方法:
    签名步骤一:按字典序排序参数
    ksort($this->values);
    $string = $this->ToUrlParams();
    签名步骤二:在string后加入KEY
    $string = $string . "&key=".WxPayConfig::KEY;
    签名步骤三:MD5加密
    $string = md5($string);
    签名步骤四:所有字符转为大写
    $result = strtoupper($string);
    * @return string
    */
    public function sign($data){
    $stringA = '';
       foreach ($data as $key=>$value){
    if(!$value) continue;
           if($stringA) $stringA .= '&'.$key."=".$value;
       else $stringA = $key."=".$value;
       }

    $wx_key = 'xxxxxxxxxxxxxxxxxxx';//这个密匙请正确填写,自己在公众号

    后台找,会跟着你的appid在一起

       $stringSignTemp = $stringA.'&key='.$wx_key;
       return strtoupper(md5($stringSignTemp));
    }


    第二次签名是把第一签名的几个参数再签名一次,方法一样。把这5个按字典排序再签一次名。

    $tmp['appId'] = $appid;
    $tmp['nonceStr'] = $nonce_str;
    $tmp['package'] = 'prepay_id=' . $array['PREPAY_ID'];
    $tmp['signType'] = 'MD5';
    $tmp['timeStamp'] = "$time";


    以上所有步骤完成之后,

    返回这样的json字符串,接口就搞定完成了。(postman调试)


    2019-07-30
    有用 1
    回复 3
    • Harry🎈
      Harry🎈
      2019-08-04
      .... 左后拼接的key要去商户号里找, 不和appid在一起
      2019-08-04
      回复
    • 明良
      明良
      2019-08-12回复Harry🎈
      这个key是你申请微信支付时你自己定义的一个交易密匙
      2019-08-12
      回复
    • freechat(Ethan)
      freechat(Ethan)
      2019-10-07
      我全部一致,完全按照要求,并用sdk的is函数验证签名,但到前端还是错误
      2019-10-07
      回复
  • 微信支付技术助手1
    微信支付技术助手1
    2019-07-15

    1,KEY值有误。2,下单和调起支付签名type不一致。3,调起支付的sign是从下单的值过来的没有重新签。检查一下。可以用官方的验证工具先试一下参数。

    2019-07-15
    有用 1
    回复 3
    • 大. Bug
      大. Bug
      2019-07-16


      2019-07-16
      回复
    • 大. Bug
      大. Bug
      2019-07-16
      key值搞错了,但是现在有新问题,String strXML = wxPay.requestWithoutCert("https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey",params, this.getHttpConnectTimeoutMs(), this.getHttpReadTimeoutMs()),就像是没有成功调用,是什么情况
      2019-07-16
      回复
    • 大. Bug
      大. Bug
      2019-07-16回复大. Bug
      而且还是直接跳到异常
      2019-07-16
      回复
  • 真香定理
    真香定理
    2020-02-12

    https://blog.csdn.net/qq_41974199/article/details/104285940

    2020-02-12
    有用
    回复
  • 大. Bug
    大. Bug
    2019-07-13

    求大佬帮忙看一下有错吗

    2019-07-13
    有用
    回复 1
    • 大. Bug
      大. Bug
      2019-07-13
      prepayId都拿到了,但是前端调用的时候总是“支付签名验证失败”
      2019-07-13
      回复
登录 后发表内容