收藏
回答

wx.requestVirtualPayment 一直提示支付签名失败,有可能是什么原因?

环境变量是0 appkey也确定没搞错 为什么还是报错

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

4 个回答

  • 从君华
    从君华
    03-27

    把官方的 Demo 给 AI 让他翻译成你的语言的版本,不要自己写。

    03-27
    有用
    回复
  • Memory (私信不回复)
    Memory (私信不回复)
    03-27

    报错的是 15005 还是 15006?

    03-27
    有用
    回复 12
    查看更多(7)
  • 神经蛙
    神经蛙
    03-27
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    """ pay_sig签名算法计算示例 """
    
    import hmac
    import hashlib
    import json
    import time
    
    def calc_pay_sig(uri, post_body, appkey):
        """ pay_sig签名算法
          Args:
         uri - 当前请求的API的uri部分,不带query_string 例如:/xpay/query_user_balance
              post_body - http POST的数据包体
              appkey    - 对应环境的AppKey
          Returns:
              支付请求签名pay_sig
        """
        need_sign_msg = uri + '&' + post_body
        pay_sig = hmac.new(key = appkey.encode('utf-8'), msg = need_sign_msg.encode('utf-8'),
                           digestmod=hashlib.sha256).hexdigest()
        return pay_sig
    
    def calc_signature(post_body, session_key):
        """ 用户登录态signature签名算法
          Args:
              post_body   - http POST的数据包体
              session_key - 当前用户有效的session_key,参考auth.code2Session接口
          Returns:
              用户登录态签名signature
        """
        need_sign_msg = post_body
        signature = hmac.new(key = session_key.encode('utf-8'), msg = need_sign_msg.encode('utf-8'),
                           digestmod=hashlib.sha256).hexdigest()
        return signature
    
    # uri,切记不可带参数,即去掉"?"及后面的部分
    # 如果是基础库的wx.requestVirtualPayment,uri固定为requestVirtualPayment
    uri = '/xpay/query_user_balance'
    
    # 此处appkey为假设值,实际使用应根据支付环境(env参数)替换为对应的AppKey
    appkey = "12345"
    
    # 注意:JSON数据序列化结果,不同语言/版本结果可能不同
    # 所以示例为了保证稳定性,直接用其中一个序列化的版本
    # 实际使用时只需要保证,参与签名的post_body和真正发起http请求的一致即可
    """
    # 不同接口要求的Post Body参数不一样,此处以query_user_balance接口为例(和uri对应)
    post_body = json.dumps({
        "openid": "xxx",
        "user_ip": "127.0.0.1",
        "env": 0
    })
    """
    post_body = '{"openid": "xxx", "user_ip": "127.0.0.1", "env": 0}'
    
    # step1. pay_sig签名计算(支付请求签名算法)
    pay_sig = calc_pay_sig(uri, post_body, appkey)
    print("pay_sig:", pay_sig)
    
    # 若实际请求返回pay_sig签名不对,根据以下步骤排查:
    # 1. 确认算法:uri、post_body、appkey写死以上参数,确保你的签名算法和示例calc_pay_sig结果完全一致
    # 2. 确认参数:
    #    - uri不可带参数(即"?"及后续部分全部舍去)
    #    - post_body必须和真正发起HTTP请求的post body完全一致
    #    - appkey必须是与请求中对应的环境匹配(env参数决定)
    assert pay_sig == "c37809f27c6d7fd1837ad2500a04512b66b34fd793a39a385fade56dca89a4b5"
    
    # step2. signature签名计算(用户登录态签名算法)
    # session_key需要为当前用户有效session_key(参考auth.code2Session接口获取)
    # 此处写死方便复现算法
    session_key = "9hAb/NEYUlkaMBEsmFgzig=="
    signature = calc_signature(post_body, session_key)
    print("signature:", signature)
    
    # 若实际请求返回signature签名不对,参考随后的"90010-signature签名错误问题排查思路"进行排查
    assert signature == "089d9e8dc5d308977360c4b79ec600a93d736802802a807d634192328032f6c7"
    


    可以用官方的这个例子,一步步对比结果,看看哪一步有问题。

    03-27
    有用
    回复
  • 智能回答 智能回答 本次回答由AI生成
    03-27
    有用
登录 后发表内容