Stripe Connect Node.js实现支付延迟到账功能技术问询
解决方案:为Stripe Connect收款添加订单完成后的延迟转账
要实现管理员完成订单后再收款的需求,你需要调整当前支付流程,放弃创建支付会话时的自动即时转账,改为先将资金留存到平台账户,待订单确认完成后手动发起转账。具体步骤如下:
1. 修改Checkout Session创建逻辑,取消自动转账
移除payment_intent_data中的transfer_data配置,用户支付的资金会先留在你的平台Stripe账户中,平台手续费仍会正常扣除:
const session = await stripe.checkout.sessions.create({ mode: 'payment', line_items: [ { price_data: { unit_amount: doc.milestones[0].price * 100, currency: 'cad', product_data: { name: 'Milestone ' + doc.milestones[0].milestone + ': ' + doc.milestones[0].milestone_name, description: doc.milestones[0].milestone_desc }, }, quantity: 1, }, ], payment_intent_data: { application_fee_amount: (doc.milestones[0].price * 100) * 0.05, // 移除transfer_data,避免自动向管理员转账 }, customer_email: doc.client, success_url: 'http://localhost:3001/success', cancel_url: 'http://localhost:3001/cancel', }); req.session.payment_session_id = session.id req.session.project_id = doc.project_id // 额外保存Payment Intent ID,后续转账需用到 req.session.payment_intent_id = session.payment_intent res.redirect(session.url)
2. 订单完成后手动发起转账
当确认管理员已完成订单(比如用户确认验收、平台审核通过),调用Stripe Transfers API将扣除手续费后的资金转到管理员的Connect账户:
// 示例:在订单完成的接口中执行转账逻辑 const paymentIntent = await stripe.paymentIntents.retrieve(req.session.payment_intent_id); // 计算实际转账金额:用户支付总金额 - 平台已扣手续费 const transferAmount = paymentIntent.amount - paymentIntent.application_fee_amount; const transfer = await stripe.transfers.create({ amount: transferAmount, currency: 'cad', destination: doc.connect_account_id, // 管理员绑定的Connect账户ID });
关于delay_days无效的说明
你之前尝试的delay_days参数仅适用于Stripe Connect的自动转账计划(比如设置按天/周自动结算),无法在创建支付会话时的即时转账场景中生效。如果业务不需要人工确认,仅需固定天数延迟,可在Connect账户设置中开启自动转账并配置延迟天数,但这种方式灵活性远不如手动触发,更适合无需订单确认的场景。
内容的提问来源于stack exchange,提问作者bobthebuilder
相关产品推荐
相关产品推荐

