文件
xionggeshop/application/admin/controller/shopro/split/Order.php
可乐加冰 375dd5356f ```
feat(split): 添加微信分账V3版本验证和汇付分账冻结资金处理

- 在ProfitSharingService中添加Yansongda Pay V3版本验证,确保微信官方分账功能正常运行
- 实现汇付分账冻结资金检测逻辑,当资金被冻结时标记分账失败而非抛出异常
- 在管理后台控制器中增强错误处理和状态显示功能
- 优化前端界面,根据分账模式动态显示相应操作按钮
```
2026-10-02 14:49:33 +08:00

108 行
4.1 KiB
PHP

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

<?php
namespace app\admin\controller\shopro\split;
use app\admin\controller\shopro\Base;
use addons\shopro\library\split\Config as SplitConfig;
use addons\shopro\library\split\SplitExecutor;
use addons\shopro\library\split\ProfitSharingService;
class Order extends Base
{
protected $model = null;
public function _initialize()
{
parent::_initialize();
$this->model = new \addons\shopro\model\split\SplitOrder;
}
public function index()
{
$this->request->filter(['strip_tags']);
if ($this->request->isAjax()) {
list($where, $sort, $order, $offset, $limit) = $this->custombuildparams();
$total = $this->model->where($where)->count();
$list = $this->model->with('receivers')->where($where)->order($sort, $order)->limit($offset, $limit)->select();
return $this->success('操作成功', null, ['total' => $total, 'rows' => $list]);
}
return $this->view->fetch();
}
public function retry($ids = null)
{
$id = $ids ?: $this->request->post('id');
$row = $this->model->get($id);
if (!$row) {
$this->error('分账记录不存在,可能已被上次重试替换。请刷新列表后,对最新一条失败记录重试');
}
$orderId = (int) $row['order_id'];
$channel = $row['channel'] ?? 'wechat';
try {
$result = (new SplitExecutor())->retry($id);
} catch (\Throwable $e) {
$this->error('重试失败:' . $e->getMessage());
}
if ($result) {
$this->success('重试成功');
}
$hint = $this->formatSplitWxResultHint($orderId, $channel);
if ($hint === '') {
$hint = ':请确认已部署最新 HuifuSplitService.php;或执行 php addons/shopro/tests/split_commission_verify.php try-split ' . $row['order_sn'] . ' --execute 查看详情';
}
$this->error('重试失败' . $hint);
}
protected function formatSplitWxResultHint($orderId, $channel)
{
$latest = $this->model->where('order_id', $orderId)
->where('channel', $channel)
->order('id', 'desc')
->find();
if (!$latest || empty($latest['wx_result'])) {
return '';
}
$raw = is_string($latest['wx_result']) ? $latest['wx_result'] : json_encode($latest['wx_result'], JSON_UNESCAPED_UNICODE);
if ($raw !== '' && strpos($raw, 'fund_freeze_stat=FREEZE') !== false) {
return ':' . mb_substr($raw, 0, 500);
}
$decoded = json_decode($raw, true);
if (is_array($decoded)) {
$parts = array_filter([
$decoded['resp_desc'] ?? '',
$decoded['resp_code'] ?? '',
$decoded['bank_message'] ?? '',
]);
return $parts ? (':' . implode(' ', $parts)) : (':' . mb_substr($raw, 0, 300));
}
return ':' . mb_substr($raw, 0, 300);
}
public function query($ids = null)
{
$row = $this->model->get($ids);
if (!$row) {
$this->error('记录不存在');
}
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']);
} elseif ((new SplitConfig())->isHuifuMode()) {
$this->error('当前为汇付分账,请对 channel=huifu 的分账记录查询,或到汇付控台查看分账结果');
} else {
$service = new ProfitSharingService();
$result = $service->queryOrder([
'out_order_no' => $row['out_order_no'],
'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());
}
}
}