我遇到的场景是:客户在结账页停留着,又在另一个标签页登录账户,回来继续提交就报 No such entity with cartId。这不是 quote 表一定丢了,而是前端还握着旧的 guest cart 标识,登录动作已经把购物车合并到 customer quote。

先确认报错用的是旧masked_id还是新quote_id

在浏览器 Network 里看失败的 GraphQL 或 REST 请求。如果请求里还是登录前的 maskedCartId,再查:

SELECT quote_id, masked_id
FROM quote_id_mask
WHERE masked_id = '请求里的ID';

然后确认对应 quote 是否仍然 active:

SELECT entity_id, customer_id, is_active, updated_at
FROM quote
WHERE entity_id = 12345;

如果登录后生成或激活了另一个 customer quote,旧 masked ID 继续请求自然会找不到有效购物车。

登录完成后必须让checkout重新取customer-data

自定义登录弹窗或单页应用最常漏掉这一段:登录成功只改了页面上的用户状态,却没有失效 cart、customer 等 section,也没有重新初始化 checkout。

define(['Magento_Customer/js/customer-data'], function (customerData) {
    'use strict';
    customerData.invalidate(['customer', 'cart']);
    customerData.reload(['customer', 'cart'], true);
});

如果是 Headless 前端,登录或合并购物车成功后要丢弃旧 cart token,以服务端返回的新 cart ID 为准。不要捕获异常后无限重试原 ID,那只会把同一个无效请求打很多遍。

验证时打开两个标签页复现完整过程:游客加购、打开结账、另一页登录、回到结账。页面应主动重新加载购物车,而不是继续提交旧 masked ID。