```
feat(shopro_huifu): 添加汇付延时分账资金冻结状态检查功能 - 在分账服务中新增 assertDelayFundsReadyForConfirm 方法, 检查汇付查单中的 fund_freeze_stat 字段 - 当资金处于 FREEZE 状态时抛出运行时异常,并提供详细处理建议 - 更新测试脚本中的查单摘要,添加 fund_freeze_stat、freeze_time、 unfreeze_time 字段 - 在文档中补充常见汇付错误码说明,包括 23000003 和 23000004 的处理方案 ```
这个提交包含在:
@@ -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, '.', '');
|
||||
|
||||
在新工单中引用
屏蔽一个用户