next.js Stripe webhook不执行回调,还是我错过了什么

vc6uscn9  于 2023-05-17  发布在  其他
关注(0)|答案(1)|浏览(161)

我在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')时,它开始工作了。

jvidinwx

jvidinwx1#

你必须在生产环境中注册你的应用。你应该已经运行了这个命令来进行开发。

// installed stripe cli 
 // api/webhook your enpoint
stripe listen --events checkout.session.completed --forward-to localhost:3000/api/webhook

同样,您应该注册您的生产端点。
你可以关注webhooks/go-live docs

相关问题