我正在Strapi上构建自定义端点。对于此端点,我需要具有原始内容。是否可以从ctx
变量中获取它?
stripe : async(ctx) => {
// Handle the event
const sig = ctx.request.headers['stripe-signature']
const event = null
try {
// ctx.request.body needs to be the original raw body
event = stripe.webhooks.constructEvent(ctx.request.body,sig, endpointSecret)
}catch (e) {
ctx.badRequest(null,e)
return
}
答案 0 :(得分:1)
创建一个中间件( /config/middleware.js )并将其更新为以下版本
module.exports = {
settings: {
cors: {
enabled: true,
},
parser: {
enabled: true,
multipart: true,
includeUnparsed: true,
},
},
};
在控制器中(/api/
const unparsed = require("koa-body/unparsed.js");
const unparsedBody = ctx.request.body[unparsed];
答案 1 :(得分:0)
我不确定您的需求。
ctx.request.body
包含您请求的原始正文。
之后,如果要发送事件作为响应正文,则可以这样进行。
ctx.body = event;
以及代码中的警告。您为const
编写了一个event
定义,并为您分配了event
您的bandi webhook结果。您必须定义一个let
变量。
答案 2 :(得分:0)
它实际上是通过在请求环境配置(config / environments / development / request.json-> parser.includedUnparsed:true)中打开“ includesUnparsed”来工作的。
您可以使用koa-body内置功能来访问未解析的身体:
某些应用程序需要对请求主体进行低温图形验证,例如,来自松弛或条带的webhook。如果koa-body选项中的includeUnparsed为true,则可以访问未分析的主体。启用后,从unparsed = require('koa-body / unparsed.js')导入用于访问请求正文的符号,或使用unparsed = Symbol.for('unparsedBody')定义自己的访问器。然后,可以使用ctx.request.body [unparsed]获得未解析的正文。
答案 3 :(得分:0)
官方koa-bodyparser
软件包实际上是开箱即用的。参见:https://github.com/koajs/bodyparser#raw-body
这是一个小例子:
import Koa from 'koa';
import KoaRouter from '@koa/router';
import koaBodyParser from 'koa-bodyparser';
const app = new Koa();
const router = new KoaRouter();
const stripeCheckout = (ctx, next) => {
const sig = ctx.request.header['stripe-signature'];
let event;
if (!process.env.STRIPE_ENDPOINT_SECRET) {
throw new Error('Missing Stripe endpoint secret.');
}
try {
event = stripe.webhooks.constructEvent(
ctx.request.rawBody,
sig,
endpointSecret: process.env.STRIPE_ENDPOINT_SECRET
);
} catch (err) {
logger('error', err);
ctx.status = 400;
ctx.body = `Webhook Error: ${err.message}`;
return next();
}
// ... do something with the event
if (event.type === 'checkout.session.completed') {
const session = event.data.object;
// ... do something with the checkout session
}
// return a response to acknowledge receipt of the event
ctx.status = 200;
ctx.body = { received: true };
return next();
};
// POST
router.post('/stripe-checkout', stripeCheckout);
app.use(koaBodyParser());
app.use(router.routes());
app.use(router.allowedMethods());
app.listen(port, () => {
logger('log', `✅ Done! Server is listening on http://localhost:${port}`);
});