已实现用户到企业支付,如何在Node.js中用Stripe做企业向供应商延迟付款
在Node.js中基于Stripe实现企业向供应商付款的方案
一、供应商需要提供的信息
- 基础身份信息:
- 个人供应商:姓名、身份证号、联系邮箱、居住地址
- 企业供应商:企业名称、营业执照号、税务登记号、联系人信息、企业注册地址
- 收款账户信息:
- 银行账户详情(根据所在地区):如美国的Routing Number+银行账号,欧盟的IBAN,国内的开户行名称、账号、联行号等
- 可选:若使用Stripe Express账户,供应商只需完成Stripe开户流程,无需直接提供银行信息(由Stripe收集)
- 合规验证信息:
- 个人身份证明文件(如身份证、护照扫描件)
- 企业供应商需提供营业执照、授权委托书(若经办人不是法人)
二、Node.js实现步骤(基于Stripe Connect)
Stripe Connect是实现第三方转账的标准方案,核心是为供应商创建Stripe账户,再从你的企业账户向该账户转账。
1. 准备工作
- 安装Stripe SDK:
npm install stripe - 在Stripe后台启用Connect功能,获取你的Secret Key和Connect Webhook Secret
2. 创建供应商的Stripe账户
推荐使用Express账户(Stripe托管开户流程,自动处理KYC),无需你收集敏感信息:
const stripe = require('stripe')('你的Stripe Secret Key'); async function generateSupplierOnboardingLink() { // 创建Express账户 const account = await stripe.accounts.create({ type: 'express', email: '供应商邮箱', }); // 生成开户链接,供应商访问后完成信息填写 const accountLink = await stripe.accountLinks.create({ account: account.id, refresh_url: 'https://你的域名/refresh-onboarding', // 开户中断后的跳转地址 return_url: 'https://你的域名/onboarding-success', // 开户完成后的跳转地址 type: 'account_onboarding', }); return accountLink.url; // 将此链接发给供应商完成开户 }
如果需要完全自定义开户流程,可使用Custom账户(自行收集所有信息并提交给Stripe):
async function createCustomSupplierAccount(supplierData) { const account = await stripe.accounts.create({ type: 'custom', country: supplierData.country, email: supplierData.email, business_type: supplierData.businessType, // 'individual' 或 'company' // 个人供应商信息 individual: supplierData.businessType === 'individual' ? { first_name: supplierData.firstName, last_name: supplierData.lastName, id_number: supplierData.idNumber, address: { line1: supplierData.addressLine1, city: supplierData.city, postal_code: supplierData.postalCode, country: supplierData.country, }, } : undefined, // 企业供应商信息 company: supplierData.businessType === 'company' ? { name: supplierData.companyName, tax_id: supplierData.taxId, address: { line1: supplierData.addressLine1, city: supplierData.city, postal_code: supplierData.postalCode, country: supplierData.country, }, } : undefined, // 添加银行账户 external_account: { object: 'bank_account', country: supplierData.country, currency: 'usd', // 根据业务调整币种 routing_number: supplierData.routingNumber, account_number: supplierData.accountNumber, }, }); return account.id; // 保存此账户ID用于后续转账 }
3. 发起向供应商的转账
在用户付款到账1天后,执行转账操作(注意Stripe以分为金额单位):
async function transferFundsToSupplier(supplierStripeAccountId, amountInDollars) { try { const transfer = await stripe.transfers.create({ amount: amountInDollars * 100, // 转换为分 currency: 'usd', destination: supplierStripeAccountId, transfer_group: '关联的订单ID', // 可选,用于关联转账与具体订单 }); // 记录转账ID到你的数据库 console.log(`转账发起成功,ID: ${transfer.id}`); return transfer; } catch (error) { console.error(`转账失败: ${error.message}`); throw error; } }
4. 处理转账状态通知(Webhook)
通过Stripe Webhook监听转账的成功/失败事件,更新业务状态:
const express = require('express'); const app = express(); // 解析Stripe Webhook的原始请求体 app.post('/stripe-webhook', express.raw({ type: 'application/json' }), async (req, res) => { const sig = req.headers['stripe-signature']; const webhookSecret = '你的Connect Webhook Secret'; let event; try { event = stripe.webhooks.constructEvent(req.body, sig, webhookSecret); } catch (err) { return res.status(400).send(`Webhook验证失败: ${err.message}`); } // 处理转账成功事件 if (event.type === 'transfer.succeeded') { const transfer = event.data.object; // 在这里更新你的数据库,标记对应订单的供应商付款完成 console.log(`转账成功,ID: ${transfer.id},金额: ${transfer.amount / 100} ${transfer.currency}`); } // 处理转账失败事件 if (event.type === 'transfer.failed') { const transfer = event.data.object; // 处理失败逻辑:比如重试转账、通知供应商或运营人员 console.log(`转账失败,ID: ${transfer.id},原因: ${transfer.failure_message}`); } res.json({ received: true }); }); app.listen(3000, () => console.log('Webhook服务启动在3000端口'));
三、关键注意事项
- 资金可用性:用户付款到你的Stripe账户后,存在结算周期(通常1-2天),需确保账户余额充足再发起转账
- KYC审核:Stripe会对供应商账户进行合规审核,需提醒供应商提供准确信息,否则可能无法收款
- 转账费用:Stripe Connect会收取转账手续费(如美国境内转账0.25% + 0.30美元/笔),需确认费用结构
- 到账时间:转账到供应商银行账户的时间因地区而异,美国通常1-2工作日,欧盟SEPA为1-3工作日
内容的提问来源于stack exchange,提问作者sunil suthar
相关产品推荐
相关产品推荐

