收藏
回答

小程序虚拟支付调用接口时,为啥根据文档的python代码写的一样规则,为啥还是报错提示签名校验失败?

文档地址:https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/industry/virtual-payment.html#_2-4-%E7%AD%BE%E5%90%8D%E8%AF%A6%E8%A7%A3

问题1)签名详解没有具体说明signData包含的参数转字符串规则,不同接口参数不同参数如果排序不同加密处理的结果也会不同,请说明一下加密字符串规则?

根据文档底部提供的python代码转换为php代码后,输出参数pay_sig、signature结果和python一致。

但切换为实际参数后就提示 "errmsg" => "签名校验失败 rid: 64cb7c4b-04288911-3af4b778"

public function testTignature()
    {
        $uri = '/xpay/query_user_balance';
        $data = [
            "openid"  => "xxx",
            "user_ip" => "127.0.0.1",
            "env"     => 0,
        ];
        $jsonBody = str_replace(':', ': ', json_encode($data));
        $jsonBody = str_replace(',', ', ', $jsonBody);
        $query = [
            'pay_sig'   => hash_hmac('sha256', $uri . '&' . $jsonBody, "12345"),
            'signature' => hash_hmac('sha256', $jsonBody, "9hAb/NEYUlkaMBEsmFgzig=="),
        ];
        dump($query);
    }

输出结果:
 "pay_sig" => "c37809f27c6d7fd1837ad2500a04512b66b34fd793a39a385fade56dca89a4b5"
 "signature" => "089d9e8dc5d308977360c4b79ec600a93d736802802a807d634192328032f6c7"


回答关注问题邀请回答
收藏

1 个回答

  • 余辉
    余辉
    2023-08-03

    pay_sig校验失败,不要用"12345"这个key,要用mp页面上的appkey

    2023-08-03
    有用
    回复 2
    • PHOME_明
      PHOME_明
      2023-08-03
      大佬,上面的代码testTignature只是示例校验代码,实际代码是替换调参数的,现在的问题是签名详解没有具体说明signData包含的参数转字符串规则
      2023-08-03
      回复
    • 余辉
      余辉
      2023-11-14回复PHOME_明
      如果是api请求的话signdata就是你请求的整个body部分,包含所有的空格与换行符
      2023-11-14
      回复
登录 后发表内容