如何在 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;如果已经存在,则更新订单记录或写入订单历史。
备注:内容仅供参考。
