优惠券领取按钮没有防抖,用户手快点了五下,账户里出现五张同编号的券,核销时互相覆盖。券的到期时间还是同一天。日志里能对上时间点,这种反而好排。
领券接口只判断用户有没有领过,没有唯一约束,几个并发请求同时通过检查。前端按钮在请求回来前也没禁用。这一点先确认清楚,后面就不用反复试。
global $wpdb;
$uid = get_current_user_id();
$cid = intval($_POST['coupon_id']);
$wpdb->query($wpdb->prepare('INSERT IGNORE INTO ' . $wpdb->prefix . 'user_coupons (user_id, coupon_id) VALUES (%d, %d)', $uid, $cid));
wp_send_json_success();
「优惠券重复领取」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
改完顺手把文档补一句,省得下次自己重新推一遍。
处理上按这个顺序:数据库加用户加券的唯一索引,重复插入直接失败;前端点击后立即禁用,成功或失败再恢复;接口返回已领取时按成功处理,别报错让用户重复试。
结果对不对很好判断,快速连点五次领取按钮,账户里只有一张券,接口日志里四次返回已领取。
