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。这可能是一个问题吗?谢谢
在 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 - 所以虽然我在这里发布了这个,但我没有将其标记为已接受的答案。
归档时间: |
|
查看次数: |
845 次 |
最近记录: |