SMARTPAY

菲律宾批量代付怎么做?批量文件格式、单批限额与失败重试实操

批量代付是什么,什么场景下必须切换到它

做菲律宾本地业务的中国商户,只要团队或合作方超过几十人,迟早会遇到同一个问题:每到发薪日或结算日,财务或技术要对着一张名单,一条一条调用代付接口,或者一笔一笔手动打款。人少时没问题,人一多,接口调用次数暴增、每笔都要单独盯状态、对账要把上百条流水逐条对齐,出一次错就要翻半天日志。

批量代付要解决的正是这个问题:把一批收款记录打包成一个批次,一次提交、系统按通道能力自动排队处理、最后按批次拿回一份完整的结果清单,而不是自己维护几十个并发请求。判断要不要切到批量代付,我一般看两个信号:一是单次代付笔数已经稳定超过一个小批量;二是打款有明显周期性,比如月度工资、周度佣金结算——满足其中一条,批量代付带来的工程量和对账成本节省就很明显。

上线批量代付前,账户与合规要先确认清楚

批量代付涉及的资金体量通常比单笔大得多,开通批量权限之前,我会先确认两件事:商户账户是否已具备批量出款权限(不是所有账户类型默认开放),以及资金最终经过的通道方是不是持牌机构。

菲律宾的支付合规主体资质主要看两块:一是 BSP 颁发的 OPS(运营支付系统)牌照,决定了机构能不能合法运营支付清算业务;二是 EMI(电子货币机构)牌照,决定了机构能不能合法发行和管理电子货币账户余额。批量代付本质上是把资金通过对方系统批量转出,选通道之前先看清楚对方到底持有哪张牌照、业务范围覆盖不覆盖代付,比事后追责要省心得多。

确认合规主体之后,还要跟通道方确认几件技术上的事:批量接口和单笔接口是否同一套鉴权体系、批次结果靠回调还是要自己轮询、测试环境能否跑通整条批量链路。这些问题提前问清楚,能省掉后面很多返工。关于代收和代付整体的合规边界,可以参考 GCash代收代付合规要点,里面对哪些环节需要额外留痕说得比较细。

批量文件怎么准备:格式与必填字段

批量代付的文件质量,基本决定这一批能不能一次跑成功。常见提交方式有两种:直接把明细拼成 JSON 数组通过接口提交,或先生成 CSV/Excel 清单再由后台上传解析,非技术团队操作的场景更常用后者。不管哪种方式,字段设计上建议至少包含以下几项:

  • 批次号(batchNo):商户方自己生成,全局唯一,一旦提交就不能复用,方便后续查询和对账;
  • 内部流水号(tno):批次里每一条记录的唯一标识,必须保证不重复——这是防止系统或人工误操作导致重复代付的关键字段;
  • 收款渠道与账号:标明这一条走 GCash、QRPH 还是银行卡/PesoNet,账号格式要和渠道类型匹配,格式不对的记录建议在提交前就拦下来,而不是等通道方拒绝;
  • 金额:统一精度到小数点后两位,提交前做一次求和校验,避免小数精度问题导致总额对不上;
  • 备注/摘要:给收款人展示的用途说明,比如工资、结算款,长度要控制在通道允许的范围内。

建议提交前先跑一遍本地数据清洗:账号格式、渠道匹配、金额精度、tno 去重四项校验。这一步花的时间不多,能把大部分"整批因一条脏数据被拒"的情况提前挡掉。

单批次数量和金额,怎么权衡限额

各通道对单批次的笔数和总金额基本都设有上限,具体数值以通道方当前公布规则为准,这里不写死数字——不同商户资质、不同通道版本的额度经常不一样,拿旧数字当标准反而容易踩坑。实际操作时我遵循几条原则:先用小批量跑通整条链路,确认签名、回调、对账都没问题,再按通道建议值逐步放量;不要图省事把一整月工资塞进一个批次,触发限额整批被拒或转人工复核,反而更耽误时间。

路径到账速度(定性)适合场景是否支持批次回调建议分批策略
GCash Instapay 批量代付通道内较快,受对方系统排队影响达人结算、零散佣金,收款人多为个人钱包支持异步通知先小批量测试,按通道建议值分批,避免单批过大触发风控复核
QRPH 批量代付取决于收款方接入的具体钱包/银行跨钱包混合收款人群体支持异步通知按收款渠道类型分组打包,便于失败定位
PesoNet 批量代发走批次清算窗口,非实时工资代发、供应商付款等对时效要求不高的场景需结合清算窗口查询最终状态按银行清算窗口时间提前提交,避免踩窗口截止点

