PAYATHON 2026

如何在 Prestashop 1.6 支付流程中强制 URL rewrite

支付老李

结论

可以实现,但只修改后台”SEO 和 URL”中的重写名称还不够。

PrestaShop 1.6 的结账步骤通常由同一个 OrderController 处理,step=1、step=2 只是传给该控制器的参数。后台只能为控制器配置一个友好 URL,无法根据不同的 step 参数分别生成 /shippingaddress、/paymentmethod。

要实现这些地址,需要通过模块注册自定义路由,让多个静态路径指向 order 控制器,并为每条路由设置固定的 step。结账模板中的链接生成方式也要一并修改,否则系统仍会输出 summary?step=1。

注册结账步骤路由

可以新建一个小型模块来承载路由,避免直接修改 Dispatcher.php、OrderController.php 或自动生成的 .htaccess。

在模块安装时注册 moduleRoutes Hook:

public function install()
{
    return parent::install()
        && $this->registerHook('moduleRoutes');
}

然后在模块主类中返回自定义路由:

public function hookModuleRoutes($params)
{
    return array(
        'checkout-summary' => array(
            'controller' => 'order',
            'rule' => 'summary',
            'keywords' => array(),
            'params' => array(
                'fc' => 'controller',
                'step' => 0,
            ),
        ),

        'checkout-shipping-address' => array(
            'controller' => 'order',
            'rule' => 'shippingaddress',
            'keywords' => array(),
            'params' => array(
                'fc' => 'controller',
                'step' => 1,
            ),
        ),

        'checkout-payment-method' => array(
            'controller' => 'order',
            'rule' => 'paymentmethod',
            'keywords' => array(),
            'params' => array(
                'fc' => 'controller',
                'step' => 2,
            ),
        ),
    );
}

访问 /shippingaddress 时,Dispatcher 会把请求交给 OrderController,并传入对应的 step 参数。

上面的步骤编号只是示例。PrestaShop 1.6 的标准五步结账、单页结账和经过修改的主题,使用的步骤编号可能不同。配置前应检查当前版本的 OrderController 和模板,确认各页面实际使用的 step。

生成新的链接

注册路由只能让系统识别新地址,不会自动替换模板中的原有链接。

自定义路由可以通过 Dispatcher::createUrl() 生成路径:

$route = Dispatcher::getInstance()->createUrl(
    'checkout-shipping-address',
    (int) $this->context->language->id
);

$url = $this->context->shop->getBaseURL(true) . $route;

再将生成的 URL 传给 Smarty:

$this->context->smarty->assign(array(
    'shipping_address_url' => $url,
));

模板中这样使用:

<a href="{$shipping_address_url|escape:'html':'UTF-8'}">
    Continue
</a>

Link::getPageLink('order', ..., 'step=1') 通常仍会按照 order 的默认路由生成地址,不会自动选择新注册的步骤路由。

还需要检查并替换以下位置中的旧链接:

  • 结账步骤导航;
  • “下一步”和”上一步”按钮;
  • 地址、配送方式和支付方式表单的 action;
  • JavaScript 中拼接的结账 URL;
  • 主题对结账控制器的覆盖文件。

旧 URL 跳转

如果旧地址已经被搜索引擎收录,可以在控制器或专用模块中将其重定向到新地址。例如,检测到旧的 order?step=1 请求时,将其跳转到 /shippingaddress。

不要统一重定向所有 order 请求,因为表单提交、AJAX 请求和支付回调也可能经过相关控制器。重定向至少应限制为 GET 请求,并准确判断 step:

if ($_SERVER['REQUEST_METHOD'] === 'GET'
    && Tools::getValue('controller') === 'order'
    && (int) Tools::getValue('step') === 1
) {
    Tools::redirect($shippingAddressUrl);
}

调试时建议先使用临时跳转。确认购物车、登录、地址选择和支付流程都能正常运行后,再考虑改为永久跳转。

配置完成后的操作

添加或修改路由后,需要完成以下操作:

  1. 确认后台已经启用”友好 URL”。
  2. 清除 PrestaShop 缓存和 Smarty 编译缓存。
  3. 在后台保存一次”SEO 和 URL”设置,让 PrestaShop 重新生成 .htaccess。
  4. 分别测试访客结账、注册用户结账、返回上一步和刷新页面。
  5. 测试所有支付模块的支付成功页、取消页和服务器回调。

注意事项

这些路由只会改变 URL 的表现形式,不会改变结账流程。用户能否进入某个步骤,仍由 OrderController 根据购物车、登录状态、地址和配送方式进行验证。

支付模块的通知地址、验证控制器和异步回调不能改写成普通结账步骤。例如,支付模块的 validation、confirmation 和 webhook 地址通常必须保留原有参数和模块路由,否则可能导致订单无法创建,或支付结果无法写回。

多语言商店还要为不同语言返回不同的 rule,并避免与 CMS 页面、产品或其他模块路由重名。如果必须确保 URL 中的步骤不受 ?step= 覆盖,可以增加一个轻量的前置控制器,显式设置允许的步骤,而不要完全依赖查询参数的合并顺序。

备注:内容仅供参考。