结账时提示 Please enter a valid phone number,不要先把 telephone 改成非必填。这个提示可能来自浏览器端自定义正则、第三方地址模块,或后端地址验证。第一步是确认错误发生在输入时、点击 Next 时,还是 place order 接口返回后。

识别报错来源

  1. 打开 Console 和 Network,输入一个纯数字测试号码。
  2. 如果离开输入框立即报错,查看元素的 class、data-validate 和 Knockout 配置。
  3. 如果点击 Next 后报错,查看 shipping-information 请求响应。
  4. 如果最后下单才失败,保存 payment-information 请求的响应体和服务端日志时间。

不要在日志或工单中记录真实客户电话,使用测试号码复现。

检查 telephone 客户属性配置

后台 Stores → Configuration → Customers → Customer Configuration → Name and Address Options 中核对 Show Telephone。再检查 EAV 属性:

SELECT attribute_id, attribute_code, is_required, frontend_class
FROM eav_attribute
WHERE attribute_code='telephone';

frontend_class 或扩展属性可能添加了 validate-phoneStrict 等规则。前端组件又可能在 layout processor 中覆盖它。

找到是谁注册了验证规则

grep -R --line-number --include='*.js' --include='*.php' --include='*.xml' \
  -E 'valid phone number|validate-phone|telephone.*validation|phoneStrict' \
  app/code app/design vendor/vendorname 2>/dev/null

如果多个模块使用同一规则名,后加载的定义会覆盖前一个。检查 requirejs mixin 和 checkout layout processor 的执行顺序。

用国家维度测试,而不是只换一个号码

国家输入样例目的
中国 本地格式与 +86 格式 检查空格、加号和位数
美国 10 位与 +1 格式 检查括号/连字符
无固定格式国家 短号与国际格式 防止正则过度限制

业务若需要严格验证,正则应随 country_id 变化;一个全球通用的固定 11 位规则一定会误伤。

后端仍需独立校验和标准化

不能只删除前端规则。REST/GraphQL 或恶意请求可绕过 JavaScript。建议后端允许业务接受的字符,去除展示空格后做长度和国家校验,并返回明确字段错误。不要擅自把客户输入改成另一个号码。

tail -f var/log/exception.log var/log/system.log
grep -R --line-number 'telephone' app/code/*/*/Plugin app/code/*/*/Observer 2>/dev/null

完成修改后测试访客结账、登录客户旧地址、新建地址、后台创建订单和 API 下单。电话号码保存到 quote_address 与 order_address 后应一致,且历史地址仍可正常选择。