我正在使用 Stripe Checkout。用户付款后,我需要将他的付款信息保存在我的数据库中。为此,我使用 Stripe 的 webhook。
由于我无法在测试模式下使用 webhook,因此我必须安装 Stripe CLI。问题是我无法在有效负载中发送客户电子邮件。因此,在开发过程中我无法将用户付款信息保存在数据库中。
我使用的cli命令是:
stripe trigger invoice.payment_succeeded
webhook 调用的服务器路由如下所示:
const buy = async (req: Request, res: IResponse): Promise<IResponse> => {
try {
const signature = req.headers["stripe-signature"];
const event = stripe.webhooks.constructEvent(
req.rawBody,
signature,
process.env.STRIPE_WEBHOOK_SECRET
);
if (event.type === "payment_intent.succeeded") {
const { id, amount_paid, customer_email } = event.data.object as Invoice;
const serialNumber = await PaymentControler.generateUniqueSerialNumber();
await PaymentControler.updateUserMembership(
customer_email,
id,
amount_paid,
serialNumber
);
return res.sendStatus(200);
}
res.status(500).send("Error processing payment");
} catch (err) {
return res.status(500).send("Error processing payment");
}
};
以下是客户端向 Stripe Checkout 发送请求的方式:
const checkoutOptions: RedirectToCheckoutOptions = {
lineItems: [
{
price: process.env.STRIPE_APP_PRICE,
quantity: 1,
},
],
mode: "payment",
successUrl: `${location}?success=true&invoiceID={CHECKOUT_SESSION_ID}`,
cancelUrl: `${location}?success=false`,
submitType: "pay",
customerEmail: user?.email,
};
如何从 Stripe CLI 发送客户电子邮件?
另外,您能否向我确认我是否正确访问了
id
中的属性:amount_paid
、customer_email
和 event.data.object
(它们现在不存在,所以我想确保生产中就可以了)?
invoice.payment_succeeded
事件与结帐本身没有任何关系。您可能想要触发的事件是 checkout.session.completed
并使用 --add
标志来自定义客户电子邮件参数
例如:
stripe trigger checkout.session.completed --add checkout_session:customer_email="[email protected]"
这应该允许您测试您的代码并确保它按预期工作。
该标志不会将电子邮件作为参数。但是,您可以进入 Stripe 仪表板并查看您要使用的电子邮件的
customerId
。复制该 id 并将其传递到您的标志中,如下所示:
stripe trigger checkout.session.completed --add checkout_session:customer="customerId"
这将成功触发事件。
这适用于生成客户对象的任何事件:
stripe trigger customer.subscription.created --add customer:email="[email protected]"