You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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):

    1. 在插件模板中添加JS代码:
      $(document).ready(function() {
          $.post('/frontend/Basket/addArticle', {
              sAdd: '101',
              sQuantity: 1,
              csrf_token: window.csrfToken
          });
      });
      
    2. 移除事件中直接调用sAddArticle的代码,改为渲染上述JS模板。

内容的提问来源于stack exchange,提问作者Softec

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 13:37:12