晚上,
当用户注册订阅时,会触发 checkout.session.completed 事件,我可以通过 CLI 命令测试一切是否正常工作:
stripe trigger checkout.session.completed --add checkout_session:customer="REPLACE WITH CUSTOMER ID"
。
我希望能够在特定客户未能付款并触发
invoice.payment_failed
事件时执行相同的测试。
我需要 event.data.object 中的电子邮件值来匹配数据库中的电子邮件地址,以便我可以检查状态值是否正确从“member”更改为“pastMember”。
我的直觉是我想要的命令类似于
stripe trigger invoice.payment_failed --add invoice:customer="REPLACE WITH CUSTOMER ID"
但不幸的是这不起作用。
编辑发票的固定装置也不起作用。更改客户 ID 没有任何效果,并且我无法将 customer_email 参数添加到 params 对象,尽管该字段作为定义的发票架构的一部分存在here
我已经尝试了我能想到的一切,但我无法理解条纹。我发现有关测试的文档绝对令人震惊。
export async function postWebhook(req: Request, res: Response) {
const event = req.body
const type = event.type
switch (type) {
// -- Working
case 'checkout.session.completed': {
const {customer_details, customer: customerId} = event.data.object
const {email} = customer_details
const user = await User.findOneAndUpdate({email}, {status: 'member', stripeId: customerId})
await instance.customers.update(customerId, {
metadata: {
mongoId: user?.id,
},
})
break
}
// -- Not working
case 'invoice.payment_failed': {
const email = event.data.object[???]
await User.findOneAndUpdate({email}, {status: 'pastMember'})
break
}
default:
break
}
res.sendStatus(200)
}
这里的复杂之处在于,您必须在此处使用
--override
来设置客户 ID(--add
只能用于添加参数,夹具中存在 not 已经,您需要 override
当固定装置已经将该参数设置为某个值,就像发票触发固定装置所做的那样)。
但是,它本身并不能开箱即用,因为固定装置将尝试附加并使用特定的 PaymentMethod,因此您最终必须尝试并覆盖许多事情。所以我真的会为此编写自己的装置。
编辑发票的固定装置也不起作用
这可行,但很难说如果不看到你所做的具体编辑。我就是这样做的。基本上编辑现有的装置,以便加载现有的客户,然后将其用于所有后续步骤。
custom_invoice_payment_failed.json
{
"name": "customer",
"path": "/v1/customers/${.env:CUSTOMER_ID|REMEMBER_TO_SET_CUSTOMER_ID}",
"method": "get"
},
ENV CUSTOMER_ID="cus_QX87JKPRilxAOU" stripe fixtures ./custom_invoice_payment_failed.json
并且它应该可以工作。