CardRidingController.php 8.4 KB

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