在 Strapi 中,我试图从 Stripe 获取支付事件,我在一个名为“Order”的集合中创建了一个 Webhook,该 Webhook 似乎可以工作,因为它确实能够获取事件,因为它确实使用控制台打印信息。记录但我总是收到以下错误:未提供条带签名标头值。 我已经创建并配置了帐户,Stripe 无需 Webhook 即可接受付款。但是,我想实现 webhook,因此我使用带有 Stripe CLI 的终端在本地运行测试。
首先,我运行以下命令:
stripe 监听 --forward-to http://localhost:1337/api/orders/stripe-webhook
这会生成一个密钥并显示消息:
“准备好了!您正在使用 Stripe API 版本 [2024-11-20]。您的 Webhook 签名密钥是 whsec_69b...”。
我在环境变量 STRIPE_WEBHOOK_SECRET 中设置了此密钥(whsec_69b ...)。
然后,我使用以下命令来模拟事件(也称为触发器): 条纹触发 payment_intent.succeeded.
Webhook 正确接收事件,但是在验证 Webhook 时,我收到一个似乎无法解决的错误。
async handleWebhook(ctx) {
const body = JSON.stringify(ctx.request.body);
const endpointSecret = process.env.STRIPE_WEBHOOK_SECRET;
const signature = ctx.request.headers['stripe-signature']
console.log(body);
console.log(signature);
console.log(endpointSecret);
try {
// Asegúrate de pasar el cuerpo como Buffer o String crudo
const event = stripe.webhooks.constructEvent(body, signature, endpointSecret);
// Procesar el evento
if (event.type === 'payment_intent.succeeded') {
const paymentIntent = event.data.object;
console.log('Pago exitoso:', paymentIntent);
}
// Responde con 200 OK
ctx.status = 200;
ctx.body = 'Webhook recibido correctamente';
} catch (err) {
// Error en la verificación de la firma
console.error('Error al procesar el webhook:', err.message);
ctx.status = 400;
ctx.body = `Error del webhook: ${err.message}`;
}
},
这是route/order.js
'use strict';
/**
* order router
*/
module.exports = {
routes: [
{
method: 'POST',
path: '/orders', // Ruta para crear pedidos
handler: 'order.create',
config: {
policies: [],
},
},
{
method: 'PUT',
path: '/orders/:id', // Ruta para actualizar pedidos
handler: 'order.update', // Usa el controlador predeterminado para actualizar
config: {
policies: [], // Puedes agregar políticas de autorización aquí
},
},
{
method: 'POST',
path: '/orders/:id/update-stripe', // Ruta personalizada para actualizar stripeId
handler: 'order.updateStripeId', // Necesitas definir este controlador
config: {
policies: [], // Agrega restricciones si es necesario
},
},
{
method: 'POST',
path: '/orders/stripe-webhook',
handler: 'order.handleWebhook',
config: {
auth: false,
},
},
],
};
I have tried to put this code like this:
> const body = ctx.request.body
but it does not solve it