8

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

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

4

6 回答 6

13

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

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

于 2019-08-16T08:23:30.620 回答
1

2022 年更新:

刚刚检查了razorpay文档:

建议的方法:

const razorpay = require("razorpay");
const isValid = razorpay.validateWebhookSignature(reqBody, signature, mySecret);

文档链接: https ://razorpay.com/docs/payments/payment-gateway/server-integration/nodejs/#subscribe-to-webhook-events

于 2022-02-02T20:53:48.680 回答
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!');
    }
于 2021-05-24T11:22:50.810 回答
0

您只需要更改 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;
于 2019-06-30T21:39:51.533 回答
0

在此处输入图像描述通过官方的 razorpay npm 模块,发现这个功能可以为您完成这项工作。不妨利用这一点。

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

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

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

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

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

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

于 2020-04-13T11:35:03.620 回答
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 请求正文不要使用一些特殊字符,如“/”等。这会导致签名验证失败。

于 2021-01-25T18:50:47.187 回答