* @license GPL https://xxx.com * @link https://xxx.com * @ctime: 2020/4/30 15:57 */ namespace App\Http\Controllers\V1; use App\Http\Requests\DepositCardRequest; use App\Http\Requests\DepositCardsRequest; use App\Jobs\CloseDepositCardOrderJob; use App\Models\AreaSetting; use App\Models\DepositCardOrder; use App\Repositories\AreaSettingRepository; use App\Repositories\DepositCardRepository; use App\Transformers\DepositCardTransformer; use Carbon\Carbon; use Illuminate\Support\Facades\DB; use function EasyWeChat\Kernel\Support\generate_sign; class DepositCardOrderController extends BaseController { public function index(DepositCardsRequest $depositCardsRequest, DepositCardRepository $depositCardRepository) { try { $area_id = $depositCardsRequest->get('area_id', 0); $depositCards = $depositCardRepository->getDepositCardsByAreaId($area_id); return $this->response->collection($depositCards, DepositCardTransformer::class); } catch (\Exception $e) { return $this->errorNoValidation($e->getMessage()); } } public function buyDepositCard(DepositCardRequest $depositCardRequest, DepositCardRepository $depositCardRepository,AreaSettingRepository $areaSettingRepository) { try { $id = $depositCardRequest->get('id'); $area_id = $depositCardRequest->get('area_id'); if ($depositCardRepository->isStatusOK($id)) return $this->errorNoValidation('此免押金卡暂不售卖'); $user_id = $this->user->id; $setting = $areaSettingRepository->byAreaId($area_id); // 判断区域是否需要缴纳押金 if($setting['is_deposit'] == AreaSetting::DEPOSIT_NO){ return $this->errorNoValidation('此区域暂时无需缴纳押金'); } if (!$depositCardRepository->isCanBuy($user_id)) return $this->errorNoValidation('您已缴纳过押金,无需购买'); $depositCard = $depositCardRepository->byIdGetModel($id); DB::beginTransaction(); // 1.下单 $discount = (bool)$depositCard->is_discount ? $depositCard->discount : 100; $money = $depositCard->price; $data = [ 'no' => DepositCardOrder::makeNo(), 'area_id' => $area_id, 'user_id' => $user_id, 'deposit_cards_id' => $id, 'money' => $money, 'effective_days' => $depositCard->effective_days, 'discount' => $discount, 'pay_money' => bcdiv(bcmul($money, $discount, 2), 100, 2), 'pay_type' => DepositCardOrder::PAY_TYPE_WECHAT, 'pay_status' => DepositCardOrder::PAY_STATUS_NO, 'pay_time' => Carbon::now(), ]; $depositCardOrder = DepositCardOrder::create($data); $this->dispatch(new CloseDepositCardOrderJob($depositCardOrder, Carbon::now()->addMinutes(30))); //发起支付 $payment = app('wechat.payment'); // 微信支付 $auth = $this->user->auth; $result = $payment->order->unify([ 'body' => "用户购买免押金卡-" . config('app.name', '未来bike'), 'out_trade_no' => $depositCardOrder->no, 'trade_type' => 'JSAPI', // 必须为JSAPI 'openid' => $auth['credential'], // 这里的openid为付款人的openid 'total_fee' => wechat_fee($depositCardOrder->pay_money), // 总价 'attach' => makeNoTag(DepositCardOrder::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'] = $depositCardOrder->no; DB::commit(); return $this->response->array($params); } DB::rollBack(); return $this->errorNoValidation('下单失败'); } catch (\Exception $e) { DB::rollBack(); return $this->errorNoValidation($e->getMessage()); } } }