PAYATHON 2026

如何检查 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 是否启用无关,不要混用这两个配置。

备注:内容仅供参考。