用户把商品加入购物车,刷新页面后购物车变空;或者登录以后,游客购物车里的商品少了一部分。表面上都是“购物车消失”,实际可能是 Session 换了,也可能是 Quote 合并时商品被重新校验后移除。

先判断整个购物车丢了,还是只有商品被移除

如果购物车 ID 和 Session 同时变化,优先看 Cookie、Redis Session 和负载均衡。如果 Quote 仍存在,只少了某几个商品,则检查商品是否在当前网站可售。

常见的 Session 问题

  • Cookie 域与当前域名不匹配。
  • HTTP 与 HTTPS 跳转导致 Secure Cookie 行为异常。
  • 多个 Web 节点没有共享 Session。
  • Redis 内存淘汰了仍在使用的 Session。
  • 前端和结账使用了不同二级域名,但 Cookie 范围不正确。

在浏览器 Network 中观察加入购物车前后的 Session Cookie,不要记录或传播完整 Cookie 值。

登录时 Quote 会合并

游客登录后,Magento 会把游客 Quote 与客户现有 Quote 合并。重复 SKU、不同自定义选项、最小购买量或失效商品都可能改变合并结果。测试时要先确认客户账户中是否已经有旧购物车。

商品重新校验失败

刷新购物车或进入结账时,系统会再次检查商品状态、网站分配、库存、必填选项和购买数量。商品刚被禁用、子商品缺货或自定义选项被删除时,可能从可购买状态变为错误状态。

自定义插件不要在 collectTotals 中删除项目

一些促销或库存扩展会在 totals 计算时调用 removeItem()。Totals 可能在一个请求中执行多次,这种写法容易造成难以复现的丢商品。业务限制应返回明确错误,让用户知道为什么不能购买。

排查时给一次请求记录 quote_id、customer_id、store_id 和被移除的 item_id,不记录支付或认证信息。用同一浏览器分别测试游客刷新、登录合并、切换 Store View 和进入结账,通常能很快确定商品在哪一步消失。