同一网站配置两个Stripe Webhooks的实现方案咨询
同一网站实现两类服务的Stripe Webhook区分方案
不需要创建多个Stripe账户,单个账户就能实现你的需求,具体方案如下:
核心实现思路
通过事件类型+产品/元数据标记的组合,在单个Stripe账户内区分两类服务的事件,再分流到对应的Webhook处理逻辑。
1. 基于产品ID的事件分流
- 先在Stripe后台为VIP会员订阅、网站代币分别创建独立的
Product和Price资源,记录好它们的ID(比如prod_VIPxxxx和prod_Tokenxxxx)。 - 在Stripe Webhook配置中,订阅所有相关事件:VIP订阅对应
customer.subscription.created/customer.subscription.updated,代币购买对应checkout.session.completed/charge.succeeded。 - 接收Webhook事件时,从事件对象中提取关联的产品ID:
- 订阅事件:从
event.data.object.items.data[0].price.product获取绑定的产品ID - 结账会话事件:从
event.data.object.line_items.data[0].price.product获取产品ID
- 订阅事件:从
- 根据产品ID判断服务类型,将请求转发到Webhook 1(VIP)或Webhook 2(代币)的处理逻辑。
2. 自定义元数据标记分流
- 创建订阅或结账会话时,给对象添加自定义元数据,示例代码:
// 创建VIP订阅时添加元数据 const subscription = await stripe.subscriptions.create({ customer: 'cus_xxxx', items: [{price: 'price_VIPxxxx'}], metadata: { service_type: 'vip_subscription' } }); // 创建代币购买结账会话时添加元数据 const session = await stripe.checkout.sessions.create({ payment_method_types: ['card'], line_items: [{price: 'price_Tokenxxxx', quantity: 1}], mode: 'payment', success_url: 'https://your-site.com/success', cancel_url: 'https://your-site.com/cancel', metadata: { service_type: 'token_purchase' } }); - 接收Webhook事件时,直接读取
event.data.object.metadata.service_type字段,根据值触发对应的Webhook处理流程。
3. 多Webhook端点配置(可选)
如果需要完全独立的两个Webhook端点,可在Stripe后台针对不同事件+产品配置过滤规则:
- 为Webhook 1配置:触发事件为
customer.subscription.created/customer.subscription.updated,添加产品ID过滤条件(仅关联VIP产品ID时触发)。 - 为Webhook 2配置:触发事件为
checkout.session.completed/charge.succeeded,添加产品ID过滤条件(仅关联代币产品ID时触发)。
注意事项
- 所有Webhook端点必须验证Stripe的签名,防止伪造请求,可使用官方SDK的
stripe.webhooks.constructEvent方法完成验证。 - 推荐使用Stripe CLI模拟不同类型的事件,测试分流逻辑是否正常工作。
内容的提问来源于stack exchange,提问作者Maxitrol
相关产品推荐
相关产品推荐

