You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Opencart 3.0.3.7 已注册订单状态变更事件未触发故障排查

问题原因

  • 你将事件回调方法定义在了后台控制器路径 admin/controller/extension/payment/simplepay.php 中,但你监听的是catalog/controller/api/order/history/after这个前台触发的事件,OpenCart前后台的路由、事件调度是完全隔离的,前台触发的事件只会在catalog/controller目录下查找对应的回调方法,不会访问后台目录的控制器。
  • 你注册的事件回调路径extension/payment/simplepay/doTransactionOnOrderStatusChange,对于前台事件而言,系统会定位到catalog/controller/extension/payment/simplepay.php下的对应方法,该文件不存在/方法不存在,自然不会触发执行。

修复步骤

  1. 在网站前台控制器目录下创建对应扩展文件:catalog/controller/extension/payment/simplepay.php
  2. 按照OpenCart前台控制器规范定义类,将doTransactionOnOrderStatusChange方法迁移到该文件中,示例结构如下:
<?php
class ControllerExtensionPaymentSimplepay extends Controller {
    // 3.0以上版本建议加第三个参数&$output,避免参数数量不匹配导致方法被跳过
    public function doTransactionOnOrderStatusChange(&$route, &$data, &$output = null) {
        // 原测试逻辑
        $log = new Log('aaaaaa.log');
        $log->write('Route   ' . $route);
        // 后续业务逻辑写在这里
    }
}
  1. 原admin控制器下的install、uninstall注册事件的代码无需修改,事件注册逻辑本身是正确的。
  2. 可选补充:如果你需要覆盖后台手动修改订单状态的场景,当前监听的前台API事件无法触发,需要额外注册后台对应的订单状态变更事件:
// 在admin的install方法里新增一行注册
$this->model_setting_event->addEvent(
    'do_transaction_on_admin_order_status_change',
    'admin/model/sale/order/addHistory/after',
    'extension/payment/simplepay/doTransactionOnOrderStatusChange'
);
// uninstall里也要对应加删除逻辑
$this->model_setting_event->deleteEventByCode('do_transaction_on_admin_order_status_change');

内容的提问来源于stack exchange,提问作者luciandex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 03:15:03