后台已经把 Enable Terms and Conditions 设为Yes,但结账页付款按钮上方什么都没有。这个功能有两层开关:全局配置允许显示,具体协议还必须启用并分配给当前Store View。

先看数据,不猜前端

bin/magento config:show checkout/options/enable_agreements

SELECT agreement_id,name,is_active,mode FROM checkout_agreement;
SELECT * FROM checkout_agreement_store ORDER BY agreement_id,store_id;

当前Store ID不在checkout_agreement_store时,协议不会进入checkoutConfig。到 Stores > Terms and Conditions 编辑协议,勾选正确的Store View,状态设为Enabled,内容不能为空。

页面配置里到底有没有协议

打开结账页控制台:

console.log(window.checkoutConfig && window.checkoutConfig.checkoutAgreements);

数组为空:继续查Store关联与配置缓存。数组有数据但页面不显示:问题在jsLayout或模板覆盖。

自定义主题最容易漏掉的节点

搜索 before-place-order、agreements 和 Magento_CheckoutAgreements。某些一步结账模块重写payment组件时,没有保留agreements子节点。

grep -R "checkout-agreements|before-place-order|Magento_CheckoutAgreements" app/design app/code -n
bin/magento cache:clean config layout block_html full_page

把自定义布局与vendor/magento/module-checkout-agreements/view/frontend/layout/checkout_index_index.xml对照,恢复组件节点,不要直接把复选框HTML硬编码到模板,因为提交时还要传agreement_ids并由后端验证。

验收要覆盖两种模式

  • Mode为Manually时必须勾选才能下单;
  • Mode为Automatically时应展示内容但无需复选;
  • 游客和登录客户都测试;
  • 每种支付方式各下单一次,尤其是重写Place Order按钮的钱包支付;
  • 切换到未分配协议的Store View,确认不会误显示。
若业务要求强制同意,不能只做前端required校验;必须保留后端agreement validator,防止直接调用REST绕过。