如何用Stripe CLI触发指定客户的invoice.payment_failed事件并获取邮箱
解决Stripe invoice.payment_failed事件测试与Webhook处理问题
一、测试指定客户的invoice.payment_failed事件
直接用--add invoice:customer参数无法生效,因为Stripe Trigger生成invoice时依赖关联的订阅对象,customer字段会从订阅继承,不能直接修改。正确做法如下:
先创建指定客户的测试订阅
用Stripe CLI创建一个关联目标客户的测试订阅:stripe subscriptions create --customer="YOUR_CUSTOMER_ID" --price="YOUR_TEST_PRICE_ID"替换
YOUR_CUSTOMER_ID为你的目标客户ID,YOUR_TEST_PRICE_ID为测试用的价格ID(可在Stripe后台创建测试价格)。触发关联该订阅的支付失败事件
用刚创建的订阅ID触发事件,生成的invoice会自动关联目标客户:stripe trigger invoice.payment_failed --add invoice:subscription="YOUR_SUBSCRIPTION_ID"Fixture修改方案
若要通过Fixture调整,需修改invoice fixture中的subscription字段为目标订阅ID,而非直接修改customer字段。Stripe Trigger会基于订阅自动填充对应customer信息。
二、从invoice.payment_failed事件中获取用户信息并更新状态
invoice.payment_failed事件的Invoice对象没有customer_details字段,但有两种可靠方式获取用户信息:
方式1:直接使用Invoice对象的customer_email字段
Invoice对象本身包含customer_email字段(若发票来自Checkout流程),可直接提取使用:
case 'invoice.payment_failed': { const { customer_email } = event.data.object; await User.findOneAndUpdate({ email: customer_email }, { status: 'pastMember' }); break; }
方式2:通过客户ID关联元数据(更可靠)
在checkout.session.completed中你已给Stripe客户添加mongoId元数据,直接通过客户ID查询元数据定位用户,避免邮箱变更导致匹配失败:
case 'invoice.payment_failed': { const { customer: customerId } = event.data.object; // 检索Stripe客户信息 const customer = await instance.customers.retrieve(customerId); const mongoId = customer.metadata.mongoId; if (mongoId) { await User.findByIdAndUpdate(mongoId, { status: 'pastMember' }); } break; }
注意:确保instance是已正确初始化的Stripe客户端实例,且服务器具备检索客户信息的权限。
内容的提问来源于stack exchange,提问作者Alex Mckay
相关产品推荐
相关产品推荐

