PAYATHON 2026

如何通过 payment gateway 定期向客户银行账户付款?

支付阿杰

明确结论

可以。你不必每月手写支票,也不一定要直接对接银行。适合这类业务的并非传统收款型 payment gateway,而是支持 Payouts、Disbursements、Mass Payments 或 Marketplace Payments 的支付服务。

这类服务通常通过 ACH、SEPA、Faster Payments 等银行清算网络,定期把资金转入客户的银行账户。具体能否使用,要看付款方和客户所在的国家、币种、业务模式以及合规审核结果。

常见方案有:

  • 支付平台的 payout API,如 Stripe Connect、Adyen for Platforms
  • 批量付款或跨境付款服务,如 Wise Platform
  • 银行提供的 ACH、批量转账或企业网银接口
  • 如果客户无法接收电子转账,再考虑使用支票

普通商户账户里的“提现”功能通常只能把收款结算到你自己的银行账户,不能用于向客户转账。向第三方付款时,必须使用支付平台明确支持的 payout 产品。

先判断你的业务属于哪种付款

选择服务前,先弄清楚这笔钱为什么要付给客户。

平台向卖家或服务提供者结算

电商平台、接单平台和内容创作者平台通常适合使用 marketplace 或 connected account 模式。支付平台会要求收款人完成身份认证,并负责或协助处理资金分账与结算。

企业向用户发放奖励、佣金或退款

如果付款并不对应某一笔订单,可能需要使用批量付款或 disbursement 产品。有些支付平台禁止将 payout API 用于奖金、借贷、投资收益或其他受监管业务,因此需要先核对服务条款。

工资、贷款、保险金或投资收益

这些付款通常有额外的监管要求,通用支付平台未必支持。你需要根据业务所在地,向银行、支付机构或合规顾问确认具体要求。

推荐的实现流程

一个可靠的定期付款系统通常按以下流程运行:

  1. 收集客户的银行账户信息。
  2. 使用支付服务商的托管页面或账户绑定组件完成验证。
  3. 完成 KYC/KYB、制裁名单筛查和必要的税务信息采集。
  4. 在系统中记录应付余额,不要在收到每笔收入后立即转出。
  5. 到结算日生成付款批次。
  6. 调用 payout API,并为每次请求设置唯一的幂等键。
  7. 通过 webhook 接收付款成功、失败或退回等异步结果。
  8. 重试失败的付款,或要求客户更新银行信息。
  9. 保存账务流水,定期与支付平台或银行对账。

不要在自己的数据库里直接保存完整的银行账号。如果服务商支持 token、recipient ID 或 connected account ID,只保存这些引用值。

代码示例

下面这个与服务商无关的 Node.js 示例展示了付款任务的基本结构。实际使用的 API 地址、字段和签名方式,应以所选服务商的官方文档为准。

import crypto from "node:crypto";

async function createPayout({
  customerId,
  recipientId,
  amountInMinorUnit,
  currency,
  settlementPeriod
}) {
  const idempotencyKey = crypto
    .createHash("sha256")
    .update(`${customerId}:${settlementPeriod}`)
    .digest("hex");

  const response = await fetch("https://api.example-payments.com/v1/payouts", {
    method: "POST",
    headers: {
      "Authorization": `Bearer ${process.env.PAYOUT_API_KEY}`,
      "Content-Type": "application/json",
      "Idempotency-Key": idempotencyKey
    },
    body: JSON.stringify({
      recipient_id: recipientId,
      amount: amountInMinorUnit,
      currency,
      reference: `settlement-${settlementPeriod}`
    })
  });

  if (!response.ok) {
    const error = await response.text();
    throw new Error(`Payout request failed: ${response.status} ${error}`);
  }

  return response.json();
}

金额最好按最小货币单位保存。例如,1050 表示 10.50 USD,这样可以避免使用浮点数计算金额。

定时任务只负责找出到期款项并创建付款。付款请求成功,不等于资金已经到达客户的银行账户:

async function processScheduledPayouts(settlementPeriod) {
  const payableAccounts = await db.accounts.findPayable(settlementPeriod);

  for (const account of payableAccounts) {
    try {
      const payout = await createPayout({
        customerId: account.customerId,
        recipientId: account.paymentRecipientId,
        amountInMinorUnit: account.payableAmount,
        currency: account.currency,
        settlementPeriod
      });

      await db.payouts.record({
        customerId: account.customerId,
        providerPayoutId: payout.id,
        amount: account.payableAmount,
        status: payout.status ?? "pending",
        settlementPeriod
      });
    } catch (error) {
      await db.payouts.recordFailure({
        customerId: account.customerId,
        settlementPeriod,
        message: error.message
      });
    }
  }
}

付款的最终状态应以 webhook 或后续查询结果为准:

app.post("/webhooks/payouts", verifyWebhookSignature, async (req, res) => {
  const event = req.body;

  switch (event.type) {
    case "payout.paid":
      await db.payouts.markPaid(event.data.id);
      break;

    case "payout.failed":
    case "payout.returned":
      await db.payouts.markFailed(
        event.data.id,
        event.data.failure_reason
      );
      break;
  }

  res.sendStatus(200);
});

Webhook 处理也要有幂等机制,因为同一个事件可能会被重复投递。

什么时候需要直接联系银行

如果每月付款量较大,客户主要集中在同一个国家,或者你已经有企业资金管理账户,可以向银行咨询以下服务:

  • ACH Credit 或当地批量转账
  • NACHA 文件上传
  • ISO 20022 文件或 API
  • 企业网银批量付款
  • SFTP Host-to-Host
  • 虚拟账户和自动对账服务

银行直连的单笔成本可能更低,但需要承担更多开发、文件处理、对账、失败重试和合规工作。付款量不大时,成熟的 payout 平台通常更省事。

上线前必须考虑的问题

资金来源与余额控制

Payout API 通常要求平台账户中有足够的可用余额,或者从已经验证的企业银行账户扣款。不要假设服务商会垫付资金。

到账不是实时结果

银行转账通常是异步完成的。API 返回 pending 或显示创建成功,只说明服务商接受了请求,不代表客户已经收到资金。账户关闭、信息错误或银行拒绝,都可能导致转账退回。

身份与银行账户验证

向第三方银行账户付款,通常需要验证收款人的身份和账户所有权。不要通过拆分金额或借用个人账户等方式绕过审核。

幂等与重复付款

定时任务可能重复执行。出现网络超时后,系统也未必能立即确认请求是否成功。每个结算周期都应使用稳定且唯一的幂等键,并在本地保存付款状态。

费用、限额和负余额

需要逐项核对开户费、单笔手续费、跨境费、换汇费、最低付款金额、每日限额和失败转账费用。同时还要预留资金,以应对退款、拒付或付款退回造成的负余额。

会计与税务

付款记录至少要包括收款人、金额、币种、结算周期、业务依据、服务商交易编号和最终状态。佣金、报酬或平台结算是否需要代扣税款或提交税务申报,要根据所在司法辖区和业务关系确定。

实际选择建议

平台型应用可以优先评估带有 connected accounts 和托管开户流程的支付平台。大量发放奖励、佣金或进行跨境付款时,可以考虑专门的 disbursement 服务。如果付款规模稳定,而且主要集中在一个国家,再比较银行批量转账方案。

支票可以保留作为特殊情况下的备用方式,但不适合成为主要付款流程。它的人工成本高、到账慢、容易丢失,也不便于自动对账。做出最终选择前,应要求候选服务商以书面形式确认,你的业务类型、付款国家、币种和资金用途都在其支持范围内。

备注:内容仅供参考。