DepositCardOrderController.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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\DepositCardOrder;
  18. use App\Repositories\DepositCardRepository;
  19. use App\Transformers\DepositCardTransformer;
  20. use Carbon\Carbon;
  21. use Illuminate\Support\Facades\DB;
  22. use function EasyWeChat\Kernel\Support\generate_sign;
  23. class DepositCardOrderController extends BaseController
  24. {
  25. public function index(DepositCardsRequest $depositCardsRequest, DepositCardRepository $depositCardRepository)
  26. {
  27. try {
  28. $area_id = $depositCardsRequest->get('area_id', 0);
  29. $depositCards = $depositCardRepository->getDepositCardsByAreaId($area_id);
  30. return $this->response->collection($depositCards, DepositCardTransformer::class);
  31. } catch (\Exception $e) {
  32. return $this->errorNoValidation($e->getMessage());
  33. }
  34. }
  35. public function buyDepositCard(DepositCardRequest $depositCardRequest, DepositCardRepository $depositCardRepository)
  36. {
  37. try {
  38. $id = $depositCardRequest->get('id');
  39. $area_id = $depositCardRequest->get('area_id');
  40. if ($depositCardRepository->isStatusOK($id)) return $this->errorNoValidation('此免押金卡暂不售卖');
  41. $user_id = $this->user->id;
  42. if ($depositCardRepository->isCanBuy($user_id)) return $this->errorNoValidation('您已缴纳过押金,无需购买');
  43. $depositCard = $depositCardRepository->byIdGetModel($id);
  44. DB::beginTransaction();
  45. // 1.下单
  46. $discount = (bool)$depositCard->is_discount ? $depositCard->discount : 100;
  47. $money = $depositCard->price;
  48. $data = [
  49. 'no' => DepositCardOrder::makeNo(),
  50. 'area_id' => $area_id,
  51. 'user_id' => $user_id,
  52. 'deposit_cards_id' => $id,
  53. 'money' => $money,
  54. 'discount' => $discount,
  55. 'pay_money' => bcdiv(bcmul($money, $discount, 2), 100, 2),
  56. 'pay_type' => DepositCardOrder::PAY_TYPE_WECHAT,
  57. 'pay_status' => DepositCardOrder::PAY_STATUS_NO,
  58. 'pay_time' => Carbon::now(),
  59. ];
  60. $depositCardOrder = DepositCardOrder::create($data);
  61. $this->dispatch(new CloseDepositCardOrderJob($depositCardOrder, Carbon::now()->addMinutes(30)));
  62. //发起支付
  63. $payment = app('wechat.payment'); // 微信支付
  64. $username = $this->user->truename;
  65. $auth = $this->user->auth;
  66. $result = $payment->order->unify([
  67. 'body' => "[{$username}]支付免押金卡",
  68. 'out_trade_no' => $depositCardOrder->no,
  69. 'trade_type' => 'JSAPI', // 必须为JSAPI
  70. 'openid' => $auth['credential'], // 这里的openid为付款人的openid
  71. 'total_fee' => wechat_fee($depositCardOrder->pay_money), // 总价
  72. 'attach' => DepositCardOrder::NO_TAG,
  73. // 'notify_url' => config('app.url').'/api/payments/wechat-rent-notify',
  74. ]);
  75. // 如果成功生成统一下单的订单,那么进行二次签名
  76. if ('SUCCESS' === $result['return_code'] && 'SUCCESS' === $result['result_code']) {
  77. // 二次签名的参数必须与下面相同
  78. $params = [
  79. 'appId' => $auth['identifier'],
  80. 'timeStamp' => time(),
  81. 'nonceStr' => $result['nonce_str'],
  82. 'package' => 'prepay_id=' . $result['prepay_id'],
  83. 'signType' => 'MD5',
  84. ];
  85. // config('wechat.payment.default.key')为商户的key
  86. $params['paySign'] = generate_sign($params, config('wechat.payment.default.key'));
  87. $params['no'] = $depositCardOrder->no;
  88. DB::commit();
  89. return $this->response->array($params);
  90. }
  91. DB::rollBack();
  92. return $this->errorNoValidation('下单失败');
  93. } catch (\Exception $e) {
  94. DB::rollBack();
  95. return $this->errorNoValidation($e->getMessage());
  96. }
  97. }
  98. }