【问题标题】:Razorpay signature verification not happening as SHA256 Digest is wrong NodeJSRazorpay 签名验证没有发生,因为 SHA256 摘要是错误的 NodeJS
【发布时间】:2019-10-27 14:34:11
【问题描述】:

我正在制作一个应用程序,在成功付款后我会创建一个摘要,我使用建议的 Razorpay 签名验证方式进行验证。

我的后端在 NodeJS 中,这就是我创建摘要的方式。

const crypto = require("crypto");

 var generatedSignature = crypto
      .createHmac(
        "SHA256",
        razorpay_order_id + "|" + razorpay_payment_id
      )
      .update(key_secret)
      .digest("hex");  

var isSignatureValid = generatedSignature == payload.razorpay_signature // false

我创建签名的方式不对吗?

【问题讨论】:

    标签: node.js razorpay


    【解决方案1】:

    您可以使用以下代码。希望这可以使代码更易于理解。

    const crypto = require("crypto");
    const hmac = crypto.createHmac('sha256', RAZORPAY_KEY_SECRET);
    
    hmac.update(razorpayOrderId + "|" + razorpayPaymentId);
    let generatedSignature = hmac.digest('hex');
    
    let isSignatureValid = generatedSignature == payload.razorpay_signature;
    

    更多信息请参考此链接https://nodejs.org/api/crypto.html#crypto_class_hmac

    【讨论】:

    • 重点回答。它真的很有帮助。谢谢
    【解决方案2】:

    您只需要更改 createHmac 并像下面那样在其中交换参数进行更新。

    const crypto = require("crypto");
    
    var generatedSignature = crypto
      .createHmac(
        "SHA256",
        key_secret
      )
      .update(razorpay_order_id + "|" + razorpay_payment_id)
      .digest("hex");  
    
     var isSignatureValid = generatedSignature == payload.razorpay_signature;
    

    【讨论】:

      【解决方案3】:

      通过官方的razorpay npm 模块,发现这个功能可以为你完成这项工作。不妨利用这个。

      文件名和目录:node_modules/razorpay/dist/utils/razorpay-utils.js,函数名:validateWebhookSignature

      接受'body'——散列序列, 'signature' -- razorpay 返回的签名, 'key_secret' -- 来自 razorpay 仪表板

      这使用与此线程前面提到的相同的 crypto.hmac_256 函数。

      更新: 使用此函数测试,返回 false ==> 签名不匹配。

      在 GitHub 上阅读,签名不会使用测试密钥匹配。使用实时密钥时它会起作用。

      当我尝试使用生产密钥时将更新此线程。 干杯!

      【讨论】:

      • 对此进行了测试。返回 false ==> 哈希不匹配。
      【解决方案4】:
      const crypto=require('crypto');
      const json = JSON.stringify(req.body); // req.body is entire body payload 
      const expectedSignature = 
      crypto.createHmac('sha256',secretKey).update(json).digest('hex');
      // secretKey is configured key provided by us while creating webhook
      
      
      //--- Or Use razorpay static method 
      
      /*
      @params body string (body is req.body data)
      @params razorpayHeaderSignature string (x-razorpay-signature of header section 
      provided by webhook)
      @params secretKey (secretKey is configured key provided by us while creating webhook)
      */
      
      const json = JSON.stringify(req.body); // req.body is entire body payload 
      Razorpay.validateWebhookSignature(body, razorpayHeaderSignature, secretKey);
      

      注意 - IN 请求正文不要使用一些特殊字符,如“/”等。这会导致签名验证失败。

      【讨论】:

        【解决方案5】:

        以下解决方案对我有用

             import crypto from 'crypto';
        
             const signature = req.headers['x-razorpay-signature'];
             const generatedSignature = crypto
              .createHmac('sha256', RAZOR_PAY_WEBHOOK_SECRET)
              .update(JSON.stringify(req.body))
              .digest('hex');
        
            if (signature === generatedSignature) {
              console.log('request is legit');
            }
            else{
              console.log('Wrong Signature!');
            }
        

        【讨论】:

        • 您能否在您的问题中添加示例有效签名、示例请求正文和生成的签名?
        猜你喜欢
        • 2019-05-11
        • 1970-01-01
        • 2017-06-22
        • 1970-01-01
        • 2019-06-27
        • 1970-01-01
        • 1970-01-01
        • 2017-03-24
        • 2018-07-18
        相关资源
        最近更新 更多