Javascript 手动验证条带web钩子

Javascript 手动验证条带web钩子,javascript,node.js,stripe-payments,Javascript,Node.js,Stripe Payments,我正在尝试手动验证web钩子: const stripeSecret = createHmac('sha256', STRIPE_SIGNING_SECRET) .update(event.body) .digest('hex'); if(stripeSecret !== keyFromHeader) { throw err(); } 但它与报头中接收到的条带密钥不匹配。 下面是我也尝试在Stripe API中使用的事件数据(它也会失败): 这不是even

我正在尝试手动验证web钩子:

const stripeSecret = createHmac('sha256', STRIPE_SIGNING_SECRET)
        .update(event.body)
        .digest('hex');

if(stripeSecret !== keyFromHeader) {
  throw err();
}
但它与报头中接收到的条带密钥不匹配。 下面是我也尝试在Stripe API中使用的事件数据(它也会失败):

这不是event.body,您应该根据文档进行散列( )它是以下各项的串联:

  • 时间戳(作为字符串)
  • 角色
  • 实际的JSON负载(即请求主体)=>JSON.stringify(req.body)
您需要对此进行解析以获得时间戳(“t=xxxxx”部分中的xxxxx)


如果您给我一个示例条带签名头,我可以尝试一个代码示例。

event.body
可能不够-在节点服务器环境中,作为传入请求正文的“解析”版本是很常见的,相反,您需要确保访问正文中实际的原始JSON字符串——这就是Stripe签名的计算依据。这可能有点棘手

(许多例子都是为不同的框架提供的)


另外,是否有特定的原因手动执行此操作而不仅仅使用Stripe的节点库?:)

为什么我需要时间戳?在哪里使用它?医生这么说的。stripe decidedI没有帮助的是:const stripeSecret=createHmac('sha256',stripe\u SIGNING\u SECRET).update(timestamp+'.+event.body).digest('hex');我看不到提取时间戳的代码。所以我必须相信你正确地解析了标题。event.body是您的路由作为Json字符串接收的完整未修改请求正文吗?你还确定它不是一个对象吗?是的,我甚至尝试过使用本机stripe API:stripe.webhooks.constructEvent(JSON.stringify(event.body)、signature、stripe\u SIGNING\u SECRET);但它也失败了:“没有找到与有效负载的预期签名匹配的签名。您是否正在传递从Stripe收到的原始请求正文?我已尝试使用下一个检查:Stripe.webhooks.constructEvent(request.body,sig,endpointSecret);但它也失败了,出现了错误:没有找到与Payloads预期签名匹配的签名。这几乎肯定是我在回答中描述的问题。然后,我建议检查这些链接。您需要首先获得准确的原始HTTP POST正文,因为这是验证签名的依据,这是第一步。它必须完全匹配您可以在Stripe仪表板上看到,包括空格和JSON键的顺序!我尝试了JSON.stringify(event.body),但结果是相同的
JSON.stringify(event.body)
是不正确的,而且永远不会起作用-正如错误消息所说,您需要根据上面的链接使用原始正文!以任何方式触摸它(比如像那样通过
strinfigy
运行它)将修改它。
const sig = request.headers['stripe-signature'];