PesoNet 批量代发工资的文件格式和清算窗口细节,可参考 PesoNet批量代发工资流程;代付资金背后的清算原理,可看 D0实时结算原理,理解这层之后,批量代付的排队和延迟就更容易判断是正常还是真出了问题。

批量提交API怎么调用

批量代付接口的基本形态和单笔代付很像,只是把明细换成了一个数组,外面套一层批次级别字段。下面是提交批次的 curl 示例,字段名以实际对接文档为准,这里用于展示结构:

curl -X POST https://apix.smartpay.ph/api/batchPayout \
  -H "Content-Type: application/json" \
  -d '{
    "merid": "M10086",
    "batchNo": "BATCH20260929001",
    "notify_url": "https://merchant.example.com/notify/batch",
    "items": [
      {"tno": "PAY0001", "channel": "GCASH", "acc": "09171234567", "amt": "1500.00", "remark": "salary-sep"},
      {"tno": "PAY0002", "channel": "QRPH", "acc": "09281234567", "amt": "2300.00", "remark": "salary-sep"},
      {"tno": "PAY0003", "channel": "GCASH", "acc": "09391234567", "amt": "980.50", "remark": "commission-sep"}
    ],
    "sign": "..."
  }'

生产环境里,签名生成、批次号防重、查询状态这几步通常要写成一个小模块复用,下面是 Node.js 示例,展示签名怎么拼、批次怎么提交、状态怎么轮询:

const crypto = require('crypto');

// 按字典序拼接参数并追加密钥,MD5 生成签名
function buildSign(params, secretKey) {
  const keys = Object.keys(params)
    .filter((k) => k !== 'sign' && params[k] !== '' && params[k] !== undefined)
    .sort();
  const query = keys.map((k) => `${k}=${typeof params[k] === 'object' ? JSON.stringify(params[k]) : params[k]}`).join('&');
  return crypto.createHash('md5').update(query + `&key=${secretKey}`, 'utf8').digest('hex').toUpperCase();
}

async function submitBatch(items) {
  const payload = {
    merid: process.env.SMARTPAY_MERID,
    batchNo: `BATCH${Date.now()}`,
    notify_url: 'https://merchant.example.com/notify/batch',
    items,
  };
  payload.sign = buildSign(payload, process.env.SMARTPAY_SECRET);

  const res = await fetch('https://apix.smartpay.ph/api/batchPayout', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(payload),
  });
  return res.json();
}

// 兜底轮询:回调没收到或延迟时,主动查批次状态
async function queryBatchStatus(batchNo) {
  const params = { merid: process.env.SMARTPAY_MERID, batchNo };
  params.sign = buildSign(params, process.env.SMARTPAY_SECRET);
  const res = await fetch('https://apix.smartpay.ph/api/batchPayoutQuery', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(params),
  });
  return res.json();
}

有个容易被忽略的细节:批次级别的回调通常只告诉你"这个批次处理完了",不代表每一条都成功。回调触发后,一定要再拉一次批次明细,按 tno 逐条核对状态,不能看到回调就默认全部成功。

部分失败怎么办:重试与对账怎么做

一个批次几十条记录,有几条失败几乎是常态,失败原因也五花八门。提前把常见失败类型和处理方式对应起来,能大大减少人工排查时间:

失败/异常类型常见原因建议处理方式
收款账号无效账号格式错误、账号未注册、渠道与账号类型不匹配提交前用规则校验拦截,失败后核对账号来源,更正后用新 tno 重新提交这一条
单批或单笔超限触碰通道单批笔数/金额上限,或触发风控复核阈值拆分批次重新提交,必要时联系通道方确认当前额度
商户余额不足账户可用余额小于批次总金额提交前先做余额预检查,不足则先充值再提交,避免整批因为一条超额被卡住
状态长时间未知渠道方处理超时、网络异常、回调丢失不要直接重新提交,先用批次号/tno 查询最终状态,确认失败后再用相同 tno 幂等重试

