访客已经把商品加入购物车,登录后数量却变成 0,先确认是 Quote 真的没有合并,还是页面上的 mini cart 没有刷新。直接进入购物车页面并重新加载;如果商品仍在,只是右上角显示 0,问题更可能在 customer-data 缓存和前端组件。

理解登录时的 Quote 合并

Magento 会为访客维护 active quote,客户登录后再与该客户原有的 active quote 合并。检查同一客户和商店下的记录:

SELECT entity_id, customer_id, store_id, is_active,
       items_count, items_qty, updated_at
FROM quote
WHERE customer_id = 123
ORDER BY updated_at DESC;

访客 quote 在登录前没有 customer_id,需要通过服务器日志或调试确认 session 中的 quote_id。不要在生产环境随意把旧 quote 改成 active,这可能把历史购物车或已下单数据重新带回。

自定义登录、社交登录和单页结账模块经常绕过标准 customer session 或提前替换 checkout session,导致 merge 没有执行。检查它们是否调用标准登录流程,以及对 checkout_session、QuoteRepository 的 plugin 是否改变了 active quote。

Cookie 与网站作用域必须一致

如果加入购物车使用一个域名,登录跳转到另一个子域、HTTP/HTTPS 或不同网站,浏览器可能没有发送原来的 session Cookie。核对 Base URL、Cookie Domain、Cookie Path、Secure 和 SameSite 配置。反向代理终止 HTTPS 时,Magento 还要正确识别原始协议,否则会生成不同安全属性的 Cookie。

多网站环境中,quote 绑定 store。客户跨网站登录后是否应该共享购物车,取决于客户账户共享范围和业务设计,不能简单把所有 store 的 quote 合并。

页面显示为 0 时检查 private content

mini cart 使用 customer-data sections。主题或扩展在登录成功后没有失效 cart section,就会显示旧数据。浏览器控制台查看 RequireJS 错误,并检查 localStorage 中相关 section 是否更新。不要把整个 localStorage 每次都清空作为线上解决方案,应修复 section invalidation。

验证时准备三种场景:客户没有旧购物车、客户已有旧购物车、访客与客户购物车包含相同 SKU。分别确认数量合并、可配置选项和优惠券结果,并检查数据库中的 active quote 数量。这样才能发现是会话丢失、合并规则还是仅前端显示的问题。