微信小程序中的商品存在超卖问题?
原方案: 用户调起微信支付->输入支付密码->服务器验证支付成功->扣减库存
场景1: 用户调起微信支付模态框(长时间停留页面,并不输入支付密码)
场景2: 前面输入支付密码后还未验证支付是否成功,这个时候并没有扣减库存(微信支付回调的响应时间),多个用户同时调起微信支付,
新方案: Redis建立商品虚拟库存->用户小程序中输入支付密码调用统一下单接口时 直接扣减虚拟库存 -> 验证微信回调后若支付失败更新虚拟库存;若支付成功扣减mysql实际库存
1.支付前
A. 库存10(虚拟库存8): => 1个用户打开支付模态框(未输入支付密码) 用户长时间未输入密码(停留页面)=> 扣减虚拟库存websocket更新页面 (redis可设置输入密码有效期强制更新用户页面)
B. 库存10(虚拟库存8): => 100个用户同时点击提交支付按钮(支付模态框前)->使用redis队列(包括A场景)->扣减虚拟库存至0 => 实时反馈另外93个用户商品售罄;
小程序调用统一下单接口时,服务器检查虚拟库存是否可以扣减;如果虚拟库存为0 ->返回错误参数到前台 ->支付失败
若还是存在用户付款并没有商品->原路退款
大家有没有什么更好的方案防止超卖? 交流一下
我觉得重点是尽量让用户付款后可以有库存扣减 -> 如果没有实时反馈->阻断支付
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…