优惠码“看起来没问题”并不代表当前quote满足规则。Magento会同时判断Website、客户组、起止日期、使用次数、Action条件和商品可应用状态,任意一项不满足都会得到同一个无效提示。

用数据库把规则真实状态一次看全

SELECT r.rule_id,r.name,r.is_active,r.from_date,r.to_date,r.uses_per_coupon,r.uses_per_customer,c.code,c.usage_limit,c.times_used
FROM salesrule r
JOIN salesrule_coupon c ON c.rule_id=r.rule_id
WHERE c.code='SAVE20';

SELECT * FROM salesrule_website WHERE rule_id=123;
SELECT * FROM salesrule_customer_group WHERE rule_id=123;

把123替换为查询出的rule_id。若后台时间显示当天仍有效,但数据库的to_date已经跨日,先核对PHP、Magento配置与数据库时区:

date
php -r 'echo date_default_timezone_get()," ",date("c"),PHP_EOL;'
mysql -e "SELECT NOW(),@@session.time_zone,@@global.time_zone"

常见的三个真因

1. Quote里已有旧的coupon_code

先调用购物车接口删除旧码,再重新应用。前端自定义组件如果只更新显示值、没有调用DELETE接口,后台仍会按旧码计算。

DELETE /rest/default/V1/carts/mine/coupons
PUT /rest/default/V1/carts/mine/coupons/SAVE20

2. 条件写在了错误层级

Conditions决定整张购物车是否进入规则,Actions决定哪些商品享受折扣。把SKU或分类条件误放到Conditions时,只要购物车里有一件商品不符合组合逻辑,规则就可能整体失败。先把规则复制到测试环境,逐层删除条件,找到最小失败节点。

3. 使用次数已被占用

失败订单、取消订单和游客重复提交都可能让业务误以为次数还够。先查 salesrule_coupon_usage 与 salesrule_customer,确认后再决定是否回补。不要直接把times_used清零;应先找对应订单和客户,做带审计记录的定向修正。

最后这样验收

  • 无痕窗口测试游客与登录客户;
  • 分别使用符合和不符合条件的SKU;
  • 检查quote、order中的coupon_code及discount_amount;
  • 跨零点规则要在网站配置时区下再测一次;
  • 若使用Varnish,确认优惠码接口未被缓存。