结账页地址已经填完,点下一步却回到邮箱输入区,控制台没有明显报错。常见原因是自定义登录提示插件改写了customers/isEmailAvailable的返回结构,前端拿到字符串“false”而不是布尔值。

问题不在表面

先用一个真实失败样本复现,不要一上来全量重建。把请求、实体ID和时间记下来,后面的SQL与日志才能对得上。

几条命令足够定位

  • Network里找到V1/customers/isEmailAvailable,核对状态码、Content-Type和响应值类型。
  • 无痕窗口与已登录窗口分别测,排除localStorage里残留的checkout-data。
curl -sS -X POST "https://shop.example.com/rest/default/V1/customers/isEmailAvailable" -H "Content-Type: application/json" -d '{"customerEmail":"test@example.com","websiteId":1}'
grep -R "isEmailAvailable" app/code vendor/* -n
bin/magento cache:clean full_page block_html

这里的重点不是把报错暂时消掉,而是让同一操作再执行一次仍保持幂等;因此修复后一定要做第二次重复执行测试。

改动落在哪里

移除对AccountManagementInterface::isEmailAvailable返回值的字符串化处理;插件after方法必须返回bool。若业务要求已注册邮箱也允许游客下单,只调整checkoutConfig与提示文案,不要伪造接口返回。修复JS mixin后同时删除pub/static对应文件并重新部署静态资源。

实施时的顺序

  • 先在单个SKU、单个订单或单个Store验证。
  • 保留可回退的旧配置,不覆盖原始证据。
  • 需要批量处理时分批提交并输出成功/失败清单。

验收清单

  • 接口JSON响应是true或false而非带引号字符串
  • 输入新邮箱和已注册邮箱都能进入配送步骤
  • 刷新页面后步骤状态仍正确
  • 服务端quote的customer_is_guest值符合预期

验收不只看后台提示“成功”。我还会从前台/API再走一次真实链路,并在下一轮cron、索引或缓存命中后重复检查,确认不是短暂正常。

不要这样处理

不要用关闭客户账户共享范围来掩盖问题,多站点下websiteId算错会造成更隐蔽的跨站判断。