php抢购秒杀逻辑

转载 原地址:https://www.tongpankt.com/7286

 

  1 <?php
  2 /**
  3  * 抢购的处理逻辑
  4  */
  5 
  6 include 'init.php';
  7 
  8 $TEMPLATE['type'] = 'buy';
  9 $TEMPLATE['pageTitle'] = '抢购';
 10 
 11 $active_model = new \model\Active();
 12 $goods_model = new \model\Goods();
 13 
 14 // 参数的处理
 15 $active_id = getReqInt('active_id');
 16 $goods_id = getReqInt('goods_id');
 17 $goods_num = getReqInt('goods_num');
 18 $sign_data = $_POST['sign_data'];
 19 $question_sign = $_POST['question_sign'];
 20 $ask = $_POST['ask'];
 21 $answer = $_POST['answer'];
 22 $action = isset($_POST['action']) ? $_POST['action'] : false;
 23 
 24 if ('buy_cart' == $action) {
 25     $goods_num = $_POST['num'][0];
 26 }
 27 $client_ip = getClientIp();
 28 
 29 // 1 验证用户是否登录
 30 if (!$login_userinfo || !$login_userinfo['uid']) {
 31     $result = array('error_no' => '101', 'error_msg' => '用户登录之后才可以参与');
 32     show_result($result);
 33 }
 34 $uid = $login_userinfo['uid'];
 35 $username = $login_userinfo['username'];
 36 // 2 验证参数是否正确、合法
 37 if (!$active_id || !$goods_id
 38     || !$goods_num || !$question_sign) {
 39     $result = array('error_no' => '102', 'error_msg' => '参数提交异常');
 40     show_result($result);
 41 }
 42 // 3.1 验证活动状态信息
 43 $status_check = false;
 44 $str_sign_data = unsignQuestion($sign_data);
 45 $sign_data_info = json_decode($str_sign_data, true);
 46 // 时间不能超过当前时间5分钟,IP和用户保持不变
 47 if ($sign_data_info
 48     && $sign_data_info['now'] < $now
 49     && $sign_data_info['now'] > $now - 300
 50     && $sign_data_info['ip'] == $client_ip
 51     && $sign_data_info['uid'] == $uid
 52 ) {
 53     $status_check = true;
 54 }
 55 if (!$status_check) {
 56     $result = array('error_no' => '103', 'error_msg' => '用户校验值验证没有通过');
 57     show_result($result);
 58 }
 59 // 3.2 验证问答信息是否正确
 60 $question_check = false;
 61 $str_question = unsignQuestion($question_sign);
 62 $question_info = json_decode(trim($str_question), true);
 63 if ($str_question && $question_info) {
 64     if ($question_info['ask'] == $ask
 65         && $question_info['answer'] == $answer
 66         && $question_info['aid'] == $active_id
 67         && $question_info['uid'] == $uid
 68         && $question_info['ip'] == $client_ip
 69         && $question_info['now'] > $now -300
 70     ) {
 71         $question_check = true;
 72     }
 73 }
 74 if (!$question_check) {
 75     $result = array('error_no' => '103', 'error_msg' => '问答验证没有通过');
 76     show_result($result);
 77 }
 78 
 79 // 统一格式化单商品、组合商品的数据结构
 80 $nums = $goods = array();
 81 if ('buy_cart' != $action) {
 82     $nums = array($goods_num);
 83     $goods = array($goods_id);
 84 } else {
 85     $num = $_POST['num'];
 86     $goods = $_POST['goods'];
 87 }
 88 
 89 $redis_obj = \common\Datasource::getRedis('instance1');
 90 $d_list = array(
 91     'u_trade_' . $uid . '_' . $active_id,
 92     'st_a_' . $active_id
 93 );
 94 /**
 95  * id, sys_status,
 96  * num_user, num_left,
 97  * price_normal, price_discount
 98  */
 99 foreach ($goods as $i => $goods_id) {
100     $d_list[] = 'info_g_' . $goods_id;  // 商品详情
101 }
102 $data_list = $redis_obj->mget($d_list);
103 // 4 验证用户是否已经购买
104 if ($data_list[0]) {
105     $result = array('error_no' => '104', 'error_msg' => '请不要重复提交订单');
106     show_result($result);
107 }
108 // 5 验证活动信息,商品信息是否正常
109 if ($data_list[1]) {
110     $result = array('error_no' => '105', 'error_msg' => '活动信息异常');
111     show_result($result);
112 }
113 unset($data_list[0]);
114 unset($data_list[1]);
115 /*
116 // 4 验证用户是否已经购买
117 $trade_model = new \model\Trade();
118 $trade_info = $trade_model->getUserTrade($uid, $active_id);
119 if ($trade_info) {
120     $result = array('error_no' => '104', 'error_msg' => '请不要重复提交订单');
121     show_result($result);
122 }
123 // 5 验证活动信息,商品信息是否正常
124 $active_info = $active_model->get($active_id);
125 if (!$active_info || $active_info['sys_status'] !== '1'
126     || $active_info['time_begin'] > $now
127     || $active_info['time_end'] < $now
128 ) {
129     $result = array('error_no' => '105', 'error_msg' => '活动信息异常');
130     show_result($result);
131 }
132 if ('buy_cart' != $action) {
133     $nums = array($goods_num);
134     $goods = array($goods_id);
135 } else {
136     $nums = $_POST['num'];
137     $goods = $_POST['goods'];
138 }
139 */
140 $num_total = $price_total = $price_discount = 0;
141 $trade_goods = array();
142 foreach ($data_list as $i => $goods_info) {
143     $goods_num = $nums[$i - 2];
144 //    $goods_info = $goods_model->get($goods_id);
145     if (!$goods_info || $goods_info['sys_status'] !== '1') {
146         $result = array('error_no' => '106', 'error_msg' => '商品信息异常');
147         show_result($result);
148     }
149 // 6 验证用户购买的商品数量是否在限制的范围内
150     if ($goods_num > $goods_info['num_user']) {
151         $result = array('error_no' => '107', 'error_msg' => '超出商品数量的限制');
152         show_result($result);
153     }
154 // 7 验证商品是否还有剩余数量
155     if ($goods_info['num_left'] < $goods_num) {
156         $result = array('error_no' => '108', 'error_msg' => '商品剩余数量不足');
157         show_result($result);
158     }
159 // 8 扣除商品剩余数量
160     $left = $goods_model->changeLeftNumCached($goods_id, 0-$goods_num);
161     $ok = false;
162     if ($left >= 0) {
163         $ok = $goods_model->changeLeftNum($goods_id, 0-$goods_num);
164     } else {
165         // 扣除商品库存失败
166         $goods_model->changeStatusCached($goods_id, 0);
167         $result = array('error_no' => '108', 'error_msg' => '商品剩余数量不足');
168         show_result($result);
169     }
170 
171 
172 // 9.1 创建订单信息,订单的商品信息
173     $trade_goods[] = array(
174         'goods_info' => $goods_info,
175         'goods_num' => $goods_num
176     );
177     $num_total += $goods_num;
178     $price_total += $goods_info['price_normal'] * $goods_num;
179     $price_discount += $goods_info['price_discount'] * $goods_num;
180 }
181 // 9.2 保存订单信息
182 $trade_model = new \model\Trade();
183 $trade_info = array(
184     'active_id' => $active_id,
185     'goods_id' => $goods_id,
186     'num_total' => $num_total,
187     'num_goods' => count($goods),
188     'price_total' => $price_total,
189     'price_discount' => $price_discount,
190     'goods_info' => json_encode($trade_goods),
191     'uid' => $uid,
192     'username' => $username,
193     'sys_ip' => $client_ip,
194     'sys_dateline' => $now,
195     'time_confirm' => $now,
196     'sys_status' => 1,
197 );
198 foreach ($trade_info as $k => $v) {
199     $trade_model->$k = $v;
200 }
201 $trade_id = $trade_model->create();
202 if ($trade_id) {
203     $redis_obj->set('u_trade_' . $uid . '_' . $active_id, 1, 86400);
204 }
205 
206 // 10 返回提示信息
207 $result = '秒杀成功,请尽快去支付';
208 show_result($result, '/trade.php');

 

posted @ 2018-11-21 12:02  泡椒味的不二家  阅读(456)  评论(0编辑  收藏  举报