如何获取 Azure Functions (Typescript) HttpRequest 原始正文作为字符串(用于 Stripe Web 挂钩验证)

问题描述 投票:0回答:1

我正在尝试验证 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 进行验证?如果是这样,您能分享一下您的代码示例吗?

typescript azure function stripe-payments
1个回答
0
投票

好的,编码的第一条规则是在 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!`);
    }

现在我要跳一支快乐的舞蹈!

© www.soinside.com 2019 - 2024. All rights reserved.