PAYATHON 2026

如何在 OpenCart payment controller 中更新 checkout comment?

支付阿杰

结论

Checkout comment 可以设置或更新,但处理方式取决于订单是否已经创建:

  • 订单创建前:修改 $this->session->data['comment']。
  • 订单创建后:只修改 Session 不会同步到订单表,需要更新订单记录,或者将内容写入订单历史。

订单创建前设置 comment

如果 payment controller 执行时订单还没有写入数据库,可以直接设置:

if (!isset($this->session->data['comment'])) {
    $this->session->data['comment'] = 'Payment comment';
}

如果空字符串也算尚未设置,可以使用:

if (empty($this->session->data['comment'])) {
    $this->session->data['comment'] = 'Payment comment';
}

更新已有内容时,最好保留顾客原来的留言:

$payment_comment = 'Payment verified';

if (!empty($this->session->data['comment'])) {
    $this->session->data['comment'] .= "\n" . $payment_comment;
} else {
    $this->session->data['comment'] = $payment_comment;
}

OpenCart 创建订单时,通常从以下位置读取留言:

$this->session->data['comment']

因此,只有在调用订单创建逻辑之前设置,comment 才会随订单写入数据库。

订单已经创建时

不少 OpenCart 结账流程会先创建订单,再加载 payment controller。此时 Session 中通常已经有:

$this->session->data['order_id']

如果 order_id 已经生成,再修改 $this->session->data['comment'],通常不会自动更新数据库中的 order.comment。

可以在自定义 payment model 中添加一个专门的更新方法:

public function updateOrderComment($order_id, $comment) {
    $this->db->query(
        "UPDATE `" . DB_PREFIX . "order`
         SET `comment` = '" . $this->db->escape($comment) . "'
         WHERE `order_id` = '" . (int)$order_id . "'"
    );
}

然后在 payment controller 中调用:

$order_id = $this->session->data['order_id'] ?? 0;

if ($order_id) {
    $comment = 'Payment verified';

    $this->load->model('extension/payment/example');
    $this->model_extension_payment_example->updateOrderComment(
        $order_id,
        $comment
    );
}

如果需要保留原有的 Checkout comment,应先读取订单,再追加新内容:

$order_id = $this->session->data['order_id'] ?? 0;

if ($order_id) {
    $this->load->model('checkout/order');

    $order_info = $this->model_checkout_order->getOrder($order_id);

    if ($order_info) {
        $payment_comment = 'Payment verified';
        $comment = trim((string)$order_info['comment']);

        $comment = $comment !== ''
            ? $comment . "\n" . $payment_comment
            : $payment_comment;

        $this->load->model('extension/payment/example');
        $this->model_extension_payment_example->updateOrderComment(
            $order_id,
            $comment
        );
    }
}

也可以写入订单历史

如果要记录的是支付结果、交易号或网关返回信息,写入订单历史通常比覆盖顾客填写的 Checkout comment 更合适:

$this->load->model('checkout/order');

$this->model_checkout_order->addOrderHistory(
    $order_id,
    $order_status_id,
    'Payment transaction ID: ' . $transaction_id,
    false
);

false 通常表示不向顾客发送状态通知。具体参数和行为可能因 OpenCart 版本或扩展修改而异,使用前应核对当前版本中 addOrderHistory() 的方法签名。

注意事项

  • 除非业务明确要求,否则不要直接覆盖顾客留言。
  • 字符串必须通过 $this->db->escape() 处理,order_id 也要转换为整数。
  • 支付回调可能重复触发。追加 comment 时要考虑幂等性,避免同一内容被多次写入。
  • OpenCart 2.x、3.x 和 4.x 在扩展目录、命名空间和 model route 上存在差异。上面的加载路径主要适用于常见的 OpenCart 2.x/3.x 结构。
  • 判断时可以直接检查 payment controller 执行时是否已有 $this->session->data['order_id']。如果没有,就设置 Session;如果已经存在,则更新订单记录或写入订单历史。

备注:内容仅供参考。