Shopware 5调用sAddArticle触发CSRFTokenValidationException错误求助
问题分析
sAddArticle属于购物车敏感操作,Shopware 5会对这类操作强制校验CSRF token。你在Enlight_Controller_Action_PostDispatch_Frontend_Detail事件中直接调用该方法时,处于页面渲染的GET请求上下文,未携带合法的CSRF token,因此触发验证异常。
解决方案
方法一:切换到后台上下文执行操作
后台购物车操作不受前端CSRF限制,可临时切换上下文绕过校验:public function onPostDispatchDetail(Enlight_Controller_ActionEventArgs $args) { $contextService = Shopware()->Container()->get('shopware_storefront.context_service'); $currentContext = $contextService->getCurrentContext(); try { // 切换到后台商店上下文 $contextService->setCurrentContext( Shopware()->Container()->get('shopware_storefront.context_factory')->createShopContext() ); Shopware()->Modules()->Basket()->sAddArticle('101',1); } finally { // 恢复原上下文 $contextService->setCurrentContext($currentContext); } }方法二:手动传递合法CSRF token
从当前请求中提取CSRF token,作为参数传入sAddArticle:public function onPostDispatchDetail(Enlight_Controller_ActionEventArgs $args) { $request = $args->getRequest(); // 从请求参数或Cookie中获取token $csrfToken = $request->getParam('csrf_token') ?: $request->cookies->get('csrf_token'); // 携带token执行添加操作 Shopware()->Modules()->Basket()->sAddArticle('101', 1, ['csrf_token' => $csrfToken]); }方法三:前端异步请求触发操作
不在页面渲染阶段直接调用方法,改为前端通过POST请求触发(自动携带CSRF token):- 在插件模板中添加JS代码:
$(document).ready(function() { $.post('/frontend/Basket/addArticle', { sAdd: '101', sQuantity: 1, csrf_token: window.csrfToken }); }); - 移除事件中直接调用
sAddArticle的代码,改为渲染上述JS模板。
- 在插件模板中添加JS代码:
内容的提问来源于stack exchange,提问作者Softec
相关产品推荐
相关产品推荐

