# 资金结算
本文档面向自研商家和 ISV 服务商,覆盖资金结算模块从余额查询、流水对账、提现到结算账户管理的完整接入流程。
# 开发前准备
- 功能了解:开发前建议先阅读以下运营文档了解完整业务流程
- 权限与凭证:商家自研可直接调用,使用小店 access_token;第三方服务商需获得商家对权限集 ID:138 的授权,使用 authorizer_access_token
- 消息推送配置:需配置消息推送回调 URL,本模块涉及 3 个事件通知:[事件] 结算账户变更回调 / channels_ec_acct_notify、[事件] 提现回调 / channels_ec_withdraw_notify、[事件] 提现二维码回调 / qrcode_status。详见 消息通知(回调)说明
# 接入流程
# 账户余额与流水查询
本节覆盖 3 种数据对象,目标是建立完整的资金数据同步与对账体系。
| 数据对象 | 说明 | 接口 |
|---|---|---|
| 账户快照 | 可提现余额 available_amount待结算余额 pending_amount总账——此刻账户有多少钱 | [API] 获取账户余额 / getbalance |
| 资金流水 | 每笔资金变动记录flow_id / amount / funds_type / flow_type- flow_type:收支方向(1=收入 / 2=支出)- funds_type:业务类型(订单支付/提现/服务费等)收付明细——每笔钱的进出明细 | [API] 获取资金流水列表 / getfundsflowlist [API] 获取资金流水详情 / getfundsflowdetail |
| 订单流水 | 每个订单的完整费用拆解 实收 / 服务费 / 佣金 / 运费险 / 补贴 业务侧明细——这笔交易应该收/付多少 | [API] 查询订单流水列表 / listorderflow [API] 获取订单详情 / getorder(跨模块) |
关键调用规则:
- [API] 获取资金流水列表 / getfundsflowlist 返回的是
flow_id列表(不含金额),需逐一调 [API] 获取资金流水详情 / getfundsflowdetail 获取详情 - [API] 获取资金流水详情 / getfundsflowdetail 返回的
funds_type决定该笔流水应该用哪种方式对账(见下文「对账策略」) - [API] 查询订单流水列表 / listorderflow 与 [API] 获取资金流水详情 / getfundsflowdetail 是两个独立的数据源,用于交叉验证
注意事项:
- 当日流水延迟:当日流水次日 16 点后 出账。16 点前查询
end_time最大值为前一天 0 点 - 先用后付订单:此类订单需用户确认收货并自动付款后才产生资金流水,存在额外时间差
- 一笔订单多条流水:同一笔订单可能产生多条不同
funds_type的记录(如支付 1 条 + 佣金扣除 1 条 + 服务费 1 条),不要假设一一对应 - 对账必须过滤已结算订单:资金流水反映的是实际已入账金额,[API] 查询订单流水列表 / listorderflow 查询时需按
order_settle_state过滤已结算状态(值=60),否则未结算订单的金额(可能仍有退款/售后变动)会导致对账差异
# 对账策略
对账的本质是用 订单流水(业务侧) 的数据来验证 资金流水(资金侧) 的数据是否一致。资金流水是"收付明细",订单流水是"业务明细"。
flow_type 是判断一笔流水收入或支出方向的最直接字段,[API] 获取资金流水详情 / getfundsflowdetail 返回:
| flow_type 值 | 含义 |
|---|---|
| 1 | 收入(资金流入账户) |
| 2 | 支出(资金从账户流出) |
funds_type(资金流水类型)是同一接口返回的另一个字段,标识每一笔资金变动的业务原因——这笔钱为什么进、为什么出。一笔订单完成后,平台会自动生成多条不同 funds_type 的流水记录(支付收入、技术服务费扣除、达人佣金扣除等)。
实际使用建议:先用
flow_type区分收支方向,再用funds_type确认业务类型,两者结合可以快速定位每笔流水的性质。
# 按 funds_type 分类的对账方式
不同类型的资金变动,按 收入(flow_type=1)/ 支出(flow_type=2) 分为两类,每种类型都有对应的校验方式:
收入类(flow_type=1,钱进来了——验证"应该收的是否全到了")
| funds_type | 描述 | 校验方式 | 校验动作 |
|---|---|---|---|
| 1 | 订单支付 | 订单流水交叉验证 | 订单流水 mch_received_amount 求和 = 资金流水金额 |
| 5 | 提现退票 | 与提现(4)配对核销 | 同一 withdraw_id 下,退票金额 = 原提现金额;未退票的查 getwithdrawdetail 状态是否 SUCCESS |
| 15 | 回补极速退款垫资 | 与垫资(14)配对核销 | 同一订单下,回补金额 = 原垫资金额,差额即为实际垫资成本 |
| 17 | 预付运费退回 | 订单流水交叉验证 | 订单流水运费相关字段求和 = 资金流水金额 |
| 19 | 平台优惠补贴 | 订单流水交叉验证 | 订单流水平台补贴相关字段求和 = 资金流水金额 |
| 21 | 国补发放 | 订单流水交叉验证 | 订单流水国补相关字段求和 = 资金流水金额 |
| 23 | 注销提现退票 | 与注销提现(22)配对核销 | 同一笔注销操作下,退票金额与注销提现金额一致 |
| 25 | 平台赔付 | 订单流水交叉验证 | 订单流水平台赔付相关字段求和 = 资金流水金额 |
支出类(flow_type=2,钱出去了——验证"应该扣的是否扣对了")
| funds_type | 描述 | 校验方式 | 校验动作 |
|---|---|---|---|
| 3 | 订单退款 | 订单流水交叉验证 | 订单流水退款相关字段求和 = 资金流水金额 |
| 4 | 提现 | 与退票(5)配对核销 | 同一 withdraw_id 下,funds_type=4 的支出 + funds_type=5 的收入应能配对;未退票的检查状态是否 SUCCESS |
| 10 | 达人佣金 | 订单流水交叉验证 | 订单流水达人佣金相关字段求和 = 资金流水金额 |
| 11 | 技术服务费 | 订单流水交叉验证 | 订单流水 platform_commission_amount 求和 = 资金流水金额 |
| 12 | 带货机构服务费 | 订单流水交叉验证 | 订单流水带货机构服务费相关字段求和 = 资金流水金额 |
| 14 | 极速退款垫资 | 与回补(15)配对核销 | 标记为垫资金额,等待 funds_type=15 回补时核销 |
| 16 | 运费险 | 订单流水交叉验证 | 订单流水运费险相关字段求和 = 资金流水金额 |
| 20 | 补交运费 | 订单流水交叉验证 | 订单流水运费相关字段求和 = 资金流水金额 |
| 22 | 注销提现 | 与退票(23)配对核销 | 与商家注销流程的状态联动,确认金额一致性 |
配对核销类(4↔5、14↔15、22↔23)同一业务产生一收一支两条流水,按关联字段配对验证收支一致即可。
注意:平台正在将资金流水逐步迁移至新版本。迁移期间,
funds_type=3(订单退款)、funds_type=10(达人佣金)、funds_type=12(带货机构服务费)这 3 种类型可能同时出现flow_type=1(收入)和flow_type=2(支出)两条方向相反的流水,属于正常现象,对账时需将两个方向分别处理。
# 策略一:日常批量对账
适合每日定时任务,快速判断订单类资金是否平衡。覆盖所有"订单流水交叉验证"类 funds_type:
- 调 [API] 获取资金流水列表 / getfundsflowlist 拉取 T 日全量流水,循环调 [API] 获取资金流水详情 / getfundsflowdetail 获取明细。
- 按
funds_type+flow_type分组汇总amount(flow_type=1为收入,flow_type=2为支出)。 - 调 [API] 查询订单流水列表 / listorderflow,过滤
order_settle_state=60(结算完成)的订单,按费用字段分组汇总。资金流水反映实际入账/出账,必须与已结算订单对齐,未结算订单可能仍有退款/售后变动。 - 执行校验:
- 订单收入:订单流水
sum(mch_received_amount)= 资金流水sum(amount where funds_type=1 and flow_type=1) - 退款:订单流水
sum(refund_amount)= 资金流水sum(amount where funds_type=3 and flow_type=2) - 技术服务费:订单流水
sum(platform_commission_amount)= 资金流水sum(amount where funds_type=11 and flow_type=2)
- 订单收入:订单流水
各项总和一致则对账通过;不一致则标记为异常,进入策略二逐单排查。配对核销类(4↔5、14↔15、22↔23)同一业务产生一收一支两条流水,按 withdraw_id / order_id 等关联字段配对验证收支一致即可。
# 策略二:异常逐单排查
当策略一发现差异时,定位到具体订单:
- 从异常的 [API] 获取资金流水详情 / getfundsflowdetail 结果中,取
related_info_list中related_type=1的order_id。 - 用该
order_id调用 [API] 获取订单详情 / getorder,获取订单精确金额。 - 将订单侧的支付金额/退款金额/各项扣费,与对应资金流水的
amount逐项比对。
# 订单流水枚举
以下枚举用于 [API] 查询订单流水列表 / listorderflow 接口的查询参数过滤,其中 order_settle_state 是对账的关键过滤条件:
| 枚举 | 字段 | 枚举值 | 描述 |
|---|---|---|---|
| 订单结算状态 | order_settle_state | 0 | 无,查询全部 |
| 1 | 待结算 | ||
| 2 | 无需结算 | ||
| 60 | 结算完成 ← 对账时使用此值 | ||
| 100 | 部分结算 | ||
| 订单状态 | order_state | 0 | 全部 |
| 20 | 待发货 | ||
| 30 | 待收货 | ||
| 100 | 订单完成 | ||
| 订单支付方式 | order_pay_method | 0 | 全部 |
| 1 | 普通支付 | ||
| 2 | 先用后付 |
# 商户提现
查询可提现余额后,通过提现接口发起提现,管理员扫码确认后资金到账。
- [API] 商户提现 / submitwithdraw:发起提现,金额单位为分。每天最多允许提现一次。返回
withdraw_id(提现单号)和qrcode_ticket(二维码 ticket) - [API] 获取二维码 / ecgetqrcode:使用提现返回的
qrcode_ticket获取二维码图片,展示给管理员扫码确认 - [API] 查询扫码状态 / eccheckqrcode:主动轮询二维码扫码状态(0-未扫码 / 1-已确认 / 2-已取消 / 3-已失效 / 4-已扫码)
- [事件] 提现二维码回调 / qrcode_status:二维码状态变更时推送(已确认/已取消/已失效/已扫码)
- [事件] 提现回调 / channels_ec_withdraw_notify:提现流程各阶段推送(1-发起提现 / 2-申请提现 / 3-提现成功 / 4-提现失败)
- [API] 获取提现记录列表 / getwithdrawlist 和 [API] 获取提现记录 / getwithdrawdetail:查询提现历史和详情
# 结算账户管理(按需)
需要修改结算账户时,调用银行卡辅助接口获取银行信息后修改。有两条查询路径:通过卡号直查,或通过搜索银行+省份/城市/支行逐级定位。
# 查询银行信息
# 修改结算账户
- [API] 获取结算账户 / getbankacct:查询当前结算账户信息,包含账户类型(对公/对私)、开户银行、银行账号等
- [API] 修改结算账户 / setbankacct:修改结算账户,每天最多 5 次。企业类型只能绑定对公账户,个体工商户可绑定对公或对私账户
- 银行卡辅助接口用于获取银行信息,辅助填写结算账户参数:
- [API] 根据卡号查银行信息 / ecgetbankbynum
- [API] 搜索银行列表 / ecgetbanklist
- [API] 查询大陆银行省份列表 / ecgetprovince
- [API] 查询城市列表 / ecgetcity
- [API] 查询支行列表 / ecgetsubbranch
- [事件] 结算账户变更回调 / channels_ec_acct_notify:结算账户修改成功后推送通知
# 状态流转
# 提现状态枚举
| 状态值 | 描述 |
|---|---|
| INIT | 业务单已创建 |
| CREATE_SUCCESS | 受理成功 |
| SUCCESS | 提现成功 |
| FAIL | 提现失败 |
| REFUND | 提现退票 |
| CLOSE | 关单 |
# 前端对接说明
资金结算模块为纯服务端接口,无前端组件对接需求。提现流程中的二维码展示需商家自行在管理后台实现。
# 接口全览
# 资金账户 API 接口
| 中文名 / 英文名 | 请求方式 | 功能说明 |
|---|---|---|
| 获取账户余额 / getbalance | POST /channels/ec/funds/getbalance | 查询可提现余额和待结算余额 |
| 获取结算账户 / getbankacct | POST /channels/ec/funds/getbankacct | 查询当前结算银行账户信息 |
| 获取资金流水详情 / getfundsflowdetail | POST /channels/ec/funds/getfundsflowdetail | 根据流水 ID 查询流水详细信息 |
| 获取资金流水列表 / getfundsflowlist | POST /channels/ec/funds/getfundsflowlist | 按时间范围分页查询流水 ID 列表 |
| 获取提现记录 / getwithdrawdetail | POST /channels/ec/funds/getwithdrawdetail | 查询单笔提现的详细信息和状态 |
| 获取提现记录列表 / getwithdrawlist | POST /channels/ec/funds/getwithdrawlist | 按时间范围分页查询提现单号列表 |
| 修改结算账户 / setbankacct | POST /channels/ec/funds/setbankacct | 修改结算银行账户信息 |
| 商户提现 / submitwithdraw | POST /channels/ec/funds/submitwithdraw | 发起商户提现申请 |
| 查询订单流水列表 / listorderflow | POST /channels/ec/funds/listorderflow | 按订单维度查询结算信息列表 |
# 银行卡 API 接口
| 中文名 / 英文名 | 请求方式 | 功能说明 |
|---|---|---|
| 根据卡号查银行信息 / ecgetbankbynum | POST /shop/funds/getbankbynum | 根据银行卡号查询开户银行信息 |
| 搜索银行列表 / ecgetbanklist | POST /shop/funds/getbanklist | 按关键字搜索支持的银行列表 |
| 查询城市列表 / ecgetcity | POST /shop/funds/getcity | 查询指定省份下的所有城市 |
| 查询大陆银行省份列表 / ecgetprovince | POST /shop/funds/getprovince | 查询大陆银行省份列表 |
| 查询支行列表 / ecgetsubbranch | POST /shop/funds/getsubbranch | 查询指定银行在指定城市的支行 |
# 资金二维码 API 接口
| 中文名 / 英文名 | 请求方式 | 功能说明 |
|---|---|---|
| 获取二维码 / ecgetqrcode | POST /shop/funds/qrcode/get | 获取提现确认二维码图片 |
| 查询扫码状态 / eccheckqrcode | POST /shop/funds/qrcode/check | 查询提现二维码的扫码状态 |
# 事件通知
| 中文名 / 英文名 | 事件标识 | 功能说明 |
|---|---|---|
| 结算账户变更回调 / channels_ec_acct_notify | Event: channels_ec_acct_notify | 结算账户修改后通知 |
| 提现回调 / channels_ec_withdraw_notify | Event: channels_ec_withdraw_notify | 提现流程各阶段结果通知 |
| 提现二维码回调 / qrcode_status | Event: qrcode_status | 提现二维码扫码状态变更通知 |
# 常见问题 FAQ
Q:提现有频率限制吗? A:每天最多允许提现一次。提现需要管理员扫码确认,扫码确认后通过 [事件] 提现回调 / channels_ec_withdraw_notify 接收提现结果。
Q:资金账户和银行卡接口的路径前缀为什么不同?
A:资金账户类接口路径前缀为 /channels/ec/funds/,银行卡辅助接口和资金二维码接口路径前缀为 /shop/funds/,这是历史原因导致的差异,两类接口均正常可用。