123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- <?php
- /**
- *
- *
- * @category xxx
- * @package PSR
- * @subpackage Documentation\API
- * @author xxx <xxx@xxx.com>
- * @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());
- }
- }
- }
|