Checkout.php 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2017~2021 https://www.yiovo.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
  8. // +----------------------------------------------------------------------
  9. // | Author: 萤火科技 <admin@yiovo.com>
  10. // +----------------------------------------------------------------------
  11. declare (strict_types=1);
  12. namespace app\api\controller;
  13. use app\api\model\card\UserRiceCard as UserRiceCardModel;
  14. use app\api\model\Order as OrderModel;
  15. use app\api\model\User as UserModel;
  16. use app\api\service\User as UserService;
  17. use app\api\service\Cart as CartService;
  18. use app\api\service\order\Checkout as CheckoutService;
  19. use app\api\service\order\CheckoutBargain as CheckoutBargainService;
  20. use app\api\service\order\CheckoutZa as CheckoutZaService;
  21. use app\api\service\order\CheckoutMiaosha as CheckoutMiaoshaService;
  22. use app\api\validate\order\Checkout as CheckoutValidate;
  23. use app\common\enum\order\PayType as OrderPayTypeEnum;
  24. use app\common\exception\BaseException;
  25. use app\common\library\helper;
  26. use app\common\service\card\UserRiceCard as UserRiceCardService;
  27. use app\api\service\order\CheckoutExchange as CheckoutExchangeService;
  28. use app\api\service\order\CheckoutGroupbuy as CheckoutGroupBuyService;
  29. use app\api\service\order\CheckoutGroupbuylb as CheckoutGroupBuylbService;
  30. use app\api\model\groupbuy\GroupBuyJoin;
  31. use app\common\enum\OrderType as OrderTypeEnum;
  32. use app\api\model\Order as CheckOrder;
  33. use think\facade\Db;
  34. use app\api\model\groupbuylb\GroupBuyLbJoin;
  35. use app\api\model\order\GroupBuyLbPay;
  36. use app\common\model\PushLog;
  37. use app\api\model\za\{ZaActivityRelation,ZaActivityGood};
  38. /**
  39. * 订单结算控制器
  40. * Class Checkout
  41. * @package app\api\controller
  42. */
  43. class Checkout extends Controller
  44. {
  45. /* @var \app\api\model\User $user */
  46. private $user;
  47. /* @var CheckoutValidate $validate */
  48. private $validate;
  49. /**
  50. * 构造方法
  51. * @throws BaseException
  52. */
  53. public function initialize()
  54. {
  55. parent::initialize();
  56. // 用户信息
  57. $this->user = UserService::getCurrentLoginUser(true);
  58. // 验证类
  59. $this->validate = new CheckoutValidate;
  60. }
  61. /**
  62. * 结算台订单信息
  63. * @param string $mode
  64. * @return array|\think\response\Json
  65. * @throws BaseException
  66. * @throws \think\db\exception\DataNotFoundException
  67. * @throws \think\db\exception\DbException
  68. * @throws \think\db\exception\ModelNotFoundException
  69. */
  70. public function order(string $mode = 'buyNow')
  71. {
  72. if ($mode === 'buyNow') {
  73. return $this->buyNow();
  74. } elseif ($mode === 'cart') {
  75. return $this->cart();
  76. } elseif ($mode == 'bargain'){
  77. return $this->bargain();
  78. }elseif ($mode=='groupbuy'){
  79. return $this->groupbuy();
  80. }elseif ($mode=='groupbuylb'){
  81. return $this->groupbuylb();
  82. }else if ($mode=='miaosha'){
  83. return $this->miaosha();
  84. }else if ($mode=='za'){
  85. return $this->za();
  86. }else if ($mode=='zareceive'){
  87. return $this->zareceive();
  88. }elseif($mode == 'pointsExchange'){
  89. return $this->pointsExchange();
  90. }
  91. return $this->renderError('结算模式不合法');
  92. }
  93. private function pointsExchange()
  94. {
  95. // 实例化结算台服务
  96. $Checkout = new CheckoutExchangeService;
  97. // 订单结算api参数
  98. $params = $Checkout->setParam($this->getParam([
  99. 'goodsId' => 0,
  100. 'goodsSkuId' => '',
  101. 'goodsNum' => 0,
  102. 'staffUserId' => 0,
  103. 'deliveryType' => 10 // 配送方式 默认10 10-快递配送 20-门店自提
  104. ]));
  105. // 表单验证
  106. if (!$this->validate->scene('pointsExchange')->check($params)) {
  107. return $this->renderError($this->validate->getError(), ['is_created' => false]);
  108. }
  109. // 立即购买:获取订单商品列表
  110. $model = new OrderModel;
  111. $params['staffUserId'] = $params['staffUserId']??0;
  112. $goodsList = $model->getOrderGoodsListByNow(
  113. (int)$params['goodsId'],
  114. (string)$params['goodsSkuId'],
  115. (int)$params['goodsNum'],
  116. (int)$params['staffUserId']
  117. );
  118. // 获取订单确认信息
  119. $orderInfo = $Checkout->onCheckoutExchange($goodsList);
  120. if ($this->request->isGet()) {
  121. return $this->renderSuccess(['order' => $orderInfo]);
  122. }
  123. // 验证订单是否存在错误
  124. if ($Checkout->hasError()) {
  125. return $this->renderError($Checkout->getError(), ['is_created' => false]);
  126. }
  127. //金钱和积分的兑换比例 todo
  128. if ($this->user['accumulate_points'] < bcmul($orderInfo['orderTotalPrice'] , "100",0)) {
  129. return $this->renderError('积分不足哦', ['is_created' => false]);
  130. }
  131. // 创建订单
  132. if (!$Checkout->createOrder($orderInfo)) {
  133. return $this->renderError($Checkout->getError() ?: '订单创建失败', ['is_created' => false]);
  134. }
  135. return $this->renderSuccess([
  136. 'order_id' => $Checkout->model['order_id'],// 订单id
  137. 'pay_type' => OrderPayTypeEnum::EXCHANGE,// 支付方式
  138. ]);
  139. }
  140. //买一赠一 领取
  141. public function zareceive(){
  142. $Checkout = new CheckoutZaService;
  143. $user = UserService::getCurrentLoginUser(true);
  144. $user_id = $user->user_id??0;
  145. $param = $this->getParam([
  146. 'signStr'=>''
  147. ]);
  148. Db::startTrans();
  149. $rel = ZaActivityRelation::where('sign_str',$param['signStr'])->lock("for update")->find();
  150. if(empty($rel)){
  151. Db::rollback();
  152. return $this->renderError('领取链接已失效!');
  153. }
  154. if($rel->is_pay==0){
  155. Db::rollback();
  156. return $this->renderError('赠送人还未支付');
  157. }
  158. if($rel->is_pay==2){
  159. Db::rollback();
  160. return $this->renderError('领取链接已失效');
  161. }
  162. if($rel->receive_state==1){
  163. Db::rollback();
  164. return $this->renderError('领取链接已失效!!');
  165. }
  166. $now = Date('Y-m-d H:i:s',time());
  167. if($now > $rel->expire_time){
  168. Db::rollback();
  169. return $this->renderError("领取链接已过期!");
  170. }
  171. // $order_user_id = OrderModel::where("order_id",$rel->order_id)->value("user_id")??0;
  172. // if($user_id==$order_user_id){
  173. // Db::rollback();
  174. // return $this->renderError("你是赠送人,不能领取");
  175. // }
  176. $relGood = ZaActivityGood::where("id",$rel->za_goods_id)->find();
  177. $params['goodsId'] = $relGood->goods_id;
  178. $params['goodsSkuId'] = $relGood->goods_sku_id;
  179. $params['zaGoodsId'] = $rel->za_goods_id;
  180. $params['staffUserId'] = 0;
  181. $params['deliveryType'] = 10;
  182. $params['staffUserId'] =0;
  183. $params['goodsNum'] = 1;
  184. $params['addressId'] = $param['addressId']??0;
  185. $params['delivery'] =10;
  186. $params['riceCardId'] = -1;
  187. $params['couponId'] = -1;
  188. // 表单验证
  189. if (!$this->validate->scene('buyNow')->check($params)) {
  190. return $this->renderError($this->validate->getError(), ['is_created' => false]);
  191. }
  192. // 订单结算api参数
  193. $params = $Checkout->setParam($params);
  194. // 立即购买:获取订单商品列表
  195. $model = new OrderModel;
  196. $goodsList = $model->getOrderGoodsZaListByNow(
  197. (int)$params['goodsId'],
  198. (string)$params['goodsSkuId'],
  199. (int)1,
  200. (int)$params['zaGoodsId'],
  201. (int)$params['staffUserId'],
  202. true
  203. );
  204. $orderInfo = $Checkout->onCheckout($goodsList);
  205. $orderInfo['orderPayPrice'] =0;
  206. $orderInfo['payType'] = OrderPayTypeEnum::ACTIVITY;
  207. if ($this->request->isGet()) {
  208. return $this->renderSuccess(['order' => $orderInfo]);
  209. }
  210. // 验证订单是否存在错误
  211. if ($Checkout->hasError()) {
  212. return $this->renderError($Checkout->getError(), ['is_created' => false]);
  213. }
  214. // 创建订单
  215. if (!$Checkout->createOrder($orderInfo)) {
  216. return $this->renderError($Checkout->getError() ?: '订单创建失败', ['is_created' => false]);
  217. }
  218. $rel->child_order_id = $Checkout->model['order_id'];
  219. $rel->receive_state = 1;
  220. $rel->receive_time = $now;
  221. $rel->receive_user_id = $user_id;
  222. $rel->save();
  223. Db::commit();
  224. $order['order_id'] = $Checkout->model['order_id'];
  225. $res = ['order_id' => $order['order_id'], // 订单id
  226. 'pay_type' => OrderPayTypeEnum::ACTIVITY,// 支付方式
  227. ];
  228. return $this->renderSuccess($res);
  229. }
  230. //买一赠一
  231. public function za(){
  232. // 实例化结算台服务
  233. $Checkout = new CheckoutZaService;
  234. // 订单结算api参数
  235. $params = $Checkout->setParam($this->getParam([
  236. 'goodsId' => 0,
  237. 'goodsSkuId' => '',
  238. 'goodsNum' => 1,
  239. 'staffUserId' => 0,
  240. 'deliveryType' => 10 // 配送方式 默认10 10-快递配送 20-门店自提
  241. ]));
  242. // 表单验证
  243. if (!$this->validate->scene('buyNow')->check($params)) {
  244. return $this->renderError($this->validate->getError(), ['is_created' => false]);
  245. }
  246. $params['staffUserId'] = $params['staffUserId']??0;
  247. // 立即购买:获取订单商品列表
  248. $model = new OrderModel;
  249. $goodsList = $model->getOrderGoodsZaListByNow(
  250. (int)$params['goodsId'],
  251. (string)$params['goodsSkuId'],
  252. (int)1,
  253. (int)$params['zaGoodsId'],
  254. (int)$params['staffUserId']
  255. );
  256. // $goodsList->
  257. // 获取订单确认信息
  258. $orderInfo = $Checkout->onCheckout($goodsList);
  259. if ($this->request->isGet()) {
  260. return $this->renderSuccess(['order' => $orderInfo]);
  261. }
  262. // 验证订单是否存在错误
  263. if ($Checkout->hasError()) {
  264. return $this->renderError($Checkout->getError(), ['is_created' => false]);
  265. }
  266. // 创建订单
  267. if (!$Checkout->createOrder($orderInfo)) {
  268. return $this->renderError($Checkout->getError() ?: '订单创建失败', ['is_created' => false]);
  269. }
  270. //如果支付金额为0
  271. if($orderInfo['orderPayPrice']<=0){
  272. ZaActivityRelation::where("order_id",$Checkout->model['order_id'])->update(['is_pay'=>1]);
  273. //用米卡支付了
  274. return $this->renderSuccess([
  275. 'order_id' => $Checkout->model['order_id'],// 订单id
  276. 'pay_type' => OrderPayTypeEnum::MICAH_EXCHANGE,// 支付方式
  277. 'sign_str'=>$Checkout->model['sign_str'] //
  278. ]);
  279. }
  280. $order['order_id'] = $Checkout->model['order_id'];
  281. $order['order_no'] = $Checkout->model['order_no'];
  282. $order['pay_price'] = $orderInfo['orderPayPrice'];
  283. $checkOrder = new CheckOrder;
  284. $order_type = OrderTypeEnum::ZA; //定义好这个类型是买一赠一,用来接受回调跳转到买一赠一单,不然会走到传统订单那里,
  285. $payment = $checkOrder->onPrePayByWechat($order,$order_type);
  286. $res = ['order_id' => $order['order_id'], // 订单id
  287. 'pay_type' => 20, // 支付方式
  288. 'payment' => $payment // 微信支付参数
  289. ];
  290. return $this->renderSuccess($res);
  291. // // 构建微信支付请求
  292. // $payment = $model->onOrderPayment($Checkout->model, $params['payType']);
  293. // // 返回结算信息
  294. // return $this->renderSuccess([
  295. // 'order_id' => $Checkout->model['order_id'], // 订单id
  296. // 'pay_type' => $params['payType'],// 支付方式
  297. // 'payment' => $payment // 微信支付参数
  298. // ]);
  299. }
  300. /**
  301. * 订单提交
  302. * @param string $mode
  303. * @return array|\think\response\Json
  304. * @throws BaseException
  305. * @throws \think\db\exception\DataNotFoundException
  306. * @throws \think\db\exception\DbException
  307. * @throws \think\db\exception\ModelNotFoundException
  308. */
  309. public function submit(string $mode = 'buyNow')
  310. {
  311. return $this->order($mode);
  312. }
  313. /**
  314. * 订单确认-立即购买
  315. * @return array|\think\response\Json
  316. * @throws BaseException
  317. * @throws \think\db\exception\DataNotFoundException
  318. * @throws \think\db\exception\DbException
  319. * @throws \think\db\exception\ModelNotFoundException
  320. */
  321. private function buyNow()
  322. {
  323. // 实例化结算台服务
  324. $Checkout = new CheckoutService;
  325. // 订单结算api参数
  326. $params = $Checkout->setParam($this->getParam([
  327. 'goodsId' => 0,
  328. 'goodsSkuId' => '',
  329. 'goodsNum' => 0,
  330. 'staffUserId' => 0,
  331. 'deliveryType' => 10 // 配送方式 默认10 10-快递配送 20-门店自提
  332. ]));
  333. // 表单验证
  334. if (!$this->validate->scene('buyNow')->check($params)) {
  335. return $this->renderError($this->validate->getError(), ['is_created' => false]);
  336. }
  337. // 立即购买:获取订单商品列表
  338. $model = new OrderModel;
  339. $params['staffUserId'] = $params['staffUserId']??0;
  340. $goodsList = $model->getOrderGoodsListByNow(
  341. (int)$params['goodsId'],
  342. (string)$params['goodsSkuId'],
  343. (int)$params['goodsNum'],
  344. (int)$params['staffUserId']
  345. );
  346. // 获取订单确认信息
  347. $orderInfo = $Checkout->onCheckout($goodsList);
  348. if ($this->request->isGet()) {
  349. return $this->renderSuccess(['order' => $orderInfo]);
  350. }
  351. // 验证订单是否存在错误
  352. if ($Checkout->hasError()) {
  353. return $this->renderError($Checkout->getError(), ['is_created' => false]);
  354. }
  355. // 创建订单
  356. if (!$Checkout->createOrder($orderInfo)) {
  357. return $this->renderError($Checkout->getError() ?: '订单创建失败', ['is_created' => false]);
  358. }
  359. //如果支付金额为0
  360. if($orderInfo['orderPayPrice']<=0){
  361. return $this->renderSuccess([
  362. 'order_id' => $Checkout->model['order_id'],// 订单id
  363. 'pay_type' => OrderPayTypeEnum::MICAH_EXCHANGE,// 支付方式
  364. ]);
  365. }
  366. // 构建微信支付请求
  367. $payment = $model->onOrderPayment($Checkout->model, $params['payType']);
  368. // 返回结算信息
  369. return $this->renderSuccess([
  370. 'order_id' => $Checkout->model['order_id'], // 订单id
  371. 'pay_type' => $params['payType'], // 支付方式
  372. 'payment' => $payment // 微信支付参数
  373. ]);
  374. }
  375. /**
  376. * 订单确认-购物车结算
  377. * @return array|\think\response\Json
  378. * @throws BaseException
  379. * @throws \think\db\exception\DataNotFoundException
  380. * @throws \think\db\exception\DbException
  381. * @throws \think\db\exception\ModelNotFoundException
  382. */
  383. private function cart()
  384. {
  385. // 实例化结算台服务
  386. $Checkout = new CheckoutService;
  387. // 订单结算api参数
  388. $params = $Checkout->setParam($this->getParam());
  389. // 表单验证
  390. if (!$this->validate->scene('cart')->check($params)) {
  391. return $this->renderError($this->validate->getError(), ['is_created' => false]);
  392. }
  393. // 购物车ID集
  394. $cartIds = $this->getCartIds();
  395. // 商品结算信息
  396. $CartModel = new CartService;
  397. // 购物车商品列表
  398. $goodsList = $CartModel->getOrderGoodsList($cartIds);
  399. // 获取订单结算信息
  400. $orderInfo = $Checkout->onCheckout($goodsList);
  401. if ($this->request->isGet()) {
  402. return $this->renderSuccess(['order' => $orderInfo]);
  403. }
  404. // 验证订单是否存在错误
  405. if ($Checkout->hasError()) {
  406. return $this->renderError($Checkout->getError(), ['is_created' => false]);
  407. }
  408. // 创建订单
  409. if (!$Checkout->createOrder($orderInfo)) {
  410. return $this->renderError($Checkout->getError() ?: '订单创建失败');
  411. }
  412. // 移出购物车中已下单的商品
  413. $CartModel->clear($cartIds);
  414. //如果支付金额为0
  415. if($orderInfo['orderPayPrice']<=0){
  416. return $this->renderSuccess([
  417. 'order_id' => $Checkout->model['order_id'],// 订单id
  418. 'pay_type' => OrderPayTypeEnum::MICAH_EXCHANGE,// 支付方式
  419. ]);
  420. }
  421. // 构建微信支付请求
  422. $payment = $Checkout->onOrderPayment();
  423. // 返回状态
  424. return $this->renderSuccess([
  425. 'order_id' => $Checkout->model['order_id'], // 订单id
  426. 'pay_type' => $params['payType'], // 支付方式
  427. 'payment' => $payment // 微信支付参数
  428. ]);
  429. }
  430. //拼团裂变,又双叕是一个下单接口
  431. public function groupbuylb(){
  432. // $user = UserService::getCurrentLoginUser(true);
  433. // var_dump($user->user_id);
  434. // die();
  435. // 实例化结算台服务
  436. $Checkout = new CheckoutGroupBuylbService;
  437. // 订单结算api参数
  438. $params = $Checkout->setParam($this->getParam([
  439. 'goodsId' => 0,
  440. 'goodsSkuId' => '',
  441. 'goodsNum' => 1,
  442. 'deliveryType' => 10, // 配送方式 默认10 10-快递配送 20-门店自提
  443. 'joinId'=>0,
  444. 'activityId'=>0
  445. ]));
  446. // 表单验证
  447. if (!$this->validate->scene('buyNow')->check($params)) {
  448. return $this->renderError($this->validate->getError(), ['is_created' => false]);
  449. }
  450. Db::startTrans();
  451. // 立即购买:获取订单商品列表
  452. $model = new OrderModel;
  453. $goodsList = $model->getOrderGoodsGroupLbListByNow(
  454. (int)$params['goodsId'],
  455. (string)$params['goodsSkuId'],
  456. (int)$params['goodsNum'],
  457. (int)$params['joinId'],
  458. (int)$params['activityId']
  459. );
  460. // 获取订单确认信息
  461. $orderInfo = $Checkout->onCheckout($goodsList);
  462. if($params['joinId']>0){
  463. $join = GroupBuyLbJoin::where('id',$params['joinId'])->find();
  464. $orderInfo['join_id'] = (int)$params['joinId'];
  465. $orderInfo['group_buy_lb_activity_id'] = $join->group_buy_lb_activity_id;
  466. }
  467. if($params['activityId']>0){
  468. $orderInfo['join_id'] = 0;
  469. $orderInfo['group_buy_lb_activity_id'] = $params['activityId'];
  470. }
  471. if ($this->request->isGet()) {
  472. Db::commit();
  473. return $this->renderSuccess(['order' => $orderInfo]);
  474. }
  475. // 验证订单是否存在错误
  476. if ($Checkout->hasError()) {
  477. Db::commit();
  478. return $this->renderError($Checkout->getError(), ['is_created' => false]);
  479. }
  480. // 创建订单
  481. if (!$Checkout->createOrder($orderInfo)) {
  482. Db::commit();
  483. return $this->renderError($Checkout->getError() ?: '订单创建失败', ['is_created' => false]);
  484. }
  485. //如果支付金额为0
  486. if($orderInfo['orderPayPrice']<=0){
  487. Db::commit();
  488. $join = GroupBuyLbJoin::where('id',$Checkout->buyhelpModel['join_id'])->find();
  489. if($join->status==1 && $join->user_id>0){
  490. $pay = new GroupBuyLbPay;
  491. $pay->receiveCoupon($join->user_id,$join->group_buy_lb_activity_id);
  492. }
  493. if($Checkout->buyhelpModel['user_id']!=$join->user_id){
  494. $mobile = UserModel::where("user_id",$Checkout->buyhelpModel['user_id'])->value("mobile")??'';
  495. $content ='恭喜您参与五常大米拼团,成功后给您安排发货。现在您可点击成为新团长,无需支付费用即可组织拼团,成团后享受平台奖励78元现金券。';
  496. PushLog::addSmsMon($content,$mobile,1);
  497. }
  498. return $this->renderSuccess([
  499. 'order_id' => $Checkout->buyhelpModel['id'],// 订单id
  500. 'pay_type' => OrderPayTypeEnum::MICAH_EXCHANGE,// 支付方式
  501. 'extra' => ['join_id'=>$Checkout->buyhelpModel['join_id']]
  502. ]);
  503. }
  504. $order['order_id'] = $Checkout->buyhelpModel['id'];
  505. $order['order_no'] = $Checkout->buyhelpModel['order_no'];
  506. $order['pay_price'] = $Checkout->buyhelpModel['pay_money'];
  507. $checkOrder = new CheckOrder;
  508. $order_type = OrderTypeEnum::GROUPBUYLB; //定义好这个类型是250,用来接受回调跳转到拼团单,不然会走到传统订单那里,
  509. $payment = $checkOrder->onPrePayByWechat($order,$order_type);
  510. $res = ['order_id' => $order['order_id'], // 订单id
  511. 'pay_type' => 20, // 支付方式
  512. 'payment' => $payment, // 微信支付参数
  513. 'extra' => ['join_id'=>$Checkout->buyhelpModel['join_id']]
  514. ];
  515. Db::commit();
  516. return $this->renderSuccess($res);
  517. }
  518. /**
  519. * 订单确认-拼团活动立即购买-逻辑和原确认订单不一样,所以独立出来
  520. * @return array|\think\response\Json
  521. * @throws BaseException
  522. * @throws \think\db\exception\DataNotFoundException
  523. * @throws \think\db\exception\DbException
  524. * @throws \think\db\exception\ModelNotFoundException
  525. */
  526. private function groupbuy()
  527. {
  528. // 实例化结算台服务
  529. $Checkout = new CheckoutGroupBuyService;
  530. // 订单结算api参数
  531. $params = $Checkout->setParam($this->getParam([
  532. 'goodsId' => 0,
  533. 'goodsSkuId' => '',
  534. 'goodsNum' => 1,
  535. 'deliveryType' => 10, // 配送方式 默认10 10-快递配送 20-门店自提
  536. 'joinId'=>0,
  537. 'activityId'=>0,
  538. 'staffUserId' => 0,
  539. ]));
  540. // 表单验证
  541. if (!$this->validate->scene('buyNow')->check($params)) {
  542. return $this->renderError($this->validate->getError(), ['is_created' => false]);
  543. }
  544. $params['staffUserId'] = $params['staffUserId']??0;
  545. Db::startTrans();
  546. // 立即购买:获取订单商品列表
  547. $model = new OrderModel;
  548. $goodsList = $model->getOrderGoodsGroupListByNow(
  549. (int)$params['goodsId'],
  550. (string)$params['goodsSkuId'],
  551. (int)$params['goodsNum'],
  552. (int)$params['joinId'],
  553. (int)$params['activityId'],
  554. (int)$params['staffUserId']
  555. );
  556. // 获取订单确认信息
  557. $orderInfo = $Checkout->onCheckout($goodsList);
  558. if($params['joinId']>0){
  559. $join = GroupBuyJoin::where('id',$params['joinId'])->find();
  560. $orderInfo['join_id'] = (int)$params['joinId'];
  561. $orderInfo['group_buy_activity_id'] = $join->group_buy_activity_id;
  562. }
  563. if($params['activityId']>0){
  564. $orderInfo['join_id'] = 0;
  565. $orderInfo['group_buy_activity_id'] = $params['activityId'];
  566. }
  567. if ($this->request->isGet()) {
  568. Db::commit();
  569. return $this->renderSuccess(['order' => $orderInfo]);
  570. }
  571. // 验证订单是否存在错误
  572. if ($Checkout->hasError()) {
  573. Db::commit();
  574. return $this->renderError($Checkout->getError(), ['is_created' => false]);
  575. }
  576. // 创建订单
  577. if (!$Checkout->createOrder($orderInfo)) {
  578. Db::commit();
  579. return $this->renderError($Checkout->getError() ?: '订单创建失败', ['is_created' => false]);
  580. }
  581. //如果支付金额为0
  582. if($orderInfo['orderPayPrice']<=0){
  583. Db::commit();
  584. return $this->renderSuccess([
  585. 'order_id' => $Checkout->buyhelpModel['id'],// 订单id
  586. 'pay_type' => OrderPayTypeEnum::MICAH_EXCHANGE,// 支付方式
  587. 'extra' => ['join_id'=>$Checkout->buyhelpModel['join_id']]
  588. ]);
  589. }
  590. $order['order_id'] = $Checkout->buyhelpModel['id'];
  591. $order['order_no'] = $Checkout->buyhelpModel['order_no'];
  592. $order['pay_price'] = $Checkout->buyhelpModel['pay_money'];
  593. $checkOrder = new CheckOrder;
  594. $order_type = OrderTypeEnum::GROUPBUY; //定义好这个类型,用来接受回调跳转到拼团单,不然会走到传统订单那里,
  595. $payment = $checkOrder->onPrePayByWechat($order,$order_type);
  596. $res = ['order_id' => $order['order_id'], // 订单id
  597. 'pay_type' => 20, // 支付方式
  598. 'payment' => $payment, // 微信支付参数
  599. 'extra' => ['join_id'=>$Checkout->buyhelpModel['join_id']]
  600. ];
  601. Db::commit();
  602. return $this->renderSuccess($res);
  603. }
  604. /**
  605. * 订单确认-砍价活动立即购买-逻辑和原确认订单不一样,所以独立出来
  606. * @return array|\think\response\Json
  607. * @throws BaseException
  608. * @throws \think\db\exception\DataNotFoundException
  609. * @throws \think\db\exception\DbException
  610. * @throws \think\db\exception\ModelNotFoundException
  611. */
  612. private function bargain()
  613. {
  614. // 实例化结算台服务
  615. $Checkout = new CheckoutBargainService;
  616. // 订单结算api参数
  617. $params = $Checkout->setParam($this->getParam([
  618. 'goodsId' => 0,
  619. 'goodsSkuId' => '',
  620. 'goodsNum' => 1,
  621. 'staffUserId' => 0,
  622. 'deliveryType' => 10 // 配送方式 默认10 10-快递配送 20-门店自提
  623. ]));
  624. // 表单验证
  625. if (!$this->validate->scene('buyNow')->check($params)) {
  626. return $this->renderError($this->validate->getError(), ['is_created' => false]);
  627. }
  628. $params['staffUserId'] = $params['staffUserId']??0;
  629. // 立即购买:获取订单商品列表
  630. $model = new OrderModel;
  631. $goodsList = $model->getOrderGoodsBargainListByNow(
  632. (int)$params['goodsId'],
  633. (string)$params['goodsSkuId'],
  634. (int)1,
  635. (int)$params['bargainId'],
  636. (int)$params['staffUserId']
  637. );
  638. // $goodsList->
  639. // 获取订单确认信息
  640. $orderInfo = $Checkout->onCheckout($goodsList);
  641. if ($this->request->isGet()) {
  642. return $this->renderSuccess(['order' => $orderInfo]);
  643. }
  644. // 验证订单是否存在错误
  645. if ($Checkout->hasError()) {
  646. return $this->renderError($Checkout->getError(), ['is_created' => false]);
  647. }
  648. // 创建订单
  649. if (!$Checkout->createOrder($orderInfo)) {
  650. return $this->renderError($Checkout->getError() ?: '订单创建失败', ['is_created' => false]);
  651. }
  652. //如果支付金额为0
  653. if($orderInfo['orderPayPrice']<=0){
  654. return $this->renderSuccess([
  655. 'order_id' => $Checkout->model['order_id'],// 订单id
  656. 'pay_type' => OrderPayTypeEnum::MICAH_EXCHANGE,// 支付方式
  657. ]);
  658. }
  659. // 构建微信支付请求
  660. $payment = $model->onOrderPayment($Checkout->model, $params['payType']);
  661. // 返回结算信息
  662. return $this->renderSuccess([
  663. 'order_id' => $Checkout->model['order_id'], // 订单id
  664. 'pay_type' => $params['payType'], // 支付方式
  665. 'payment' => $payment // 微信支付参数
  666. ]);
  667. }
  668. /**
  669. * 订单确认-秒杀活动立即购买-逻辑和原确认订单不一样,所以独立出来
  670. * @return array|\think\response\Json
  671. * @throws BaseException
  672. * @throws \think\db\exception\DataNotFoundException
  673. * @throws \think\db\exception\DbException
  674. * @throws \think\db\exception\ModelNotFoundException
  675. */
  676. private function miaosha()
  677. {
  678. // 实例化结算台服务
  679. $Checkout = new CheckoutMiaoshaService;
  680. // 订单结算api参数
  681. $params = $Checkout->setParam($this->getParam([
  682. 'goodsId' => 0,
  683. 'goodsSkuId' => '',
  684. 'goodsNum' => 1,
  685. 'staffUserId' => 0,
  686. 'deliveryType' => 10, // 配送方式 默认10 10-快递配送 20-门店自提
  687. // 'promotionMonitorId'=>0
  688. ]));
  689. // 表单验证
  690. if (!$this->validate->scene('buyNow')->check($params)) {
  691. return $this->renderError($this->validate->getError(), ['is_created' => false]);
  692. }
  693. $params['staffUserId'] = $params['staffUserId']??0;
  694. // 立即购买:获取订单商品列表
  695. $model = new OrderModel;
  696. $goodsList = $model->getOrderGoodsMiaoshaListByNow(
  697. (int)$params['goodsId'],
  698. (string)$params['goodsSkuId'],
  699. (int)$params['goodsNum'],
  700. (int)$params['msId'],
  701. (int)$params['staffUserId']
  702. );
  703. // $goodsList->
  704. // 获取订单确认信息d
  705. $orderInfo = $Checkout->onCheckout($goodsList);
  706. if ($this->request->isGet()) {
  707. return $this->renderSuccess(['order' => $orderInfo]);
  708. }
  709. // 验证订单是否存在错误
  710. if ($Checkout->hasError()) {
  711. return $this->renderError($Checkout->getError(), ['is_created' => false]);
  712. }
  713. // 创建订单
  714. if (!$Checkout->createOrder($orderInfo)) {
  715. return $this->renderError($Checkout->getError() ?: '订单创建失败', ['is_created' => false]);
  716. }
  717. //如果支付金额为0
  718. if($orderInfo['orderPayPrice']<=0){
  719. return $this->renderSuccess([
  720. 'order_id' => $Checkout->model['order_id'],// 订单id
  721. 'pay_type' => OrderPayTypeEnum::MICAH_EXCHANGE,// 支付方式
  722. ]);
  723. }
  724. // 构建微信支付请求
  725. $payment = $model->onOrderPayment($Checkout->model, $params['payType']);
  726. // 返回结算信息
  727. return $this->renderSuccess([
  728. 'order_id' => $Checkout->model['order_id'], // 订单id
  729. 'pay_type' => $params['payType'], // 支付方式
  730. 'payment' => $payment // 微信支付参数
  731. ]);
  732. }
  733. /**
  734. * 获取购物车ID集
  735. * @return false|string[]
  736. */
  737. private function getCartIds()
  738. {
  739. $cartIds = $this->request->param('cartIds');
  740. return explode(',', $cartIds);
  741. }
  742. /**
  743. * 订单结算提交的参数
  744. * @param array $define
  745. * @return array
  746. */
  747. private function getParam($define = [])
  748. {
  749. return array_merge($define, $this->request->param());
  750. }
  751. //我的可用现金卡
  752. public function listCard($goodsId){
  753. $goodsId = explode(',',$goodsId);
  754. $user = UserService::getCurrentLoginUser(true);
  755. $list = UserRiceCardModel::with(['riceCardGoodsExcept'])
  756. ->where([
  757. 'user_id'=>$user['user_id'],
  758. 'activation_state'=> 1,//激活状态 0 未激活,1已激活
  759. 'effect_state'=> 1,//生效 状态 0:转赠中 1:生效 2已失效 默认生效 当转赠成功的时侯,变成已失效
  760. 'frozen_state'=> 0,//冻结状态 0 未冻结 1 已冻结
  761. 'is_delete'=> 0,//删除状态 0 未删除 1 已删除
  762. ])->where('balance','>',0)
  763. ->select()->toArray();
  764. foreach ($list as $key=>&$item){
  765. $exceptGoodsId = helper::getArrayColumn($item['riceCardGoodsExcept'],'goods_id');
  766. //判断当前商品是否在可使用范围内
  767. foreach ($goodsId as $goods_id) {
  768. if(in_array($goods_id,$exceptGoodsId)){
  769. unset($list[$key]);
  770. }
  771. }
  772. }
  773. if(!empty($list)){
  774. $list = array_values($list);
  775. }
  776. return $this->renderSuccess(compact('list'));
  777. }
  778. }