ApiController.php 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Mead
  5. * Date: 2019/8/9
  6. * Time: 7:39 PM.
  7. */
  8. namespace App\Http\Controllers\V1;
  9. use App\Http\Controllers\Controller;
  10. use App\Library\Alipay\Alipay;
  11. use App\Models\AdminMerchant;
  12. use App\Models\CouponsUserBag;
  13. use App\Models\DepositOrder;
  14. use App\Models\Order;
  15. use App\Models\RefundLog;
  16. use App\Models\User;
  17. use App\Repositories\OrderRepository;
  18. use App\Repositories\PunishmentOrderRepository;
  19. use App\Repositories\RefundLogRepository;
  20. use App\Repositories\RentOrderRepository;
  21. use App\Repositories\UserRepository;
  22. use Carbon\Carbon;
  23. use Dingo\Api\Http\Request;
  24. use Illuminate\Support\Facades\Cache;
  25. use Illuminate\Support\Facades\DB;
  26. use Illuminate\Support\Facades\Log;
  27. /**
  28. * 对外接口模块
  29. * Class AreaController
  30. * @package App\Http\Controllers\V1
  31. */
  32. class ApiController extends Controller
  33. {
  34. protected static $MERCHANT_ID = 0;
  35. protected static $MERCHANT = [];
  36. /**
  37. * 清空缓存
  38. * @return mixed
  39. * User: Mead
  40. */
  41. public function clearCache()
  42. {
  43. try {
  44. Cache::flush();
  45. return [
  46. 'status_code' => 0
  47. ];
  48. } catch (\Exception $exception) {
  49. return $this->errorNoValidation($exception->getMessage());
  50. }
  51. }
  52. /**
  53. * 支付宝admin退款接口
  54. * @param Request $request
  55. * @param OrderRepository $orderRepository
  56. * @param RentOrderRepository $rentOrderRepository
  57. * @param RefundLogRepository $refundLogRepository
  58. * @param PunishmentOrderRepository $punishmentOrderRepository
  59. * @param UserRepository $userRepository
  60. * @return \Dingo\Api\Http\Response
  61. */
  62. public function alipayRefundLog(Request $request, OrderRepository $orderRepository, RentOrderRepository $rentOrderRepository, RefundLogRepository $refundLogRepository, PunishmentOrderRepository $punishmentOrderRepository, UserRepository $userRepository)
  63. {
  64. $user_id = $request->input('user_id');
  65. $merchant_id = $request->input('merchant_id');
  66. self::$MERCHANT_ID = $merchant_id;
  67. self::$MERCHANT = AdminMerchant::byIdNoStatus($merchant_id);
  68. if (!self::$MERCHANT) {
  69. Log::error('[支付]:参数错误');
  70. return $this->response->array([
  71. 'is_refund_status' => false,
  72. 'msg' => '[支付]:参数错误'
  73. ]);
  74. }
  75. if (!$userRepository->byIdCheckStatusOk($user_id)) {
  76. return $this->response->array([
  77. 'is_refund_status' => false,
  78. 'msg' => '账号状态异常,暂不能退款!'
  79. ]);
  80. }
  81. // 有未结账的订单是能不能退
  82. if ($orderRepository->byUserIdCheckIsExistNoPayOrder($user_id)) {
  83. return $this->response->array([
  84. 'is_refund_status' => false,
  85. 'msg' => '有未结算的订单,暂不能退款!'
  86. ]);
  87. }
  88. if ($rentOrderRepository->byUserIdCheckIsExistRideOrder($user_id)) {
  89. return $this->response->array([
  90. 'is_refund_status' => false,
  91. 'msg' => '有未完成的租车订单,请先处理'
  92. ]);
  93. }
  94. if ($rentOrderRepository->byUserIdCheckIsExistNoPayOrder($user_id)) {
  95. return $this->response->array([
  96. 'is_refund_status' => false,
  97. 'msg' => '有未支付的租车订单,请先处理'
  98. ]);
  99. }
  100. $user = $userRepository->byIdGetUserStatus($user_id);
  101. $punish = $punishmentOrderRepository->checkNoPayModel($user_id);
  102. if (!$punish) return $this->response->array([
  103. 'is_refund_status' => false,
  104. 'msg' => '有罚单未支付,请先处理'
  105. ]);
  106. // if ((int)$user->deposit_type === User::DEPOSIT_CARD) {
  107. // return $this->errorNoValidation('押金类型为免押金卡,不能退还押金');
  108. // }
  109. $order = DepositOrder::where('user_id', $user_id)->where('pay_status', DepositOrder::PAY_STATUS_OK)->where('is_refund', DepositOrder::REFUND_NO)->orderBy('id', 'desc')->first();
  110. if (!$order) {
  111. return $this->response->array([
  112. 'is_refund_status' => false,
  113. 'msg' => '此用户没有缴纳押金'
  114. ]);
  115. }
  116. $refund = DB::transaction(function () use ($order, $user_id) {
  117. $refund = RefundLog::firstOrCreate([
  118. 'deposit_id' => $order->id,
  119. 'user_id' => $user_id,
  120. ], [
  121. 'no' => RefundLog::makeNo(self::$ORDER_TAG),
  122. 'money' => $order->pay_money,
  123. 'type' => RefundLog::TYPE_USER,
  124. 'is_check_status' => RefundLog::CHECK_STATUS_OK,
  125. 'area_id' => $order->area_id,
  126. 'pay_type' => $order->pay_type,
  127. 'pay_money' => $order->pay_money,
  128. 'pay_status' => RefundLog::PAY_STATUS_NO,
  129. 'merchant_id' => self::$MERCHANT_ID
  130. ]);
  131. // 修改用户押金
  132. if ((int)$refund->pay_status === RefundLog::PAY_STATUS_WAIT) {
  133. $refund->pay_status = RefundLog::PAY_STATUS_NO;
  134. $refund->type = RefundLog::TYPE_USER_SPEED;
  135. $refund->save();
  136. }
  137. return $refund;
  138. });
  139. //查询有没有退款成功过
  140. // $no = $refund->deposit->no;
  141. // $result = alipay_mini_config(self::$MERCHANT)->payment()->common()->queryRefund($no,$refund->no);
  142. //
  143. // if($result->code=='10000') {
  144. // if ($result->refundAmount > 0) { //退款成功 退款金额
  145. // //退款成功
  146. // }
  147. // }
  148. //支付宝退款 不查询直接退款
  149. $no = $order->no;
  150. $money = $order->pay_money;
  151. $data = alipay_mini_config(self::$MERCHANT)->payment()->common()->optional("out_request_no", $refund->no)->refund($no, $money);
  152. if ($data->fundChange == 'Y') {
  153. //支付宝没有退款异步回调 这里写下
  154. return $this->response->array([
  155. 'is_refund_status' => true,
  156. 'msg' => 'ok'
  157. ]);
  158. } else {
  159. $refund->result = json_encode($data);
  160. }
  161. $refund->save();
  162. return $this->response->array([
  163. 'is_refund_status' => false,
  164. 'msg' => '退款操作失败,可能已经退款,到账会有时间'
  165. ]);
  166. }
  167. /**
  168. * 支付宝返还一部分钱 骑行订单返还 请求
  169. * @param Request $request
  170. * @return \Dingo\Api\Http\Response
  171. */
  172. public function alipayRefundLittle(Request $request)
  173. {
  174. $merchant_id = $request->input('merchant_id');
  175. self::$MERCHANT_ID = $merchant_id;
  176. self::$MERCHANT = AdminMerchant::byIdNoStatus($merchant_id);
  177. if (!self::$MERCHANT) {
  178. Log::error('[支付]:参数错误');
  179. return $this->response->array([
  180. 'is_refund_status' => false,
  181. 'msg' => '[支付]:参数错误'
  182. ]);
  183. }
  184. $no = $request->input('no');
  185. $money = $request->input('money');
  186. $out_request_no = $request->input('out_request_no');
  187. $data = alipay_mini_config(self::$MERCHANT)->payment()->common()->optional("out_request_no", $out_request_no)->refund($no, $money);
  188. if ($data->fundChange == 'Y') {
  189. //支付宝没有退款异步回调 这里写下
  190. return $this->response->array([
  191. 'is_refund_status' => true,
  192. 'msg' => 'ok'
  193. ]);
  194. } else {
  195. return $this->response->array([
  196. 'is_refund_status' => false,
  197. 'msg' => '退款失败',
  198. 'data' => $data
  199. ]);
  200. }
  201. }
  202. /**
  203. * 押金 支付宝预授权解冻
  204. * @param Request $request
  205. * @return \Dingo\Api\Http\Response
  206. * Author: Mead
  207. */
  208. public function alipayYushouquanJiedongApi(Request $request)
  209. {
  210. $merchant_id = $request->input('merchant_id');
  211. self::$MERCHANT_ID = $merchant_id;
  212. self::$MERCHANT = AdminMerchant::byIdNoStatus($merchant_id);
  213. if (!self::$MERCHANT) {
  214. Log::error('[支付]:参数错误');
  215. return $this->response->array([
  216. 'is_refund_status' => false,
  217. 'msg' => '[支付]:参数错误'
  218. ]);
  219. }
  220. $no = $request->input('no');
  221. $rno = $request->input('rno');
  222. $money = $request->input('money');
  223. $refund_no = $request->input('refund_no');
  224. $merchant = self::$MERCHANT;
  225. $alipayobj = new Alipay();
  226. $data = AlipayYushouquanJiedong($merchant, $no, $rno);
  227. $resultdata = $alipayobj->AlipayQueryYushouquan($data); // 预授权查询
  228. if (!empty($resultdata->code) && $resultdata->code == 10000 && $resultdata->status == 'SUCCESS') {
  229. if ($resultdata->rest_amount == '0.00') {
  230. return $this->response->array([
  231. 'is_refund_status' => false,
  232. 'msg' => '已经解冻完所有金额'
  233. ]);
  234. }
  235. } else {
  236. return $this->errorNoValidation($resultdata->sub_msg);
  237. }
  238. $data = AlipayYushouquanJiedongQingqiu($data, $resultdata->auth_no, $refund_no, $resultdata->rest_amount);
  239. $resultdata = $alipayobj->zijidongjieJiedong($data); // 预授权解冻
  240. if (!empty($resultdata->status) && $resultdata->status == 'SUCCESS' && $resultdata->amount == $money) {
  241. return $this->response->array([
  242. 'is_refund_status' => true,
  243. 'msg' => 'ok'
  244. ]);
  245. } else {
  246. return $this->response->array([
  247. 'is_refund_status' => false,
  248. 'msg' => json_encode($resultdata)
  249. ]);
  250. }
  251. }
  252. }