微信支付分账接入与排障:订单支付成功,分账却报 403
先看现象
订单支付成功,调 /v3/profitsharing/orders 返回 403 NO_AUTH 或 403 RULE_LIMIT;或者接口返回受理成功,但查询分账结果时 receivers.result 是 CLOSED,fail_reason 给出具体原因。这两类现象的原因分布不同:前者多出在下单环节和权限开通,后者多出在接收方状态和金额约束。
下单时就要打上 profit_sharing
需分账的订单,平台在下单时要预先打上分账标识 profit_sharing(普通支付下单 / 合单支付下单 API)。字段 profit_sharing 为 boolean,是否需要分账;传 true 需要分账,传 false 或不传默认 false。
支付前没打这个标识,支付成功后这笔订单就分不了账。这是第一个、也最容易踩的点,且下单后无法补救。
添加分账接收方
请求方式:【POST】/v3/profitsharing/receivers/add
发起添加请求后建立分账接收方列表,后续通过发起分账请求,把分账方商户结算后的资金分到该接收方。商户的分账接收方数量上限为 2 万,达到上限可删除部分未使用的接收方后重新添加。接收方可以是微信支付商户,也可以是微信支付的个人账户(个人 OpenID / sub_openid)。
错误码:400 PARAM_ERROR、400 INVALID_REQUEST、401 SIGN_ERROR、500 SYSTEM_ERROR、403 NO_AUTH(商户无权限,需开通商户号分账权限)、429 FREQUENCY_LIMITED(添加接收方频率过高)。
漏了这一步直接调请求分账,官方 FAQ 原文是:「未添加分账接收方,分账接收方在分账之前需要调用『添加分账接收方接口』添加,请添加接收方后再调用请求分账接口。」
请求分账
请求方式:【POST】/v3/profitsharing/orders
这是受理型接口:请求成功不代表分账成功,接收到商户请求后先受理,最终分账结果要通过查询分账结果接口获取。
关键参数与限制:
amount必填 integer,分账金额,单位为分,只能为整数,不能超过原订单支付金额及最大分账比例金额。unfreeze_unsplit必填 boolean:true 则该笔订单剩余未分账金额解冻回分账发起方商户,解冻后不支持对该笔订单再次分账;false 则剩余未分账金额不解冻,可以对该订单再次分账。- 分账接收方列表每次最多 50 个分账接收方;可以设置出资商户作为分账接收方。
- 一笔订单最多可以发起 50 次分账。
最大分账比例默认最高 30%,调整入口:登录商户平台 → 产品中心 → 分账 → 分账管理比例。上限按订单金额计算,不是单次分账金额单独计算:设为 30%,则该笔订单所有分账金额之和 ≤ 订单金额 × 30%。
错误码:400 PARAM_ERROR、400 INVALID_REQUEST、401 SIGN_ERROR、500 SYSTEM_ERROR、403 NO_AUTH(商户无权限,请开通商户号分账权限)、403 RULE_LIMIT(分账金额超出最大分账比例)、403 NOT_ENOUGH(分账金额不足)、429 FREQUENCY_LIMITED(对同笔订单分账频率过高)。
结果怎么读
receivers.result 可选取值:PENDING(待分账,非终态)、SUCCESS(分账成功,终态)、CLOSED(已关闭,终态)。
fail_reason 在 result 为 CLOSED 时返回:ACCOUNT_ABNORMAL(分账接收账户异常)、NO_RELATION(分账关系已解除)、RECEIVER_HIGH_RISK(高风险接收方)、RECEIVER_REAL_NAME_NOT_VERIFIED(接收方未实名)、NO_AUTH(分账权限已解除)、RECEIVER_RECEIPT_LIMIT(超出用户月收款限额)、PAYER_ACCOUNT_ABNORMAL(分出方账户异常)、INVALID_REQUEST(描述参数设置失败)。
冻结期与解冻
普通商户分账订单默认冻结期 30 天,资金冻结期最长 30 天;30 天内商户没有发起分账指令,订单冻结资金将全部解冻,订单处于完结状态,无法发起分账。服务商 / 平台收付通最长冻结周期默认 180 天,超时仍未发起分账指令,该笔订单剩余资金自动解冻。
属于分账方的资金,微信支付平台自动解冻给分账方;商户只需传入分给他方的账号和资金,订单剩余未分账资金平台默认都属于分账方,平台在处理分账的同时直接解冻给分账方。分账接收方收到分账资金后,需要手动提现到银行账户。
解冻剩余资金接口:【POST】/v3/profitsharing/orders/unfreeze,异步处理模式,最终结果可通过查询分账接口获取(也可看请求分账接口的响应)。
错误码:403 NO_AUTH(商户无权限)、403 NOT_ENOUGH(分账金额为 0,分账已完成,无需再请求解冻剩余资金)、429 FREQUENCY_LIMITED。
分账完成后立即解冻的两种方式:最后一次调用请求分账接口时传参 unfreeze_unsplit: true;分账完成一分钟后调用解冻剩余资金接口手动解冻。
分账回退
请求方式:【POST】/v3/profitsharing/return-orders
订单已经分账、退款时可以先调此接口,把已分账资金从分账接收方账户回退给分账方,再发起退款。此接口为同步处理模式,接收到商户请求后会实时返回处理结果;接口返回成功即代表回退到终态,但可能是回退成功也可能是回退失败,需要根据回退结果判断。
约束(官方明确):
- 以原分账单为依据,支持多次回退,申请回退总金额不能超过原分账单分给该接收方的金额。
- 对同一笔分账单最多能发起 50 次分账回退请求。
- 时限 180 天,从订单创建时间算起,超过 180 天不支持回退。
- 仅支持对分账给 MERCHANT_ID(商户号类型)、且分账单状态为 FINISHED(处理完成)、分账结果
result为 SUCCESS(分账成功)的分账单执行回退操作。 - 不支持「分账给个人」的分账单发起分账回退。
- 需要接收方在商户平台-交易中心-分账-分账接收设置下开启「同意分账回退」后才能使用。
参数:sub_mchid 特约商户号;out_return_no 商户回退单号(商户自己生成、后台唯一);return_mchid 回退商户号(对应请求分账接口时传入的 receiver_account);amount 回退金额(分,整数,不能超过原始分账单分出给该接收方的金额)。
回退 result 为处理中时,可通过查询回退结果接口获取最终结果;如果查询到回退结果在处理中,请勿变更商户回退单号,使用相同的参数再次发起分账回退,否则会出现资金风险。处理中状态的回退单如果 5 天没有成功,会因为超时被设置为已失败。
fail_reason 可选取值:ACCOUNT_ABNORMAL(原分账接收方账户异常)、BALANCE_NOT_ENOUGH(余额不足)、TIME_OUT_CLOSED(超时关单)、PAYER_ACCOUNT_ABNORMAL(原分账分出方账户异常)。
错误码:403 NO_AUTH(回退方未开通分账回退功能)、429 FREQUENCY_LIMITED(商户发起分账回退的频率过高)。
退款时钱从哪个账户出
官方 FAQ 表:
- 订单未分账,申请全额/部分退款:无前提,直接可退,出款账户 = 商户冻结账户资金。
- 订单部分分账,申请全额退款:需先调「解冻剩余资金」接口,将订单剩余冻结资金全部解冻;解冻后商户可用余额充足,出款账户 = 商户可用余额。
- 订单部分分账,申请部分退款:申请退款金额 ≤ 订单未分账冻结金额时直接可退(出款 = 商户冻结账户资金);退款金额 > 订单未分账冻结金额时,需先调解冻剩余资金接口将冻结资金全额解冻,解冻后可用余额充足(出款 = 商户可用余额)。
- 订单已完结分账,申请全额/部分退款:商户可用余额充足,直接可退。
分账订单的退款与分账回退并无强耦合,分账回退的资金回到商户可用余额中,回退可先于退款发起,也可后于退款。
其他官方 FAQ
- 订单资金处于分账冻结时关闭分账产品权限,资金会自动解冻,关闭分账产品不影响自动解冻;普通商户和普通服务商默认 30 天自动解冻,平台收付通默认 180 天自动解冻。
- 小程序交易被冻结时,在用户主动/系统自动确认收货后进行资金结算。
- 订单已过期(超过 180 天)不支持分账,等系统自动解冻。
需按自己产品合约核对 / 未实测
- 各产品模式(普通商户 / 服务商 / 平台收付通)的冻结期口径与最大分账比例默认值存在差异,需按自己签约的产品合约与商户平台实际配置核对。
- 分账动账通知 API 的回调路径与验签方式与普通支付通知一致(同属 v3 回调),本文未展开。