You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已实现用户到企业支付,如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 09:46:11