Node.js 条带验证web钩子签名HMAC sha254 HAPI.js

Node.js 条带验证web钩子签名HMAC sha254 HAPI.js,node.js,stripe-payments,hapijs,cryptojs,ngrok,Node.js,Stripe Payments,Hapijs,Cryptojs,Ngrok,我正在尝试验证我的hapi.js应用程序中stripe发送的webhook。 我已按照此处详述的说明进行操作: (我显然没有在这里发布我的端点机密:) const enpointSecret=#########; const sig=u.fromPairs(request.headers[“stripe signature”].split(',')) .map(s=>s.split('=')); //生成对象,例如{t:'1111',v1:'111111..',v0:''.'''}等 con

我正在尝试验证我的hapi.js应用程序中stripe发送的webhook。 我已按照此处详述的说明进行操作:

(我显然没有在这里发布我的端点机密:)


const enpointSecret=#########;
const sig=u.fromPairs(request.headers[“stripe signature”].split(','))
.map(s=>s.split('='));
//生成对象,例如{t:'1111',v1:'111111..',v0:''.'''}等
const signed_payload=`${sig.t}.${JSON.stringify(request.payload)}`;
const hmac=crypto.createHmac('sha256',endpointSecret)
.更新(签名的_有效载荷)
.摘要(“十六进制”);
生成的hmac与标头(sig.v1)中的签名不匹配。我不知道我做错了什么

我正在本地开发——并使用ngrok,以便测试我的Webhook。这可能是个问题吗?感谢Hapi 17中的, 在Hapi 17中,您必须阻止解析主体。我在房子周围跳舞,设置有效载荷配置的输出。。。但你不需要这样做。简单地将payload.parse设置为false

<!-- language: lang-js -->

    module.exports = {
        method: 'POST',
        path: '/api/webhook',
        config: {
            auth: false,
            payload: {
             parse: false // the important bit
            },
        handler: async (request, h) => {

module.exports={
方法:“POST”,
路径:'/api/webhook',
配置:{
作者:错,
有效载荷:{
parse:false//重要位
},
处理程序:异步(请求,h)=>{
然后我就可以使用内置的stripe方法了

<!-- language: lang-js -->

    try {
       let event = stripe.webhooks.constructEvent( request.payload.toString(), request.headers["stripe-signature"], endpointSecret);
            console.log(event);
    }
    catch (err) {
       console.log(err)
    }

试一试{
让event=stripe.webhooks.constructEvent(request.payload.toString(),request.headers[“stripe signature”],endpointSecret);
console.log(事件);
}
捕捉(错误){
console.log(错误)
}

真正的功劳应该归于卡尔·里德——因此,虽然我在这里发布了这篇文章,但我没有将其标记为已接受的答案。

JSON。stringify
将变异请求正文。您需要在从Stripe收到的原始请求正文上生成MAC,否则签名将不匹配。另外,为什么不直接使用它呢?更多信息谢谢。我尝试了stripe节点-但它不适用于此…尝试找出如何在hapi中获取原始有效负载…设置options.payload.parse=false没有任何作用…不用担心,您应该接受这一点,因为它向人们展示了如何以stripe要求使用hapi的格式获取请求正文。Will do-谢谢。我必须再等15个小时这将允许我。
<!-- language: lang-js -->

    try {
       let event = stripe.webhooks.constructEvent( request.payload.toString(), request.headers["stripe-signature"], endpointSecret);
            console.log(event);
    }
    catch (err) {
       console.log(err)
    }