DepositCardOrderController.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. <?php
  2. /**
  3. *
  4. *
  5. * @category xxx
  6. * @package PSR
  7. * @subpackage Documentation\API
  8. * @author xxx <xxx@xxx.com>
  9. * @license GPL https://xxx.com
  10. * @link https://xxx.com
  11. * @ctime: 2020/4/30 15:57
  12. */
  13. namespace App\Http\Controllers\V1;
  14. use App\Http\Requests\DepositCardRequest;
  15. use App\Http\Requests\DepositCardsRequest;
  16. use App\Jobs\CloseDepositCardOrderJob;
  17. use App\Models\AreaSetting;
  18. use App\Models\DepositCardOrder;
  19. use App\Repositories\AreaSettingRepository;
  20. use App\Repositories\DepositCardRepository;
  21. use App\Transformers\DepositCardTransformer;
  22. use Carbon\Carbon;
  23. use Illuminate\Support\Facades\DB;
  24. use function EasyWeChat\Kernel\Support\generate_sign;
  25. class DepositCardOrderController extends BaseController
  26. {
  27. public function index(DepositCardsRequest $depositCardsRequest, DepositCardRepository $depositCardRepository)
  28. {
  29. try {
  30. $area_id = $depositCardsRequest->get('area_id', 0);
  31. $depositCards = $depositCardRepository->getDepositCardsByAreaId($area_id);
  32. return $this->response->collection($depositCards, DepositCardTransformer::class);
  33. } catch (\Exception $e) {
  34. return $this->errorNoValidation($e->getMessage());
  35. }
  36. }
  37. public function buyDepositCard(DepositCardRequest $depositCardRequest, DepositCardRepository $depositCardRepository,AreaSettingRepository $areaSettingRepository)
  38. {
  39. try {
  40. $id = $depositCardRequest->get('id');
  41. $area_id = $depositCardRequest->get('area_id');
  42. if ($depositCardRepository->isStatusOK($id)) return $this->errorNoValidation('此免押金卡暂不售卖');
  43. $user_id = $this->user->id;
  44. $setting = $areaSettingRepository->byAreaId($area_id);
  45. // 判断区域是否需要缴纳押金
  46. if($setting['is_deposit'] == AreaSetting::DEPOSIT_NO){
  47. return $this->errorNoValidation('此区域暂时无需缴纳押金');
  48. }
  49. if (!$depositCardRepository->isCanBuy($user_id)) return $this->errorNoValidation('您已缴纳过押金,无需购买');
  50. $depositCard = $depositCardRepository->byIdGetModel($id);
  51. DB::beginTransaction();
  52. // 1.下单
  53. $discount = (bool)$depositCard->is_discount ? $depositCard->discount : 100;
  54. $money = $depositCard->price;
  55. $data = [
  56. 'no' => DepositCardOrder::makeNo(),
  57. 'area_id' => $area_id,
  58. 'user_id' => $user_id,
  59. 'deposit_cards_id' => $id,
  60. 'money' => $money,
  61. 'effective_days' => $depositCard->effective_days,
  62. 'discount' => $discount,
  63. 'pay_money' => bcdiv(bcmul($money, $discount, 2), 100, 2),
  64. 'pay_type' => DepositCardOrder::PAY_TYPE_WECHAT,
  65. 'pay_status' => DepositCardOrder::PAY_STATUS_NO,
  66. 'pay_time' => Carbon::now(),
  67. ];
  68. $depositCardOrder = DepositCardOrder::create($data);
  69. $this->dispatch(new CloseDepositCardOrderJob($depositCardOrder, Carbon::now()->addMinutes(30)));
  70. //发起支付
  71. $payment = app('wechat.payment'); // 微信支付
  72. $auth = $this->user->auth;
  73. $result = $payment->order->unify([
  74. 'body' => "用户购买免押金卡-" . config('app.name', '未来bike'),
  75. 'out_trade_no' => $depositCardOrder->no,
  76. 'trade_type' => 'JSAPI', // 必须为JSAPI
  77. 'openid' => $auth['credential'], // 这里的openid为付款人的openid
  78. 'total_fee' => wechat_fee($depositCardOrder->pay_money), // 总价
  79. 'attach' => makeNoTag(DepositCardOrder::NO_TAG),
  80. // 'notify_url' => config('app.url').'/api/payments/wechat-rent-notify',
  81. ]);
  82. // 如果成功生成统一下单的订单,那么进行二次签名
  83. if ('SUCCESS' === $result['return_code'] && 'SUCCESS' === $result['result_code']) {
  84. // 二次签名的参数必须与下面相同
  85. $params = [
  86. 'appId' => $auth['identifier'],
  87. 'timeStamp' => time(),
  88. 'nonceStr' => $result['nonce_str'],
  89. 'package' => 'prepay_id=' . $result['prepay_id'],
  90. 'signType' => 'MD5',
  91. ];
  92. // config('wechat.payment.default.key')为商户的key
  93. $params['paySign'] = generate_sign($params, config('wechat.payment.default.key'));
  94. $params['no'] = $depositCardOrder->no;
  95. DB::commit();
  96. return $this->response->array($params);
  97. }
  98. DB::rollBack();
  99. return $this->errorNoValidation('下单失败');
  100. } catch (\Exception $e) {
  101. DB::rollBack();
  102. return $this->errorNoValidation($e->getMessage());
  103. }
  104. }
  105. }