Je construis un point de terminaison personnalisé sur Strapi. Pour ce point de terminaison, j'ai besoin du contenu du corps brut. Est-il possible de l'obtenir à partir de la variable ctx
?
stripe : async(ctx) => { // Handle the event const sig = ctx.request.headers['stripe-signature'] let 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 }
4 Réponses :
Je ne suis pas sûr de comprendre vos besoins.
ctx.request.body
contient le corps d'origine de votre requête.
Après cela, si vous voulez envoyer un événement comme corps de réponse, vous pouvez le faire comme ça.
ctx.body = événement;
Et un avertissement dans votre code. Vous avez écrit un const
pour événement
et vous attribuez un événement
avec le résultat de votre webhook strapi. Vous devez définir une variable let
.
Cela fonctionne en activant "includingUnparsed" dans la configuration de l'environnement de requête (config / environnements / development / request.json -> parser.includedUnparsed: true).
Vous pouvez accéder au corps non analysé en utilisant la fonction intégrée koa-body pour cela:
Certaines applications nécessitent une vérification crytopgraphique des corps de requête, par exemple les webhooks de slack ou stripe. Le corps non analysé est accessible si includeUnparsed est true dans les options de koa-body. Lorsqu'elle est activée, importez le symbole pour accéder au corps de la requête depuis unparsed = require ('koa-body / unparsed.js'), ou définissez votre propre accesseur en utilisant unparsed = Symbol.for ('unparsedBody'). Ensuite, le corps non analysé est disponible en utilisant ctx.request.body [non analysé].
Documentation koa-body < / p>
Le paquet officiel koa-bodyparser
le fait en fait tout de suite. Voir: https://github.com/koajs/bodyparser#raw-body Voici un petit exemple:
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}`); });
Veuillez ajouter quelques extraits de code expliquant comment le package peut aider à résoudre la question du PO stackoverflow.com/help/how-to-answer
@SuitBoyApps Ajout d'un exemple ci-dessus ^
Créez un middleware ( /config/middleware.js ) et mettez-le à jour vers le
const unparsed = require("koa-body/unparsed.js"); const unparsedBody = ctx.request.body[unparsed];
suivant
Dans le contrôleur (/ api /
module.exports = { settings: { cors: { enabled: true, }, parser: { enabled: true, multipart: true, includeUnparsed: true, }, }, };