【问题标题】:Razorpay Signature Verification Failed in pythonRazorpay 签名验证在 python 中失败
【发布时间】:2021-09-07 13:32:17
【问题描述】:

我正在使用 webhook 使用 razorpay 付款链接验证付款状态。我已将 webhook 添加到 RazorPay webhook 部分,其中 payment_links 作为活动元素。我在使用付款链接时收到付款完成指示。但是 webhook 抛出了这个错误。

这就是我验证签名的方式

webhook_secret = "abc"  
webhook_signature = request.headers['X-Razorpay-Signature']
client = razorpay.Client(auth=("xyz", "pqr"))
payload_body = json.dumps(request.json, separators=(',', ':'))
verify = client.utility.verify_webhook_signature(payload_body, webhook_signature, webhook_secret)
print(verify)

也试过了

payload_body = json.dumps(request.data, separators=(',', ':'))

但我不断收到错误,

razorpay.errors.SignatureVerificationError: Razorpay Signature Verification Failed

我试过这样

verify = client.utility.verify_webhook_signature(request.data.decode('utf-8'), webhook_signature, webhook_secret)
print(verify)

输出为无

已编辑

我已经尝试了以下方法,但它们都不起作用

1)  verify = client.utility.verify_webhook_signature(json.dumps(request.data, separators=(',', ':')), webhook_signature, webhook_secret)
        print("verification of signature {}".format(verify)) 

导致TypeError:字节类型的对象不是JSON可序列化的。

2)  verify = client.utility.verify_webhook_signature(json.dumps(request.json, separators=(',', ':')), webhook_signature, webhook_secret)
        print("verification of signature {}".format(verify))
        #razorpay.errors.SignatureVerificationError: Razorpay Signature Verification Failed

3) verify = client.utility.verify_webhook_signature(json.dumps(body, separators=(',', ':')), webhook_signature, webhook_secret)
    print("verification of signature {}".format(verify))

2 和 3 导致 razorpay.errors.SignatureVerificationError: Razorpay 签名验证失败

【问题讨论】:

    标签: python-3.7 webhooks razorpay


    【解决方案1】:

    如果您使用 Django,请使用 request.body 而不是 request.json 获取原始正文并在解码后将其发送到 verify_webhook_signature 方法。这是示例代码-

    def verify_payment(request):
        payload_body = request.body.decode()
        webhook_secret = "abc"  
        webhook_signature = request.headers['X-Razorpay-Signature']
        client = razorpay.Client(auth=("xyz", "pqr"))
        verify = client.utility.verify_webhook_signature(payload_body, 
            webhook_signature, webhook_secret)
        print(verify)
    

    由于这个问题https://github.com/razorpay/razorpay-python/issues/121,您必须在验证之前解码正文,否则会引发 TypeError。

    如果您使用的是 Flask,请使用 request.data 而不是 request.json,其他步骤相同。

    【讨论】:

    • 根据 razorpay 文档,我们需要使用响应正文而不对其进行解析。解码正文会改变请求正文吗?
    • 是的,解码正文会将其更改为字符串。实际上,如果您查看源代码验证签名 webhook,那么您会观察到它首先将主体解析为字节,如果已经在字节中,则会引发类型错误,这就是为什么我首先解码主体以将其解析为字符串。
    猜你喜欢
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 2017-11-28
    • 2013-10-28
    • 2020-11-02
    • 2016-01-13
    相关资源
    最近更新 更多