用户输入 save20 提示优惠码无效,改成 SAVE20 就能用,客服每天收到十几条同样的反馈。后台日志里记的也是小写。日志里能对上时间点,这种反而好排。
核销逻辑拿原始输入直接比对,数据库里的码是大写,比较区分大小写。前端也没做去空格和统一大小写。这一点先确认清楚,后面就不用反复试。
$code = strtoupper(trim($_POST['coupon_code']));
$coupon = wc_get_coupon_id_by_code($code);
if (! $coupon) { wc_add_notice('优惠码无效', 'error'); }
「优惠码大小写」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
处理上按这个顺序:提交前 trim 并转大写,前后端用同一套归一规则;数据库查询用不区分大小写的排序规则,或者在比较时统一转大写;别只在模板里加 text-transform,那只是显示效果,提交值没变。
结果对不对很好判断,输入 save20、Save20 和前后带空格的值,都能正常抵扣,金额一致。
