From 702154d68f9535e0498e1f749d2a454a2c40d744 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=AF=E4=B9=90=E5=8A=A0=E5=86=B0?= <11869599+addie66@user.noreply.gitee.com> Date: Mon, 5 Oct 2026 10:18:35 +0800 Subject: [PATCH] =?UTF-8?q?```=20feat(shopro/split):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=B1=87=E4=BB=98=E5=88=86=E8=B4=A6=E6=9F=A5=E8=AF=A2=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重构汇付渠道状态查询逻辑,新增 queryHuifuChannelStatus 方法处理支付查单和分账查询 - 支持未 confirm 时使用支付查单,有 confirm_hf_seq_id 时查询分账结果 - 优化异常处理机制,区分 HttpResponseException 和其他异常类型 - 改进前端显示逻辑,根据返回数据类型展示更详细的查询结果信息 - 增强错误提示和用户体验,提供更精确的反馈信息 ``` --- .../admin/controller/shopro/split/Order.php | 36 ++++++++++++---- .../assets/js/backend/shopro/split/order.js | 41 ++++++++++++++----- 2 files changed, 60 insertions(+), 17 deletions(-) diff --git a/application/admin/controller/shopro/split/Order.php b/application/admin/controller/shopro/split/Order.php index 33feaef..3b124fe 100644 --- a/application/admin/controller/shopro/split/Order.php +++ b/application/admin/controller/shopro/split/Order.php @@ -225,8 +225,7 @@ class Order extends Base } try { if (($row['channel'] ?? 'wechat') === 'huifu' && class_exists('\\addons\\shopro_huifu\\library\\HuifuSplitService')) { - $service = new \addons\shopro_huifu\library\HuifuSplitService(); - $result = $service->querySplit($row['transaction_id']); + $result = $this->queryHuifuChannelStatus($row); } elseif ((new SplitConfig())->isHuifuMode()) { $this->error('当前为汇付分账,请对 channel=huifu 的分账记录查询,或到汇付控台查看分账结果'); } else { @@ -236,11 +235,34 @@ class Order extends Base 'transaction_id' => $row['transaction_id'], ]); } - $row->wx_result = json_encode($result, JSON_UNESCAPED_UNICODE); - $row->save(); - $this->success('查询成功', null, $result); - } catch (\Exception $e) { - $this->error($e->getMessage()); + } catch (\think\exception\HttpResponseException $e) { + throw $e; + } catch (\Throwable $e) { + $this->error('查询失败:' . ($e->getMessage() ?: '未知错误')); } + + $row->wx_result = json_encode($result, JSON_UNESCAPED_UNICODE); + $row->save(); + $this->success('查询成功', null, $result); + } + + /** + * 汇付:未 confirm 成功时用支付查单;已有 confirm_hf_seq_id 时再查分账结果 + */ + protected function queryHuifuChannelStatus($row) + { + $payload = []; + if (class_exists('\\addons\\shopro_huifu\\library\\HuifuQueryService')) { + $payload['pay_query'] = (new \addons\shopro_huifu\library\HuifuQueryService())->queryByOrderSn($row['order_sn']); + } + $confirmSeq = trim((string) ($row['confirm_hf_seq_id'] ?? '')); + if ($confirmSeq !== '') { + $service = new \addons\shopro_huifu\library\HuifuSplitService(); + $payload['split_query'] = $service->querySplit($confirmSeq); + } + if (empty($payload)) { + throw new \RuntimeException('汇付查询组件不可用'); + } + return $payload; } } diff --git a/public/assets/js/backend/shopro/split/order.js b/public/assets/js/backend/shopro/split/order.js index 1ec914a..d3c853e 100644 --- a/public/assets/js/backend/shopro/split/order.js +++ b/public/assets/js/backend/shopro/split/order.js @@ -90,19 +90,40 @@ define(['jquery', 'bootstrap', 'backend', 'form'], function ($, undefined, Backe }, query(id) { Fast.api.ajax({ url: 'shopro/split/order/query/ids/' + id, type: 'POST' }, (ret, res) => { - var hint = '已同步通道状态并更新记录'; - if (res.data) { - try { - var d = typeof res.data === 'string' ? JSON.parse(res.data) : res.data; - var parts = [d.resp_desc, d.resp_code, d.bank_message, d.status].filter(Boolean); - if (parts.length) { - hint += ':' + parts.join(' '); - } - } catch (e) { /* ignore */ } + var hint = (res && res.msg) ? res.msg : '已同步通道状态并更新记录'; + var d = (res && res.data) ? res.data : {}; + if (typeof d === 'string') { + try { d = JSON.parse(d); } catch (e) { d = {}; } } - Layer.msg(hint, { time: 4000 }); + var parts = []; + if (d.pay_query) { + var pq = d.pay_query; + if (pq.fund_freeze_stat) { + parts.push('资金状态 ' + pq.fund_freeze_stat); + } + if (pq.unconfirm_amt != null) { + parts.push('待确认 ' + pq.unconfirm_amt); + } + if (pq.trans_stat) { + parts.push('交易 ' + pq.trans_stat); + } + } + if (d.split_query) { + var sq = d.split_query; + parts = parts.concat([sq.resp_desc, sq.resp_code, sq.status].filter(Boolean)); + } + if (!parts.length) { + parts = [d.resp_desc, d.resp_code, d.bank_message, d.status].filter(Boolean); + } + if (parts.length) { + hint += ':' + parts.join(' · '); + } + Layer.msg(hint, { time: 5000 }); this.getList(); return false; + }, (res) => { + var msg = (res && res.msg) ? res.msg : '查询失败,请稍后重试'; + Layer.msg(msg, { time: 4000 }); }); } }