feat(shopro_huifu): 添加汇付延时分账资金冻结状态检查功能

- 在分账服务中新增 assertDelayFundsReadyForConfirm 方法,
  检查汇付查单中的 fund_freeze_stat 字段
- 当资金处于 FREEZE 状态时抛出运行时异常,并提供详细处理建议
- 更新测试脚本中的查单摘要,添加 fund_freeze_stat、freeze_time、
  unfreeze_time 字段
- 在文档中补充常见汇付错误码说明,包括 23000003 和 23000004
  的处理方案
```
这个提交包含在:
可乐加冰
2026-10-02 14:35:03 +08:00
父节点 41cd174686
当前提交 acf7314916
共有 3 个文件被更改,包括 42 次插入 和 5 次删除

查看文件

@@ -67,6 +67,7 @@ class HuifuSplitService
$outOrderNo = 'HFPS' . date('YmdHis') . $orderId;
$ext = HuifuPayService::getPayExt($orderId);
$this->assertDelayFundsReadyForConfirm($order['order_sn']);
Db::startTrans();
try {
@@ -194,6 +195,30 @@ class HuifuSplitService
return $this->resolveConfirmPayFee($orderSn, $orderPayFee);
}
/**
* 微信小程序 + 延时分账:通道侧资金可能处于 FREEZE,需发货/确认收货或等待解冻后才能 delaytrans/confirm。
*/
protected function assertDelayFundsReadyForConfirm($orderSn)
{
try {
$query = (new HuifuQueryService())->queryByOrderSn($orderSn);
} catch (\Throwable $e) {
return;
}
$freezeStat = strtoupper(trim((string) ($this->queryFieldRecursive($query, 'fund_freeze_stat') ?? '')));
if ($freezeStat !== 'FREEZE') {
return;
}
$unfreezeTime = trim((string) ($this->queryFieldRecursive($query, 'unfreeze_time') ?? ''));
$hint = '汇付查单 fund_freeze_stat=FREEZE:延迟交易资金仍被通道冻结,暂不能交易确认分账。'
. '小程序场景通常需:后台发货并同步微信 upload_shipping_info,用户在微信确认收货(或等待自动解冻,约 2–3 天)后再分账;'
. '建议分账时机改为「确认收货」而非「支付成功」。';
if ($unfreezeTime !== '') {
$hint .= ' 预计解冻时间(unfreeze_time)=' . $unfreezeTime;
}
throw new \RuntimeException($hint);
}
protected function resolveConfirmPayFee($orderSn, $orderPayFee)
{
$fallback = number_format((float) $orderPayFee, 2, '.', '');