这次问题很迷惑:applyCouponToCart返回了cart,applied_coupons里也有代码,但prices里的discount还是0。前端同事一直怀疑缓存,最后发现是规则需要配送国家,而这辆cart还没有shipping address。优惠码被记录,不等于规则已经产生折扣。
mutation {
applyCouponToCart(input:{cart_id:"MASKED_ID",coupon_code:"SAVE20"}) {
cart { applied_coupons { code } prices { subtotal_excluding_tax { value } discounts { amount { value } label } grand_total { value } } }
}
}
我一般先用同一个cart_id补齐邮箱、配送地址和shipping method,再重新查prices。如果这时出现折扣,Magento本身没坏,是调用顺序不完整。规则后台还要看Website、Customer Group、起止日期以及Conditions和Actions到底放在哪一层。
别忘了客户组
游客是NOT LOGGED IN组,登录前后customer group会变。某些PWA登录后继续拿旧的guest masked cart查询,看起来像“同一个购物车”,实际合并后ID已经换了。把mutation响应里的cart和随后query使用的cart_id对一遍。
SELECT rule_id,name,is_active,from_date,to_date FROM salesrule WHERE name LIKE '%SAVE20%'; SELECT * FROM salesrule_customer_group WHERE rule_id=<rule_id>; SELECT * FROM salesrule_website WHERE rule_id=<rule_id>;
最后才考虑缓存。购物车GraphQL是私有数据,CDN不应缓存带Authorization的请求。用两辆金额不同的cart交叉请求,能立刻看出是不是代理缓存串了。

