当付款成功时,我试图使用 stripe 来控制台一条消息,因为我正在使用 webhooks。
const stripe = require('stripe')('sk_test_'); // Replace with your actual key
const handleWebhook = async (req, res) => {
let event;
try {
const sig = req.headers['stripe-signature'];
// Use req.body directly since it's raw
event = stripe.webhooks.constructEvent(req.body, sig, 'whsec_code');
} catch (err) {
console.error(`Webhook Error: ${err.message}`);
return res.status(400).send(`Webhook Error: ${err.message}`);
}
console.log(event.type);
switch (event.type) {
case 'checkout.session.completed':
const session = event.data.object;
console.log('Checkout session completed:', session.id);
if (session.payment_status === 'paid') { alert("hii")
console.log('PaymentIntent was successful!');
const updatedValues = JSON.parse(session.metadata.updatedValues);
console.log("updatedValues is", updatedValues);
}
break;
并且 session. payment_status === 'paid' 我需要测试 webhook 是否正常工作。所以我只是提醒一条消息。但我得到了
Webhook 错误:Webhook 负载必须以字符串或 Buffer (https://nodejs.org/api/buffer.html) 实例代表 raw 请求正文。Payload 作为已解析的 JavaScript 对象提供。 如果没有访问权限,则无法进行签名验证 原始签名材料。
我的app.js
gsrApp.use((req, res, next) => {
console.log(`Incoming request size: ${JSON.stringify(req.body).length} bytes`);
next();
});
我有路由器
routerV2.post('/webhook', express.raw({ type: 'application/json' }), handleWebhook);
提前致谢
这是一个常见错误,您的 Web 框架可能意外(或无意)干扰了 Stripe 发送的请求正文。根据经验,Stripe SDK 期望来自传入 HTTP 请求的准确的原始正文。
值得遵循确切的 Stripe 示例代码,或者查看 此 Github 问题以获取 Node 上的 webhook 。常见的问题是注意
bodyParser
或使用 rawBody
。另外,如果您使用 AWS lambda,您可能需要一些身体映射模板。