如何在 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);
}
调试时建议先使用临时跳转。确认购物车、登录、地址选择和支付流程都能正常运行后,再考虑改为永久跳转。
配置完成后的操作
添加或修改路由后,需要完成以下操作:
- 确认后台已经启用”友好 URL”。
- 清除 PrestaShop 缓存和 Smarty 编译缓存。
- 在后台保存一次”SEO 和 URL”设置,让 PrestaShop 重新生成
.htaccess。 - 分别测试访客结账、注册用户结账、返回上一步和刷新页面。
- 测试所有支付模块的支付成功页、取消页和服务器回调。
注意事项
这些路由只会改变 URL 的表现形式,不会改变结账流程。用户能否进入某个步骤,仍由 OrderController 根据购物车、登录状态、地址和配送方式进行验证。
支付模块的通知地址、验证控制器和异步回调不能改写成普通结账步骤。例如,支付模块的 validation、confirmation 和 webhook 地址通常必须保留原有参数和模块路由,否则可能导致订单无法创建,或支付结果无法写回。
多语言商店还要为不同语言返回不同的 rule,并避免与 CMS 页面、产品或其他模块路由重名。如果必须确保 URL 中的步骤不受 ?step= 覆盖,可以增加一个轻量的前置控制器,显式设置允许的步骤,而不要完全依赖查询参数的合并顺序。
备注:内容仅供参考。
