get('area_id'); $cards = $cardRidingRepository->byAreaIdGetCardRidings($area_id); return $this->response->collection($cards, CardRidingsTransformer::class); } catch (\Exception $e) { $this->errorNoValidation($e->getMessage()); } } /** * 根据骑行卡id 去购买骑行卡 下单 * * @param CardRidingRequest $cardRidingRequest * */ public function buyCardRiding(CardRidingRequest $cardRidingRequest, CardRidingRepository $cardRidingRepository, CardRidingOrderRepository $cardRidingOrderRepository, CardRidingUserBagsRepository $cardRidingUserBagsRepository) { try { $card_riding_id = $cardRidingRequest->get('card_riding_id'); $user_id = $this->user->id; $area_id = $cardRidingRequest->get('area_id'); if (empty($area_id)) return $this->errorNoValidation('请求错误'); if (!$cardRidingRepository->isStatusOK($card_riding_id)) return $this->errorNoValidation('此骑行卡暂不售卖'); // if (!$cardRidingOrderRepository->isPayCallbackOk($user_id)) return $this->errorNoValidation('您已经购买过,请刷新后重试'); if (!empty($cardRidingUserBagsRepository->isExist($user_id))) return $this->errorNoValidation('您已拥有骑行卡,请使用完毕后再购买'); $cardRiding = $cardRidingRepository->byIdGetModel($card_riding_id); DB::beginTransaction(); // 1.下单 $discount = (bool)($cardRiding->is_discount) ? $cardRiding->discount : 1.00; $money = $cardRiding->price; $data = [ 'no' => CardRidingOrder::makeNo(), 'area_id' => $area_id, 'user_id' => $user_id, 'riding_card_id' => $card_riding_id, 'money' => $money, 'discount' => $discount, 'pay_money' => bcmul($money, $discount, 2), 'pay_type' => CardRidingOrder::PAY_TYPE_WECHAT, 'pay_status' => CardRidingOrder::PAY_STATUS_NO, 'pay_time' => Carbon::now(), ]; $cardRidingOrder = CardRidingOrder::create($data); $this->dispatch(new CloseCardRidingOrderJob($cardRidingOrder, Carbon::now()->addMinutes(30))); //发起支付 $payment = app('wechat.payment'); // 微信支付 $username = $this->user->truename; $auth = $this->user->auth; $result = $payment->order->unify([ 'body' => "用户购买骑行卡-" . config('app.name', '未来bike'), 'out_trade_no' => $cardRidingOrder->no, 'trade_type' => 'JSAPI', // 必须为JSAPI 'openid' => $auth['credential'], // 这里的openid为付款人的openid 'total_fee' => wechat_fee($cardRidingOrder->pay_money), // 总价 'attach' => makeNoTag(CardRidingOrder::NO_TAG), // 'notify_url' => config('app.url').'/api/payments/wechat-rent-notify', ]); // 如果成功生成统一下单的订单,那么进行二次签名 if ('SUCCESS' === $result['return_code'] && 'SUCCESS' === $result['result_code']) { // 二次签名的参数必须与下面相同 $params = [ 'appId' => $auth['identifier'], 'timeStamp' => time(), 'nonceStr' => $result['nonce_str'], 'package' => 'prepay_id=' . $result['prepay_id'], 'signType' => 'MD5', ]; // config('wechat.payment.default.key')为商户的key $params['paySign'] = generate_sign($params, config('wechat.payment.default.key')); $params['no'] = $cardRidingOrder->no; DB::commit(); return $this->response->array($params); } DB::rollBack(); return $this->errorNoValidation('下单失败'); } catch (\Exception $e) { DB::rollBack(); $this->errorNoValidation($e->getMessage()); } } /** * 下单 没支付 * */ public function changeCardRidingOrderStatus(CardRidingOrderRequest $request) { try { $card_riding_order_no = $request->get('no'); $card_riding_order = CardRidingOrder::where('no', $card_riding_order_no)->first(); if (empty($card_riding_order)) return $this->errorNoValidation('订单不存在'); $card_riding_order->status = CardRidingOrder::STATUS_NO; $card_riding_order->save(); return $this->success(); } catch (\Exception $e) { $this->errorNoValidation($e->getMessage()); } } /** * 用户骑行卡 * */ public function userCardRiding(CardRidingUserBagsRepository $cardRidingUserBagsRepository) { $user_id = $this->user->id; $userCard = $cardRidingUserBagsRepository->isExist($user_id); $is_card_begin = true; if (empty($userCard)) { return $this->response->array(['user_card' => [], 'is_card_begin' => $is_card_begin]); } $userCard = $userCard->toArray(); return $this->response->array(['user_card' => $userCard, 'is_card_begin' => $is_card_begin]); } /** * 用户购买骑行卡历史订单 * */ public function CardRidingOrderHistory(CardRidingOrderRepository $cardRidingOrderRepository) { $user_id = $this->user->id; $cardOrders = $cardRidingOrderRepository->getAllByUserId($user_id); return $this->response->paginator($cardOrders, CardRidingOrdersTransformer::class); } }