创建订单并支付完成后(创建订单不减“库存”
),支付网关回调,走如下流程:
取订单号关联的所有第 X 期的商品和购买数量,然后循环取码
foreach ($goods as &$good)
{
// 从 Redis 的一个 Sets 中取$number 个号码(随机)
// SPOP 第二个参数在 3.2 才有
$codes = \Redis::spop("code:".$good->id,$good->number);
// 没码了(也就是卖完了) 返回 NULL
if (!$codes)
{
// 这一期的商品执行退款操作到网站账户余额
// 并删除
}
// 如果取的码的数量小于需求数量 也表示卖完了
if (count($codes)<$good->number)
{
// 退回多余的支付款项到网站账户余额
}
$good->codes = $codes;
// 创建购买完成订单数据记录 balabalabalabala
// 记录已经售完的商品期数ID
$finish_goods_ids = [....,.....,.....,.....];
}
if ($finish_goods_ids) {
// 访问彩票接口获取下期开奖时间和彩票期数
// 循环设置
// 接口访问失败,前台友好提示,入故障队列
}
$goods->save();
// 如果发生异常,回滚事务,退还已经取出的码到 Redis 中
如果在高并发情况下, redis 已取出,最终异常又退回的。怎么保障其他支付结果仍能顺利的取到码?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.