DepositRefundJob.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <?php
  2. namespace App\Jobs;
  3. use App\Models\DepositOrder;
  4. use App\Models\RechargeOrder;
  5. use App\Models\RefundLog;
  6. use App\Models\User;
  7. use App\Repositories\OrderRepository;
  8. use App\Repositories\PunishmentOrderRepository;
  9. use App\Repositories\RentOrderRepository;
  10. use App\Repositories\UserRepository;
  11. use Carbon\Carbon;
  12. use Illuminate\Database\Eloquent\Model;
  13. class DepositRefundJob extends Job
  14. {
  15. protected $model = '';
  16. public $tries = 5;
  17. /**
  18. * Create a new job instance.
  19. *
  20. * @return void
  21. */
  22. public function __construct(Model $model, Carbon $delay)
  23. {
  24. $this->model = $model;
  25. // 设置延迟的时间,delay() 方法的参数代表多少秒之后执行
  26. $this->delay($delay);
  27. }
  28. /**
  29. * @return bool
  30. * Author: Mead
  31. */
  32. public function handle(OrderRepository $orderRepository, RentOrderRepository $rentOrderRepository, PunishmentOrderRepository $punishmentOrderRepository, UserRepository $userRepository)
  33. {
  34. //判断用户当前退款是否在等待中
  35. if ((int)$this->model->pay_status !== RefundLog::PAY_STATUS_WAIT) {
  36. return true;
  37. }
  38. $user_id = $this->model->user_id;
  39. $payment_type = $this->model->pay_type;
  40. if (!$userRepository->byIdCheckStatusOk($user_id)) {
  41. RefundLog::where('id', $this->model->id)->update([
  42. 'pay_status' => RefundLog::PAY_STATUS_ERROR,
  43. 'result' => '用户状态异常'
  44. ]);
  45. return true;
  46. }
  47. if ($orderRepository->byUserIdCheckIsExistNoPayOrder($user_id)) {
  48. RefundLog::where('id', $this->model->id)->update([
  49. 'pay_status' => RefundLog::PAY_STATUS_ERROR,
  50. 'result' => '有未完成的用车订单'
  51. ]);
  52. return true;
  53. }
  54. if ($rentOrderRepository->byUserIdCheckIsExistRideOrder($user_id)) {
  55. RefundLog::where('id', $this->model->id)->update([
  56. 'pay_status' => RefundLog::PAY_STATUS_ERROR,
  57. 'result' => '有未完成的租车订单'
  58. ]);
  59. return true;
  60. }
  61. if ($rentOrderRepository->byUserIdCheckIsExistNoPayOrder($user_id)) {
  62. RefundLog::where('id', $this->model->id)->update([
  63. 'pay_status' => RefundLog::PAY_STATUS_ERROR,
  64. 'result' => '有未支付的租车订单'
  65. ]);
  66. return true;
  67. }
  68. $punish = $punishmentOrderRepository->checkNoPayModel($user_id);
  69. if (!$punish) {
  70. RefundLog::where('id', $this->model->id)->update([
  71. 'pay_status' => RefundLog::PAY_STATUS_ERROR,
  72. 'result' => '有未支付的罚单'
  73. ]);
  74. return true;
  75. }
  76. $order = DepositOrder::where('id', $this->model->deposit_id)->first();
  77. switch ($payment_type){
  78. case RechargeOrder::PAY_TYPE_WECHAT:
  79. $payment = app('wechat.payment'); // 微信支付
  80. $result = $payment->refund->byOutTradeNumber($order->no, $this->model->no, wechat_fee($order->pay_money), wechat_fee($this->model->pay_money), [
  81. // 可在此处传入其他参数,详细参数见微信支付文档
  82. 'refund_desc' => '用户申请退回押金',
  83. 'notify_url' => config('app.url') . '/api/payments/wechat-refund-notify',
  84. ]);
  85. break;
  86. case RechargeOrder::PAY_TYPE_ALIPAYMINI:
  87. $no = $order->no ;
  88. $money = $order->pay_money;
  89. $data = alipay_mini_config(self::$MERCHANT)->payment()->common()->refund($no,$money);
  90. if ($data->fundChange=='Y') {
  91. $result['return_code'] ='SUCCESS';
  92. $result['result_code'] = 'SUCCESS';
  93. //支付宝没有退款异步回调 这里写下
  94. $order->is_refund = DepositOrder::REFUND_OK;
  95. $order->save();
  96. $order->refund_order_callback(); //押金退款订单回调
  97. }else{
  98. $result['return_code'] ='ERROE';
  99. $result['result_code'] = 'ERROE';
  100. // $result['err_code_des'] = "调用失败,原因:可能已经退款 请确认";
  101. }
  102. break;
  103. default:
  104. RefundLog::where('id', $this->model->id)->update([
  105. 'pay_status' => RefundLog::PAY_STATUS_ALIPAYMINI_PAY,
  106. 'result' => '退款方式错误'
  107. ]);
  108. return true;
  109. }
  110. $user = User::where('id', $user_id)->first();
  111. if ($result['return_code'] === 'SUCCESS' && $result['result_code'] === 'SUCCESS') {
  112. // 判断是否有免押金卡
  113. $deposit_expire_time = Carbon::parse($user->deposit_expire_time);
  114. if (Carbon::now()->gte($deposit_expire_time)) {
  115. // 免押金卡已经过期
  116. User::where('id', $user->id)->update([
  117. 'deposit_money' => 0,
  118. 'is_deposit' => User::DEPOSIT_NO,
  119. 'deposit_type' => User::DEPOSIT_TYPE_NO
  120. ]);
  121. } else {
  122. // 免押金卡未过期
  123. User::where('id', $user->id)->update([
  124. 'deposit_money' => 0,
  125. 'is_deposit' => User::DEPOSIT_OK,
  126. 'deposit_type' => User::DEPOSIT_CARD
  127. ]);
  128. }
  129. }
  130. return true;
  131. }
  132. }