Checkout.php 32 KB

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