我在Next.js中有一个Strapi & Stripe项目。有一个webhook在成功支付后执行,之后,它应该运行markProductAsSold
回调,它只在本地主机上运行。同样,如果我只运行回调(idk. on按钮单击页面上的某个地方)它在舞台和本地主机上工作!
Webhook代码:
export const config = {
api: {
bodyParser: false,
},
};
export default async function webhookHandler(req, res) {
const stripe = new Stripe(process.env.NEXT_PUBLIC_STRIPE_SECRET, {
apiVersion: '2022-11-15',
});
if (req.method === 'POST') {
const buf = await buffer(req);
const sig = req.headers['stripe-signature'];
const webhookSecret = process.env.NEXT_PUBLIC_STRAPI_WEBHOOK_KEY;
let event;
try {
if (!sig || !webhookSecret) return;
event = stripe.webhooks.constructEvent(buf, sig, webhookSecret);
} catch (error) {
return res.status(400).send(`Webhook error: ${error.message}`);
}
if (event.data.object.status === 'succeeded') {
await markProductAsSold(event.data.object.metadata.MarkAsSold);
}
}
res.status(200).send();
}
回调码
const markProductAsSold = async (slug: string) => {
const findProduct = await fetch(
`${process.env.NEXT_PUBLIC_DATABASE_URL}/api/products?filters[slug][$eq]=${slug}`
);
const data = await findProduct.json();
const isSold = data.data[0].attributes.isSold;
const productData = {
...data.data[0]
};
productData.attributes.isSold = !isSold;
await fetch(
`${process.env.NEXT_PUBLIC_DATABASE_URL}/api/products/${productData.id}`, {
method: 'PUT',
headers: {
Authorization: `Bearer ${process.env.NEXT_PUBLIC_STRAPI_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
data: productData.attributes,
}),
}
);
return productData;
};
export default markProductAsSold;
所有数据,如metadata.MarkAsSold
或env的是100%有效的,并经过三次检查。我只是不知道哪里可能是一个问题,因为回调不工作,只有在舞台上被解雇的条纹webhook。
已解决
事实证明,在Stripe触发了一切之后,我的回调并没有运行。Idk.为什么,但是当我把markProductAsSold
函数直接移到if (event.data.object.status === 'succeeded')
时,它开始工作了。
1条答案
按热度按时间jvidinwx1#
你必须在生产环境中注册你的应用。你应该已经运行了这个命令来进行开发。
同样,您应该注册您的生产端点。
你可以关注webhooks/go-live docs