由于SHA256 Digest错误NodeJS,Razorpay签名验证未发生

时间:2019-06-13 03:35:55

标签: node.js razorpay

我正在制作一个应用程序,其中在成功付款后创建一个摘要,然后使用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

我创建签名的方式错误吗?

5 个答案:

答案 0 :(得分:0)

您只需要像下面那样更改顺序即可。

const crypto = require(“ crypto”);

var generateSignature =加密货币       .createHmac(         “ SHA256”,         key_secret       )       .update(razorpay_order_id +“ |” + razorpay_payment_id)       .digest(“ hex”);

var isSignatureValid = generateSignature == payload.razorpay_signature

答案 1 :(得分:0)

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

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 :(得分:0)

enter image description here浏览了razorpay npm官方模块后,发现此功能可以为您完成工作。也可以利用它。

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

采用'body'-哈希序列, '签名'-razorpay返回签名, 'key_secret'-从razorpay仪表板

它使用与该线程先前提到的相同的crypto.hmac_256函数。

更新: 使用此功能进行测试,返回不匹配的false ==>签名。

在GitHub上阅读,使用测试密钥无法匹配签名。使用实时键即可使用。

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

答案 3 :(得分:0)

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 请求正文不要使用某些特殊字符,如“/”等。这会导致签名验证失败。

答案 4 :(得分:0)

以下解决方案对我有用

     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!');
    }