在Stripe Checkout结账流程中如何将银行卡设为默认支付方式
实现Stripe Checkout提交银行卡自动设为默认支付方式的方案
你可以通过webhook监听Checkout完成事件的方式实现需求,具体操作步骤如下:
步骤1:调整Checkout Session创建参数
你不需要修改现有核心配置,只需新增setup_intent_data字段方便后续事件关联即可,修改后代码如下:
const session = await stripe.checkout.sessions.create({ payment_method_types: ['card'], mode: 'setup', customer: req.subscription.customerId, client_reference_id: email, metadata: {'plan': 'basic'}, billing_address_collection: 'required', success_url: req.protocol + '://' + req.get('host') + '/payment/middle?'+queryParams, cancel_url: req.protocol + '://' + req.get('host') + '/payment/failure', // 新增配置,用于后续事件关联 setup_intent_data: { metadata: { customer_id: req.subscription.customerId } } });
步骤2:监听Stripe webhook事件处理默认绑定
在你的服务端配置监听checkout.session.completed事件,事件触发后执行如下逻辑:
- 从事件返回的Session对象中取出关联的Setup Intent ID,查询对应的Setup Intent详情,获取用户刚提交的银行卡支付方式ID
- 调用客户更新接口,将该支付方式设置为对应客户的默认支付方式,示例代码如下:
// webhook事件处理逻辑示例 const event = request.body; if (event.type === 'checkout.session.completed') { const session = event.data.object; // 查询关联的Setup Intent详情 const setupIntent = await stripe.setupIntents.retrieve(session.setup_intent); const newPaymentMethodId = setupIntent.payment_method; const customerId = setupIntent.metadata.customer_id; // 更新客户默认支付方式 await stripe.customers.update(customerId, { invoice_settings: { default_payment_method: newPaymentMethodId } }); }
可选方案:成功回调页处理(可靠性较低)
如果不想配置webhook,也可以在用户跳转回success_url对应的页面时,通过URL参数携带的Session ID查询关联的支付方式,再执行上述更新操作。但该方式依赖用户完成支付后正常跳转,若用户中途关闭页面会导致逻辑不执行,因此不推荐作为主方案。
内容的提问来源于stack exchange,提问作者Rajan
相关产品推荐
相关产品推荐

