我正在尝试验证 Typescript v4 Azure Function App 中的 Stripe Web 挂钩调用。
我成功接收了来自 Stripe 的调用,并带有标头中的签名,但我不知道如何从 HttpRequest 对象中获取未修改的正文。我得到的错误是:
[Error] ⚠️ Webhook signature verification failed. No signatures found matching the expected signature for payload. Are you passing the raw request body you received from Stripe?
If a webhook request is being forwarded by a third-party tool, ensure that the exact request body, including JSON formatting and new line style, is preserved.
我尝试解析 body.json,并使用像
raw-body
这样的包(它只会使函数崩溃,没有错误),并将 req.body.toString()
ReadableStream 馈送到 Buffer 中,但没有成功(请参阅下面的示例)。
这不起作用:
const requestBody: any = await request.json();
const requestBodyString = JSON.stringify(requestBody);
这不起作用:
var getRawBody = require('raw-body')
const rawBodyBuffer: any = await request.body.toString();
const requestBodyString = getRawBody(rawBodyBuffer);
这不起作用:
const requestBodyString = request.text();
是否有人成功捕获 Azure 函数(Typescript)的原始主体并使用签名通过 Stripe 进行验证?如果是这样,您能分享一下您的代码示例吗?
好的,编码的第一条规则是在 SO 中发布你的问题。保证您将在一小时内解决自己的问题!
所以我将
request.text()
放入变量中,但这不起作用。但有效的方法是将 request.text()
直接传递到对 stipe.webhooks.constructEvent()
的调用中,如下所示:
// Only verify the event if you have an endpoint secret defined.
if (webhookState?.secret) {
try {
event = stripe.webhooks.constructEvent(
await request.text(),
signature,
webhookState?.secret
);
} catch (err) {
Log.error(`⚠️ A1 Webhook signature verification failed.`, err.message);
return {
status: 400,
};
}
Log.error(`✳️ Webhook signature verification succeeded!`);
}
现在我要跳一支快乐的舞蹈!