条纹验证网络钩子签名 HMAC sha254 HAPI.js

Rob*_*Rob 2 node.js stripe-payments cryptojs ngrok hapijs

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

https://stripe.com/docs/webhooks/signatures

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

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

const enpointSecret = ######;

const sig = _.fromPairs(request.headers["stripe-signature"].split(',')
.map(s => s.split('=')));
// produces object eg { t: '1111', v1: '111111..', v0: '...'} etc


const signed_payload = `${sig.t}.${JSON.stringify(request.payload)}`;

const hmac = crypto.createHmac('sha256', endpointSecret)
.update(signed_payload)
.digest('hex');
Run Code Online (Sandbox Code Playgroud)

生成的 hmac 与标头 (sig.v1) 中的签名不匹配。我无法弄清楚我做错了什么......

我正在本地开发 - 并使用 ngrok,以便我可以测试我的 webhooks。这可能是一个问题吗?谢谢

Rob*_*Rob 9

在 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) => {
Run Code Online (Sandbox Code Playgroud)

然后我就可以使用内置的条带方法

<!-- 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)
    }
Run Code Online (Sandbox Code Playgroud)

真正的功劳应该归功于 Karl Reid - 所以虽然我在这里发布了这个,但我没有将其标记为已接受的答案。

  • 不用担心,您应该接受这一点,因为它向人们展示了如何使用 hapi 以 Stripe 要求的格式获取请求正文。 (2认同)