要强调一个原则:状态"未知"的记录不能直接当失败重发,因为对方可能已处理成功、只是通知没送达,重新提交会有重复代付风险。正确做法是先查询,确认失败了再用原来的 tno 重新发起——多数系统会把相同 tno 当幂等键处理,避免重复扣款。

批次跑完后,建议做一次完整对账:把提交清单、通道返回的明细状态、账务系统里的扣款记录三方对齐,按 tno 逐条核对金额和状态,而不是只看批次总数对不对得上。对账方法和工具的取舍,可以参考 商户对账的三种方案,里面对手工、半自动、全自动三种模式的适用场景讲得比较清楚。

常见批量代付场景怎么落地

批量代付最常见的三类场景,技术侧重点并不完全一样:

工资代发:人员和周期相对固定(月度或半月度),核心是提前维护好收款人白名单,批次生成可完全自动化,重点是发薪日前做好余额预检查和账号有效性校验。

达人/网红结算:人数波动大、渠道分散(有人用 GCash,有人用银行卡),结算周期可能按周甚至按场次,批次里常是多渠道混合,建议按渠道类型分组打包,方便失败定位和分渠道对账。

供应商付款:单笔金额差异大,通常需要在批次提交前加一道人工复核环节,尤其是大额记录,不建议完全无人值守自动跑批。

这三类场景背后的批量出款方案设计思路,可以参考 工资代发与佣金结算的批量出款方案,里面对不同人员规模下的批次颗粒度选择有更具体的展开。

常见问题

批量代付文件支持哪些格式?

常见的是 JSON 数组直接提交,或 CSV/Excel 清单上传由后台解析,具体支持哪几种以接口文档为准。不管哪种格式,字段命名和必填项建议保持一致,方便复用同一套校验逻辑。

一个批次里能不能同时混用不同渠道,比如 GCash 和 QRPH 放在一起?

大多数批量接口支持混合渠道,每条记录自己声明渠道类型即可。但从对账和失败定位角度,更建议按渠道分组打包成不同批次,出问题时能更快定位。

批次提交后大概多久能看到结果?

处理速度受批次大小、渠道排队、是否命中人工复核等因素影响,没有固定值。建议提交后先依赖异步回调,同时保留主动查询接口作兜底,避免因回调延迟或丢失就误判为处理失败。

批次里部分笔数失败,是不是要把整个批次重新提交一遍?

不需要,也不建议这么做。只针对失败的那几条,用新的 tno 单独重新提交,已成功的记录不要动,避免重复代付。

批量代付和单笔代付在费率结构上有区别吗?

批量代付本质上是多笔单笔代付打包处理,底层费率结构通常按单笔计算,具体收费方式建议直接和商户经理确认,不同商户等级和通道组合给到的方案会不一样。

达人结算和工资代发在技术实现上有什么不同?

差别在收款人信息稳定性和渠道分布:工资代发收款人相对固定、渠道单一,批次生成可完全模板化;达人结算的收款人和渠道经常变动,批次生成前需多一步账号有效性核验。

批量代付出错之后,会不会出现同一个人被重复打款?

只要严格执行 tno 唯一且幂等重试的原则,重复代付是可以规避的。真正容易出问题的,是运维或财务在系统之外手动补发,却没核对系统里这条记录的真实状态,这种情况建议一律先查询再操作。

测试环境的批量接口和生产环境是不是完全一样?

接口结构通常一致,但测试环境的额度、渠道覆盖、回调时效可能和生产环境不同。正式代发工资前,建议至少用测试环境走完一次完整的提交、回调、查询、对账全流程,而不是只测通提交这一步就上生产。

批量代付看起来只是把单笔接口包了一层数组,真正决定它稳不稳的,是文件校验、限额拆分、失败重试、对账闭环这几个环节有没有做扎实。这几步在小批量时看不出差别,一旦上量,哪个环节偷懒都会在下一次发薪日暴露出来。

选择合作的支付网关时,建议优先确认对方是否持有 BSP 颁发的 OPS 与 EMI 牌照——这决定了批量资金在通道内流转时的合规边界,也是出问题时责任划分的依据。

如果你正在评估批量代付方案,或者已经在用但对账/重试环节总出岔子,欢迎联系 SMARTPAY 技术团队一起过一遍你的场景:Telegram 咨询 @LouisSMARTPAY,或邮件 [email protected],把业务规模和现有痛点说清楚,我们可以直接给出批次颗粒度和重试策略上的建议。

相关推荐