CardRidingController.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. <?php
  2. namespace App\Http\Controllers\V1;
  3. use App\Http\Requests\CardRidingOrderRequest;
  4. use App\Http\Requests\CardRidingRequest;
  5. use App\Http\Requests\CardRidingsRequest;
  6. use App\Jobs\CloseCardRidingOrderJob;
  7. use App\Models\CardRidingOrder;
  8. use App\Repositories\CardRidingOrderRepository;
  9. use App\Repositories\CardRidingRepository;
  10. use App\Repositories\CardRidingUserBagsRepository;
  11. use App\Transformers\CardRidingOrdersTransformer;
  12. use App\Transformers\CardRidingsTransformer;
  13. use Carbon\Carbon;
  14. use Illuminate\Support\Facades\DB;
  15. use function EasyWeChat\Kernel\Support\generate_sign;
  16. /**
  17. * 骑行卡营销活动
  18. * Class CardRidingController
  19. * @package App\Http\Controllers\V1
  20. */
  21. class CardRidingController extends BaseController
  22. {
  23. /**
  24. * 根据骑行用户区域id获取骑行卡列表
  25. *
  26. * */
  27. public function index(CardRidingsRequest $cardRidingsRequest, CardRidingRepository $cardRidingRepository)
  28. {
  29. try {
  30. $area_id = $cardRidingsRequest->get('area_id');
  31. $cards = $cardRidingRepository->byAreaIdGetCardRidings($area_id);
  32. return $this->response->collection($cards, CardRidingsTransformer::class);
  33. } catch (\Exception $e) {
  34. $this->errorNoValidation($e->getMessage());
  35. }
  36. }
  37. /**
  38. * 根据骑行卡id 去购买骑行卡 下单
  39. *
  40. * @param CardRidingRequest $cardRidingRequest
  41. * */
  42. public function buyCardRiding(CardRidingRequest $cardRidingRequest, CardRidingRepository $cardRidingRepository, CardRidingOrderRepository $cardRidingOrderRepository, CardRidingUserBagsRepository $cardRidingUserBagsRepository)
  43. {
  44. try {
  45. $card_riding_id = $cardRidingRequest->get('card_riding_id');
  46. $user_id = $this->user->id;
  47. $area_id = $cardRidingRequest->get('area_id');
  48. if (empty($area_id)) return $this->errorNoValidation('请求错误');
  49. if (!$cardRidingRepository->isStatusOK($card_riding_id)) return $this->errorNoValidation('此骑行卡暂不售卖');
  50. // if (!$cardRidingOrderRepository->isPayCallbackOk($user_id)) return $this->errorNoValidation('您已经购买过,请刷新后重试');
  51. if (!empty($cardRidingUserBagsRepository->isExist($user_id))) return $this->errorNoValidation('您已拥有骑行卡,请使用完毕后再购买');
  52. $cardRiding = $cardRidingRepository->byIdGetModel($card_riding_id);
  53. DB::beginTransaction();
  54. // 1.下单
  55. $discount = (bool)($cardRiding->is_discount) ? $cardRiding->discount : 1.00;
  56. $money = $cardRiding->price;
  57. $data = [
  58. 'no' => CardRidingOrder::makeNo(),
  59. 'area_id' => $area_id,
  60. 'user_id' => $user_id,
  61. 'riding_card_id' => $card_riding_id,
  62. 'money' => $money,
  63. 'discount' => $discount,
  64. 'pay_money' => bcmul($money, $discount, 2),
  65. 'pay_type' => CardRidingOrder::PAY_TYPE_WECHAT,
  66. 'pay_status' => CardRidingOrder::PAY_STATUS_NO,
  67. 'pay_time' => Carbon::now(),
  68. ];
  69. $cardRidingOrder = CardRidingOrder::create($data);
  70. $this->dispatch(new CloseCardRidingOrderJob($cardRidingOrder, Carbon::now()->addMinutes(30)));
  71. //发起支付
  72. $payment = app('wechat.payment'); // 微信支付
  73. $username = $this->user->truename;
  74. $auth = $this->user->auth;
  75. $result = $payment->order->unify([
  76. 'body' => "用户购买骑行卡-" . config('app.name', '未来bike'),
  77. 'out_trade_no' => $cardRidingOrder->no,
  78. 'trade_type' => 'JSAPI', // 必须为JSAPI
  79. 'openid' => $auth['credential'], // 这里的openid为付款人的openid
  80. 'total_fee' => wechat_fee($cardRidingOrder->pay_money), // 总价
  81. 'attach' => makeNoTag(CardRidingOrder::NO_TAG),
  82. // 'notify_url' => config('app.url').'/api/payments/wechat-rent-notify',
  83. ]);
  84. // 如果成功生成统一下单的订单,那么进行二次签名
  85. if ('SUCCESS' === $result['return_code'] && 'SUCCESS' === $result['result_code']) {
  86. // 二次签名的参数必须与下面相同
  87. $params = [
  88. 'appId' => $auth['identifier'],
  89. 'timeStamp' => time(),
  90. 'nonceStr' => $result['nonce_str'],
  91. 'package' => 'prepay_id=' . $result['prepay_id'],
  92. 'signType' => 'MD5',
  93. ];
  94. // config('wechat.payment.default.key')为商户的key
  95. $params['paySign'] = generate_sign($params, config('wechat.payment.default.key'));
  96. $params['no'] = $cardRidingOrder->no;
  97. DB::commit();
  98. return $this->response->array($params);
  99. }
  100. DB::rollBack();
  101. return $this->errorNoValidation('下单失败');
  102. } catch (\Exception $e) {
  103. DB::rollBack();
  104. $this->errorNoValidation($e->getMessage());
  105. }
  106. }
  107. /**
  108. * 下单 没支付
  109. * */
  110. public function changeCardRidingOrderStatus(CardRidingOrderRequest $request)
  111. {
  112. try {
  113. $card_riding_order_no = $request->get('no');
  114. $card_riding_order = CardRidingOrder::where('no', $card_riding_order_no)->first();
  115. if (empty($card_riding_order)) return $this->errorNoValidation('订单不存在');
  116. $card_riding_order->status = CardRidingOrder::STATUS_NO;
  117. $card_riding_order->save();
  118. return $this->success();
  119. } catch (\Exception $e) {
  120. $this->errorNoValidation($e->getMessage());
  121. }
  122. }
  123. /**
  124. * 用户骑行卡
  125. * */
  126. public function userCardRiding(CardRidingUserBagsRepository $cardRidingUserBagsRepository)
  127. {
  128. $user_id = $this->user->id;
  129. $userCard = $cardRidingUserBagsRepository->isExist($user_id);
  130. $is_card_begin = true;
  131. if (empty($userCard)) {
  132. return $this->response->array(['user_card' => [], 'is_card_begin' => $is_card_begin]);
  133. }
  134. $userCard = $userCard->toArray();
  135. return $this->response->array(['user_card' => $userCard, 'is_card_begin' => $is_card_begin]);
  136. }
  137. /**
  138. * 用户购买骑行卡历史订单
  139. * */
  140. public function CardRidingOrderHistory(CardRidingOrderRepository $cardRidingOrderRepository)
  141. {
  142. $user_id = $this->user->id;
  143. $cardOrders = $cardRidingOrderRepository->getAllByUserId($user_id);
  144. return $this->response->paginator($cardOrders, CardRidingOrdersTransformer::class);
  145. }
  146. }