3. 统一收单核心概念
在支付系统建设中,“收单”并不是一个孤立动作,而是一组围绕商户收款请求展开的能力集合。要理解统一收单与交易编排,必须先厘清收单、聚合支付、统一收单、交易编排、路由、渠道路由、支付产品与支付方式这八个核心概念之间的层次与关系。它们分别回答“谁在收钱”“收什么钱”“怎么选通道”“怎么走流程”等不同问题。
一、从收单到统一收单:概念分层
收单指收单机构为商户提供受理支付工具、完成资金结算的服务。传统收单中,商户与某一家银行或持牌机构签约,交易只能走该机构通道。聚合支付则是在商户与多个支付通道之间增加一层技术服务,把微信、支付宝、银联等多种支付方式聚合到同一接口,商户无需分别对接。聚合支付解决的是“接口数量多”的问题,但并未必然解决交易规则、路由策略和资金清分的一致性问题。
统一收单是在聚合支付基础上进一步抽象:对外提供统一的收单API、统一的订单模型、统一的状态机和统一的对账口径;对内把不同通道的差异封装在适配层。它强调“一次接入、多通道可用、规则可编排”。因此,统一收单不仅是接口聚合,更是交易语义的统一。
一句话区分:聚合支付是“多通道接进来”,统一收单是“多通道接进来之后,还能用同一套规则管起来”。
二、交易编排与路由:统一收单的调度中枢
交易编排负责把一笔支付请求拆解为有序步骤,例如参数校验、风控检查、路由选择、通道调用、结果落库、异步通知、对账登记。编排关注的是“先后顺序、条件分支、失败补偿”。路由是编排中的一个关键决策节点,决定这笔交易交给哪个通道处理。渠道路由则更具体,指在多个支付渠道之间按规则选择,例如按费率、成功率、限额、商户资质、通道健康度进行加权。
路由策略通常包含静态规则与动态规则。静态规则如“商户A的微信支付走通道1”;动态规则如“通道1成功率低于95%时自动切到通道2”。编排与路由的关系可以理解为:编排是流程骨架,路由是骨架中的决策开关。
三、支付产品与支付方式:容易混淆的一对概念
支付产品是面向商户签约和计费的能力单元,例如“微信支付”“支付宝”“银联云闪付”。支付方式是用户在支付产品下选择的具体付款形态,例如扫码支付、被扫支付、JSAPI支付、APP支付、H5支付。同一支付产品可以支持多种支付方式;同一支付方式也可能由多个支付产品提供。统一收单系统需要在订单中同时记录支付产品与支付方式,才能正确路由和后续对账。
| 概念 | 回答的问题 | 典型示例 | 在系统中的位置 |
|---|---|---|---|
| 收单 | 谁为商户完成资金结算 | 银行收单、第三方收单 | 业务资质与资金层 |
| 聚合支付 | 如何用一个接口接多个通道 | 聚合码、聚合API | 接入层 |
| 统一收单 | 如何统一订单、状态与规则 | 统一收单平台 | 平台核心层 |
| 交易编排 | 一笔交易按什么顺序执行 | 校验→风控→路由→调用 | 流程调度层 |
| 路由 / 渠道路由 | 这笔交易交给哪个通道 | 按费率、成功率、限额选择 | 决策层 |
| 支付产品 | 商户签约了哪种收款能力 | 微信支付、支付宝 | 产品与计费层 |
| 支付方式 | 用户具体怎么付款 | 扫码、JSAPI、APP | 交互与通道参数层 |
四、案例与常见误区
假设商户下单请求为:支付产品“微信支付”,支付方式“JSAPI”,金额100元。统一收单平台收到请求后,交易编排依次执行参数校验、商户限额检查、风控评分、渠道路由。路由模块发现商户签约了两个微信通道:通道A费率0.38%、当前成功率99.2%;通道B费率0.35%、当前成功率96.8%。若策略以成功率优先,则选择通道A;若策略以费率优先且成功率阈值设为95%,则选择通道B。选定后,通道适配层把统一参数转换为微信JSAPI下单参数,调用通道并处理返回。
常见误区一:把聚合支付等同于统一收单。聚合只解决接口数量,统一收单还要解决订单模型、状态机、路由规则和对账口径。误区二:把支付产品与支付方式混为一谈,导致路由参数缺失。误区三:路由只按费率选择,忽略成功率和通道健康度,短期省钱、长期掉单。
复盘要点:统一收单的核心不是“接了多少通道”,而是“能否用一套订单、一套状态、一套规则管理所有通道”。交易编排决定流程是否可扩展,渠道路由决定交易是否稳定且成本可控,支付产品与支付方式的清晰区分决定参数是否正确传递。
统一收单请求示例(简化):
{
"merchantId": "M10086",
"orderNo": "ORD202501010001",
"amount": 10000,
"payProduct": "WECHAT",
"payMethod": "JSAPI",
"routeStrategy": "SUCCESS_RATE_FIRST"
}
路由决策日志示例:
[ROUTE] merchant=M10086 product=WECHAT method=JSAPI
[ROUTE] candidate=A rate=0.38% success=99.2% health=UP
[ROUTE] candidate=B rate=0.35% success=96.8% health=UP
[ROUTE] strategy=SUCCESS_RATE_FIRST selected=A