member_buy.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  1. <?php
  2. /**
  3. * 购买
  4. *
  5. *
  6. *
  7. *
  8. */
  9. //use Shopnc\Tpl;
  10. defined('InShopNC') or exit('Access Invalid!');
  11. require_once(BASE_HELPER_PATH . '/bonus_helper.php');
  12. require_once(BASE_HELPER_PATH . '/buy_first.php');
  13. require_once(BASE_HELPER_PATH . '/pay_helper.php');
  14. require_once(BASE_HELPER_PATH . '/fcode/operator.php');
  15. require_once(BASE_HELPER_PATH . '/fcode/send_manager.php');
  16. require_once(BASE_HELPER_PATH . '/user_session/fcode.php');
  17. require_once(BASE_HELPER_PATH . '/calc_helper.php');
  18. class member_buyControl extends mbMemberControl
  19. {
  20. private $mFcodeBannerID;
  21. public function __construct()
  22. {
  23. parent::__construct();
  24. global $config;
  25. $this->mFcodeBannerID = $config['autosend_fcodes']['payconfirm_spid'];
  26. }
  27. public function calc_cashOp()
  28. {
  29. $cart_ids = explode(',', urldecode($_POST['cart_id']));
  30. if (empty($cart_ids))
  31. {
  32. return self::outerr(errcode::ErrParamter);
  33. }
  34. $logic_buy = Logic('buy');
  35. $id_num = $this->pay_goods($cart_ids);
  36. //得到购买数据
  37. $result = $logic_buy->buyStep1($id_num, $_POST['ifcart'], $_SESSION['member_id'], $_SESSION['store_id']);
  38. if (!$result['state'])
  39. {
  40. return self::outerr(errcode::ErrOrder, $result['msg']);
  41. }
  42. else
  43. {
  44. $result = $result['data'];
  45. }
  46. $buy_helper = new buy_first($result, $this->price_calcer());
  47. if ($buy_helper->check_fcode($error) == false)
  48. {
  49. return self::outerr(errcode::ErrPayment, $error);
  50. }
  51. else
  52. {
  53. $result = $buy_helper->format();
  54. $cash_amount = $result['payinfo']['pay_car_pred'];
  55. $total_amonut = $result['payinfo']['pay_car_nopred'];
  56. return self::outsuccess(['cash_amount' => $cash_amount, 'goods_amount' => $total_amonut, 'payinfo' => $result['payinfo']]);
  57. }
  58. }
  59. public function step_firstOp()
  60. {
  61. $cart_ids = explode(',', urldecode($_POST['cart_id']));
  62. if (empty($cart_ids))
  63. {
  64. return self::outerr(errcode::ErrParamter);
  65. }
  66. $virtual_goods = $this->virtual_goods($_POST, $cart_ids);
  67. if ($virtual_goods == false) {
  68. $logic_buy = Logic('buy');
  69. $id_num = $this->pay_goods($cart_ids);
  70. $result = $logic_buy->buyStep1($id_num, $_POST['ifcart'], session_helper::memberid(), $_SESSION['store_id']);
  71. $fVirual = false;
  72. }
  73. else {
  74. #虚拟商品
  75. $logic_buy = Logic('buy_virtual');
  76. $result = $logic_buy->getBuyStep2Data($virtual_goods['goods_id'], $virtual_goods['num'], session_helper::memberid());
  77. $fVirual = true;
  78. }
  79. if (!$result['state']) {
  80. return self::outerr(errcode::ErrOrder, $result['msg']);
  81. }
  82. else {
  83. $result = $result['data'];
  84. }
  85. if ($fVirual) {
  86. $buy_helper = new buyv_first($result, $this->price_calcer());
  87. }
  88. else {
  89. $buy_helper = new buy_first($result, $this->price_calcer());
  90. }
  91. if ($buy_helper->check_fcode($error) == false) {
  92. return self::outerr(errcode::ErrPayment, $error);
  93. }
  94. else {
  95. $result = $buy_helper->format();
  96. return self::outsuccess($result);
  97. }
  98. }
  99. private function virtual_goods($input, $cart_id)
  100. {
  101. if (boolval($input['ifcart']) == true) return false;
  102. //存放所购商品ID和数量组成的键值对
  103. $buy_items = [];
  104. if (is_array($cart_id))
  105. {
  106. foreach ($cart_id as $value)
  107. {
  108. if (preg_match_all('/^(\d{1,10})\|(\d{1,6})$/', $value, $match))
  109. {
  110. if (intval($match[2][0]) > 0) {
  111. $buy_items[$match[1][0]] = $match[2][0];
  112. }
  113. }
  114. }
  115. }
  116. if (count($buy_items) != 1) return false;
  117. foreach ($buy_items as $key => $val) {
  118. $goods_id = intval($key);
  119. $num = intval($val);
  120. }
  121. $mod_goods = Model('goods');
  122. $info = $mod_goods->getGoodsInfoByID($goods_id);
  123. if ($info['is_virtual'] != 1) return false;
  124. return ['goods_id' => $goods_id, 'num' => $num];
  125. }
  126. public function step_secondOp()
  127. {
  128. $cart_ids = explode(',', urldecode($_POST['cart_id']));
  129. if (empty($cart_ids)) {
  130. return self::outerr(errcode::ErrParamter);
  131. }
  132. $param = [];
  133. $param['ifcart'] = $_POST['ifcart'];
  134. $param['cart_id'] = $this->pay_goods($cart_ids);
  135. $param['address_id'] = $_POST['address_id'];
  136. $param['invoice_id'] = $_POST['invoice_id'];
  137. $param['vat_hash'] = $_POST['vat_hash'];
  138. $param['offpay_hash'] = $_POST['offpay_hash'];
  139. $param['offpay_hash_batch'] = $_POST['offpay_hash_batch'];
  140. $param['voucher'] = [];
  141. $param['pd_pay'] = 0;
  142. $param['rcb_pay'] = 0;
  143. $param['password'] = "";
  144. $param['fcode'] = "";
  145. $param['order_from'] = 2; //从手机来
  146. $param['pay_name'] = "online";
  147. $param['usebonus'] = $_POST['usebonus'];
  148. $param['pd_pay'] = empty($_POST['usepred']) ? 0 : 1;
  149. $param['room_id'] = $_POST['room_id'];
  150. $logic_buy = Logic('buy');
  151. $result = $logic_buy->buyStep2($param, $_SESSION['member_id'], $_SESSION['member_name'], $_SESSION['member_email']);
  152. if (!$result['state']) {
  153. return self::outerr(errcode::ErrOrder, $result['msg']);
  154. }
  155. else
  156. {
  157. $pay_sn = $result['data']['pay_sn'];
  158. $payment = $_POST['payment'];
  159. $payer = new pay_helper($pay_sn);
  160. $out_put = $payer->pay($payment, $err);
  161. if ($out_put == false) {
  162. return self::outerr($err['code'], $err['msg']);
  163. }
  164. else {
  165. $out_put['payment'] = $payment;
  166. $out_put['pay_sn'] = $pay_sn;
  167. return self::outsuccess($out_put);
  168. }
  169. }
  170. }
  171. private function check_time()
  172. {
  173. $start_tm = localtime(strtotime('2020-09-28'),true);
  174. $end_tm = localtime(strtotime('2020-10-08'),true);
  175. $tm = localtime(time(), true);
  176. // return ($tm['tm_hour'] > 8 && $tm['tm_hour'] < 21) && ($tm['tm_yday'] < $start_tm['tm_yday'] || $tm['tm_yday'] > $end_tm['tm_yday']);
  177. return ($tm['tm_hour'] > 8 && $tm['tm_hour'] < 21 && $tm['tm_wday'] > 0 && $tm['tm_wday'] < 6);
  178. }
  179. public function step_vsecondOp()
  180. {
  181. if(!$this->check_time()) {
  182. return self::outerr(errcode::ErrInputParam, '目前充值时间段为9:00--21:00,本周六周日运营商系统维护,请下周再来~');
  183. // return self::outerr(errcode::ErrInputParam, '国庆节期间系统维护,其余充值时间段为9:00--21:00~');
  184. // return self::outerr(errcode::ErrInputParam, '系统正在维护,请稍后再试~');
  185. }
  186. $cart_ids = explode(',', urldecode($_POST['cart_id']));
  187. $virtual_goods = $this->virtual_goods($_POST, $cart_ids);
  188. $logic_buy_virtual = Logic('buy_virtual');
  189. $input = [];
  190. $input['goods_id'] = $virtual_goods['goods_id'];
  191. $input['quantity'] = $virtual_goods['num'];
  192. $input['buyer_phone'] = $_POST['buyer_phone'] ?? session_helper::mobile();
  193. $input['buyer_name'] = $_POST['buyer_name'] ?? session_helper::nickname();
  194. $input['buyer_msg'] = $_POST['buyer_msg'] ?? '';
  195. [$fExtra, $extra_info, $order_check] = $this->extra_info($input['goods_id'], $_POST);
  196. if (!$fExtra) {
  197. Log::record("step_vsecond error", Log::ERR);
  198. return self::outerr(errcode::ErrInputParam, '缺少虚拟商品额外指定参数.');
  199. }
  200. if(array_key_exists('phone_no',$extra_info['input']) && empty($extra_info['input']['phone_no'])) {
  201. return self::outerr(errcode::ErrInputParam, '一个手机号只能绑定一张油卡,请换卡.');
  202. }
  203. if(!empty($order_check))
  204. {
  205. $logic = Logic('queue');
  206. $ret = $logic->$order_check(['extra_info' => $extra_info,'goods_id' => $input['goods_id']]);
  207. if(!$ret['state']) {
  208. return self::outerr(errcode::ErrInputParam, $ret['msg']);
  209. }
  210. }
  211. $input['order_from'] = 2;
  212. $calctor = new CalcPrice(session_helper::memberid());
  213. $result = $logic_buy_virtual->buyStep3($input, session_helper::memberid(),[$calctor,'calc_vorder_amount']);
  214. if (!$result['state']) {
  215. return self::outerr(errcode::ErrOrder, $result['msg']);
  216. }
  217. else
  218. {
  219. $calctor->deduct_order($result['data']['order_id']);
  220. $payment = $_POST['payment'];
  221. $order_sn = $result['data']['order_sn'];
  222. $payer = new pay_helper($order_sn);
  223. $out_put = $payer->pay($payment, $err);
  224. if ($out_put == false) {
  225. return self::outerr($err['code'], $err['msg']);
  226. }
  227. else
  228. {
  229. $out_put['payment'] = $payment;
  230. $out_put['pay_sn'] = $order_sn;
  231. if (!empty($extra_info)) {
  232. Model('vr_order')->editOrder(['extra_info' => json_encode($extra_info, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT)], ['order_sn' => $order_sn]);
  233. }
  234. QueueClient::push('OnVrOrderSuccess', ['order_sn' => $order_sn]);
  235. return self::outsuccess($out_put);
  236. }
  237. }
  238. }
  239. public function extra_info($goods_id, $input)
  240. {
  241. global $config;
  242. $handlers = $config['vgoods_handlers'];
  243. if (array_key_exists($goods_id, $handlers))
  244. {
  245. $handler = $handlers[$goods_id];
  246. $extra = [];
  247. $types = $handler['input_params'];
  248. foreach ($types as $item)
  249. {
  250. if (isset($input[$item])) {
  251. $extra['input'][$item] = $input[$item];
  252. }
  253. elseif(session_helper::version_code() <= 171 && $item == "phone_no") {
  254. $extra['input'][$item] = "";
  255. }
  256. else {
  257. Log::record("{$goods_id}号商品,在提交订单中,缺少{$item}字段.", Log::ERR);
  258. return [false, [], ''];
  259. }
  260. }
  261. if (!empty($handler['additional'])) {
  262. $extra['additional'] = $handler['additional'];
  263. }
  264. if(array_key_exists('phone_no',$extra['input'])) {
  265. $phone_no = $this->check_oilmobile($extra['input']);
  266. $extra['input']['phone_no'] = $phone_no;
  267. }
  268. return [true, $extra, $handler['order_check']];
  269. }
  270. return [true, [], ''];
  271. }
  272. private function check_oilmobile($params)
  273. {
  274. $phone_no = $params['phone_no'];
  275. $card_no = $params['card_no'];
  276. if(empty($card_no)) {
  277. return "";
  278. }
  279. $find_card = function ($topcard,$card_no) {
  280. $items = $topcard->table('topcard')->field('*')->where(['card_no' => $card_no])->select();
  281. if(empty($items)) {
  282. return "";
  283. } else {
  284. return $items[0]['bind_phone'];
  285. }
  286. };
  287. $find_phone = function ($topcard,$phone_no) {
  288. $items = $topcard->table('topcard')->field('*')->where(['bind_phone' => $phone_no])->select();
  289. if(empty($items)) {
  290. return "";
  291. } else {
  292. return $items[0]['card_no'];
  293. }
  294. };
  295. $topcard = Model('topcard');
  296. $phone = $find_card($topcard,$card_no);
  297. if(!empty($phone)) {
  298. return $phone;
  299. }
  300. $card = $find_phone($topcard,$phone_no);
  301. if(empty($card)) {
  302. return $phone_no;
  303. }
  304. else {
  305. return "";
  306. }
  307. }
  308. public function pay_confirmOp()
  309. {
  310. $pay_sn = $_GET['pay_sn'];
  311. if (empty($pay_sn)) {
  312. return self::outerr(errcode::ErrParamter, "支付号或者支付类型错误");
  313. }
  314. $payer = new pay_helper($pay_sn);
  315. $paied = $payer->confirm($err, $amount, $fcode_state);
  316. if ($paied == false) {
  317. return self::outerr($err['code'], $err['msg']);
  318. }
  319. else
  320. {
  321. session_helper::add_order();
  322. if ($fcode_state == 1) {
  323. return self::outsuccess(['special_list' => null, 'summary' => null, 'groupbuy' => null, 'limitime' => null, 'bundling' => null, 'mobile_page' => mobile_page(1)]);
  324. }
  325. else
  326. {
  327. $result = fcode\send_manager::instance()->fetch($amount, $pay_sn, session_helper::mobile(), session_helper::session_id());
  328. if ($result != false)
  329. {
  330. $order_pay = Model('order_pay');
  331. $order_pay->where(['pay_sn' => $pay_sn])->update(['fcode_state' => 1]);
  332. $fcode = new user_session\fcode();
  333. $fcode->onStatus();
  334. if ($this->mFcodeBannerID > 0) {
  335. $blocks = special_manager::instance()->special($this->mFcodeBannerID, $unused_gids);
  336. }
  337. else {
  338. $blocks = [];
  339. }
  340. foreach ($result['banner'] as $block) {
  341. $blocks[] = $block;
  342. }
  343. $fcodes = [];
  344. $gids = [];
  345. foreach ($result['fcode'] as $item)
  346. {
  347. $fcoder = new fcode\mfcode($item);
  348. $fcode = $fcoder->format();
  349. if ($fcode != false) {
  350. $gids[] = intval($fcode['goods_id']);
  351. $fcodes[] = $fcode;
  352. }
  353. }
  354. $fcode_blocks = $this->fcode_blocks($fcodes);
  355. foreach ($fcode_blocks as $fblock) {
  356. $blocks[] = $fblock;
  357. }
  358. $helper = new goods_helper($this->price_calcer(), false);
  359. $ret = $helper->cart_summary($gids, $related_goods);
  360. return self::outsuccess(['special_list' => $blocks, 'fcodes' => $fcodes, 'summary' => $ret['summary'], 'groupbuy' => $ret['groupbuy'], 'limitime' => $ret['limitime'], 'bundling' => $ret['bundling'], 'mobile_page' => mobile_page(1)]);
  361. }
  362. else
  363. {
  364. return self::outsuccess(['special_list' => null, 'summary' => null, 'groupbuy' => null, 'limitime' => null, 'bundling' => null, 'mobile_page' => mobile_page(1)]);
  365. }
  366. }
  367. }
  368. }
  369. private function fcode_blocks($fcodes)
  370. {
  371. $blocks = [];
  372. foreach ($fcodes as $fcode)
  373. {
  374. $block = [];
  375. $block['item_title'] = '';
  376. $block['item_type'] = 'home1';
  377. $block['scale'] = 3.224299;
  378. $item['image'] = '';
  379. $item['show_type'] = "fcode";
  380. $item['show_data'] = strval($fcode['fcode_id']);
  381. $item['type'] = "goods";
  382. $item['data'] = strval($fcode['goods_id']);;
  383. $item['title'] = '';
  384. $block['items'][] = $item;
  385. $blocks[] = $block;
  386. }
  387. return $blocks;
  388. }
  389. public function change_addrexOp()
  390. {
  391. $logic_buy = Logic('buy');
  392. $data = $logic_buy->changeAddr($_POST['freight_hash'], $_POST['city_id'], $_POST['area_id'], $_SESSION['member_id']);
  393. if (!empty($data) && $data['state'] == 'success')
  394. {
  395. $result['offpay_hash'] = $data['offpay_hash'];
  396. $result['offpay_hash_batch'] = $data['offpay_hash_batch'];
  397. $freight = 0.00;
  398. foreach ($data['content'] as $value) {
  399. $freight += $value['value'];
  400. }
  401. $result['freight'] = $freight;
  402. return self::outsuccess($result);
  403. }
  404. else
  405. {
  406. return self::outerr(errcode::ErrOrder, '地址修改失败');
  407. }
  408. }
  409. private function pay_goods($cart_ids)
  410. {
  411. if (boolval($_POST['ifcart']) == true)
  412. {
  413. $mod_cart = Model('cart');
  414. $items = $mod_cart->listCart('db', ['cart_id' => ['in', $cart_ids]], false);
  415. $id_num = [];
  416. foreach ($items as $val) {
  417. $cart_id = $val['cart_id'];
  418. $goods_num = $val['goods_num'];
  419. $id_num[] = "{$cart_id}|{$goods_num}";
  420. }
  421. return $id_num;
  422. }
  423. else {
  424. $id_num = $cart_ids;
  425. return $id_num;
  426. }
  427. }
  428. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  429. public function check_passwordOp()
  430. {
  431. if (empty($_POST['password'])) {
  432. return self::outerr(errcode::ErrOrder, '参数错误');
  433. }
  434. $model_member = Model('member');
  435. $member_info = $model_member->getMemberInfoByID($_SESSION['member_id']);
  436. if ($member_info['member_paypwd'] == md5($_POST['password'])) {
  437. return self::outsuccess(['result' => '1']);
  438. }
  439. else {
  440. return self::outerr(errcode::ErrOrder, '密码错误');
  441. }
  442. }
  443. }