如何检查 PrestaShop 是否启用了 onepage checkout?
支付阿杰
判断方法
在 PrestaShop 1.5.3 中,可以读取配置项 PS_ORDER_PROCESS_TYPE,判断是否启用了 One Page Checkout:
$isOnePageCheckout = (int) Configuration::get('PS_ORDER_PROCESS_TYPE') === 1;
该配置通常有两个值:
0:标准分步结账1:One Page Checkout
在支付模块中检查
在支付模块的控制器或业务方法中,可以这样判断:
<?php
$isOnePageCheckout = (int) Configuration::get('PS_ORDER_PROCESS_TYPE') === 1;
if ($isOnePageCheckout) {
// One Page Checkout 模式
} else {
// 标准分步结账模式
}
建议先把配置值转换为整数,因为 Configuration::get() 可能返回字符串,例如 '0' 或 '1'。
如果代码位于模块类中,也可以封装成一个方法:
public function isOnePageCheckoutEnabled()
{
return (int) Configuration::get('PS_ORDER_PROCESS_TYPE') === 1;
}
调用方式如下:
if ($this->isOnePageCheckoutEnabled()) {
// OPC 相关处理
}
不要只检查控制器名称
One Page Checkout 通常使用与标准结账不同的控制器流程,但仅凭当前控制器名称判断并不可靠。例如:
$this->context->controller->php_self === 'order-opc'
这个判断只能说明当前请求可能来自 OPC 控制器,不能准确反映后台是否启用了 One Page Checkout。AJAX 请求、支付回调和自定义主题都可能改变实际的请求流程。
因此,判断后台配置时应读取 PS_ORDER_PROCESS_TYPE。如果需要确认当前请求所在的页面,可以额外检查控制器,但不要把它作为唯一依据。
支付模块需要注意的地方
支付网关不应让订单创建逻辑依赖某一种结账页面。无论使用标准分步结账还是 One Page Checkout,执行支付前都应重新验证购物车和客户信息:
$cart = $this->context->cart;
$customer = $this->context->customer;
if (!$cart || !$cart->id || !$customer || !$customer->isLogged()) {
// 根据模块设计返回错误或中止支付
}
还需要确认以下数据完整:
- 购物车有效
- 配送地址和账单地址有效
- 已选择配送方式
- 货币和订单金额正确
- 当前支付模块支持购物车所属国家及使用的货币
One Page Checkout 经常通过 AJAX 分阶段更新地址、配送方式和购物车信息。不要假设用户进入支付区域后,所有数据就已经永久保存。收到最终支付请求时,仍应从当前购物车重新读取并校验这些数据。
PS_GUEST_CHECKOUT_ENABLED 控制是否允许访客结账,与 One Page Checkout 是否启用无关,不要混用这两个配置。
备注:内容仅供参考。
