Stripe Webhook场景下,如何将Stripe客户关联至内部客户?
解决Stripe Customer与内部客户的关联问题
以下是几种实用方案,帮你把Stripe Customer对象和内部客户关联起来:
方案1:优先使用checkout.session.completed事件
这是最直接高效的方式。当客户完成订阅支付后,Stripe会发送checkout.session.completed事件,该事件包含:
- 创建会话时设置的
metadata和client_reference_id - 关联的
customerID - 订阅相关的完整信息
你可以直接从这个事件里提取内部客户标识(比如client_reference_id存储的内部用户ID),再和Stripe Customer ID绑定存入数据库。
方案2:给Customer对象本身设置Metadata
如果必须依赖customer.created事件,在创建Checkout会话时,不要仅给Session添加metadata,而是给要创建的Customer对象也配置metadata。示例代码如下:
const session = await stripe.checkout.sessions.create({ payment_method_types: ['card'], line_items: [{ /* 你的订阅商品信息 */ }], mode: 'subscription', // 给Session设置的参数 metadata: { internal_order_id: '12345' }, client_reference_id: 'your_internal_user_id_67890', // 给新建的Customer设置Metadata customer: { metadata: { internal_user_id: 'your_internal_user_id_67890' } } });
这样customer.created事件返回的Customer对象里就会包含你设置的metadata,直接用其中的标识关联内部客户即可。
方案3:通过Customer ID反向查询关联的Checkout会话
如果以上两种方式都不适用,你可以拿到customer.created事件里的Customer ID,调用Stripe API查询关联的Checkout会话:
const sessions = await stripe.checkout.sessions.list({ customer: 'cus_xxxxxx', // 从customer.created事件里获取的Customer ID limit: 1 // 通常取最新的一个会话即可 });
查询结果会包含该会话的metadata和client_reference_id,进而关联到你的内部客户。不过这个方法需要额外的API调用,效率稍低,建议优先采用前两种方案。
内容的提问来源于stack exchange,提问作者Mahdi
相关产品推荐
相关产品推荐

