OrderController.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. <?php
  2. namespace App\Http\Controllers\User;
  3. use App\Http\Controllers\Controller;
  4. use App\Http\Requests\User\OrderSave;
  5. use App\Models\CommissionLog;
  6. use App\Models\Payment;
  7. use App\Services\CouponService;
  8. use App\Services\OrderService;
  9. use App\Services\PaymentService;
  10. use App\Services\PlanService;
  11. use App\Services\UserService;
  12. use Illuminate\Http\Request;
  13. use Illuminate\Support\Facades\Cache;
  14. use Illuminate\Support\Facades\DB;
  15. use App\Models\Order;
  16. use App\Models\Plan;
  17. use App\Models\User;
  18. use App\Utils\Helper;
  19. use Omnipay\Omnipay;
  20. use Stripe\Stripe;
  21. use Stripe\Source;
  22. use Library\BitpayX;
  23. use Library\MGate;
  24. use Library\Epay;
  25. class OrderController extends Controller
  26. {
  27. public function fetch(Request $request)
  28. {
  29. $model = Order::where('user_id', $request->session()->get('id'))
  30. ->orderBy('created_at', 'DESC');
  31. if ($request->input('status') !== null) {
  32. $model->where('status', $request->input('status'));
  33. }
  34. $order = $model->get();
  35. $plan = Plan::get();
  36. for ($i = 0; $i < count($order); $i++) {
  37. for ($x = 0; $x < count($plan); $x++) {
  38. if ($order[$i]['plan_id'] === $plan[$x]['id']) {
  39. $order[$i]['plan'] = $plan[$x];
  40. }
  41. }
  42. }
  43. return response([
  44. 'data' => $order->makeHidden(['id', 'user_id'])
  45. ]);
  46. }
  47. public function detail(Request $request)
  48. {
  49. $order = Order::where('user_id', $request->session()->get('id'))
  50. ->where('trade_no', $request->input('trade_no'))
  51. ->first();
  52. if (!$order) {
  53. abort(500, __('Order does not exist or has been paid'));
  54. }
  55. $order['plan'] = Plan::find($order->plan_id);
  56. $order['try_out_plan_id'] = (int)config('v2board.try_out_plan_id');
  57. if (!$order['plan']) {
  58. abort(500, __('Subscription plan does not exist'));
  59. }
  60. if ($order->surplus_order_ids) {
  61. $order['surplus_orders'] = Order::whereIn('id', $order->surplus_order_ids)->get();
  62. }
  63. return response([
  64. 'data' => $order
  65. ]);
  66. }
  67. public function save(OrderSave $request)
  68. {
  69. $userService = new UserService();
  70. if ($userService->isNotCompleteOrderByUserId($request->session()->get('id'))) {
  71. abort(500, __('You have an unpaid or pending order, please try again later or cancel it'));
  72. }
  73. $planService = new PlanService($request->input('plan_id'));
  74. $plan = $planService->plan;
  75. $user = User::find($request->session()->get('id'));
  76. if (!$plan) {
  77. abort(500, __('Subscription plan does not exist'));
  78. }
  79. if ($plan[$request->input('period')] === NULL) {
  80. abort(500, __('This payment period cannot be purchased, please choose another period'));
  81. }
  82. if ($request->input('period') === 'reset_price') {
  83. if (!$user->plan_id) {
  84. abort(500, __('Subscription has expired or no active subscription, unable to purchase Data Reset Package'));
  85. } else {
  86. if ($user->plan_id !== $plan->id) {
  87. abort(500, __('This subscription reset package does not apply to your subscription'));
  88. }
  89. }
  90. }
  91. if ((!$plan->show && !$plan->renew) || (!$plan->show && $user->plan_id !== $plan->id)) {
  92. if ($request->input('period') !== 'reset_price') {
  93. abort(500, __('This subscription has been sold out, please choose another subscription'));
  94. }
  95. }
  96. if (!$plan->renew && $user->plan_id == $plan->id && $request->input('period') !== 'reset_price') {
  97. abort(500, __('This subscription cannot be renewed, please change to another subscription'));
  98. }
  99. if (!$plan->show && $plan->renew && !$userService->isAvailable($user)) {
  100. abort(500, __('This subscription has expired, please change to another subscription'));
  101. }
  102. DB::beginTransaction();
  103. $order = new Order();
  104. $orderService = new OrderService($order);
  105. $order->user_id = $request->session()->get('id');
  106. $order->plan_id = $plan->id;
  107. $order->period = $request->input('period');
  108. $order->trade_no = Helper::generateOrderNo();
  109. $order->total_amount = $plan[$request->input('period')];
  110. if ($request->input('coupon_code')) {
  111. $couponService = new CouponService($request->input('coupon_code'));
  112. if (!$couponService->use($order)) {
  113. DB::rollBack();
  114. abort(500, __('Coupon failed'));
  115. }
  116. $order->coupon_id = $couponService->getId();
  117. }
  118. $orderService->setVipDiscount($user);
  119. $orderService->setOrderType($user);
  120. $orderService->setInvite($user);
  121. if ($user->balance && $order->total_amount > 0) {
  122. $remainingBalance = $user->balance - $order->total_amount;
  123. $userService = new UserService();
  124. if ($remainingBalance > 0) {
  125. if (!$userService->addBalance($order->user_id, - $order->total_amount)) {
  126. DB::rollBack();
  127. abort(500, __('Insufficient balance'));
  128. }
  129. $order->balance_amount = $order->total_amount;
  130. $order->total_amount = 0;
  131. } else {
  132. if (!$userService->addBalance($order->user_id, - $user->balance)) {
  133. DB::rollBack();
  134. abort(500, __('Insufficient balance'));
  135. }
  136. $order->balance_amount = $user->balance;
  137. $order->total_amount = $order->total_amount - $user->balance;
  138. }
  139. }
  140. if (!$planService->decrementInventory()) {
  141. abort(500, __('Failed to create order'));
  142. }
  143. if (!$order->save()) {
  144. DB::rollback();
  145. abort(500, __('Failed to create order'));
  146. }
  147. DB::commit();
  148. return response([
  149. 'data' => $order->trade_no
  150. ]);
  151. }
  152. public function checkout(Request $request)
  153. {
  154. $tradeNo = $request->input('trade_no');
  155. $method = $request->input('method');
  156. $order = Order::where('trade_no', $tradeNo)
  157. ->where('user_id', $request->session()->get('id'))
  158. ->where('status', 0)
  159. ->first();
  160. if (!$order) {
  161. abort(500, __('Order does not exist or has been paid'));
  162. }
  163. // free process
  164. if ($order->total_amount <= 0) {
  165. $orderService = new OrderService($order);
  166. if (!$orderService->paid($order->trade_no)) abort(500, '');
  167. return response([
  168. 'type' => -1,
  169. 'data' => true
  170. ]);
  171. }
  172. $payment = Payment::find($method);
  173. if (!$payment || $payment->enable !== 1) abort(500, __('Payment method is not available'));
  174. $paymentService = new PaymentService($payment->payment, $payment->id);
  175. if ($payment->handling_fee_fixed || $payment->handling_fee_percent) {
  176. $order->handling_amount = round(($order->total_amount * ($payment->handling_fee_percent / 100)) + $payment->handling_fee_fixed);
  177. }
  178. $order->payment_id = $method;
  179. if (!$order->save()) abort(500, __('Request failed, please try again later'));
  180. $result = $paymentService->pay([
  181. 'trade_no' => $tradeNo,
  182. 'total_amount' => isset($order->handling_amount) ? ($order->total_amount + $order->handling_amount) : $order->total_amount,
  183. 'user_id' => $order->user_id,
  184. 'stripe_token' => $request->input('token')
  185. ]);
  186. return response([
  187. 'type' => $result['type'],
  188. 'data' => $result['data']
  189. ]);
  190. }
  191. public function check(Request $request)
  192. {
  193. $tradeNo = $request->input('trade_no');
  194. $order = Order::where('trade_no', $tradeNo)
  195. ->where('user_id', $request->session()->get('id'))
  196. ->first();
  197. if (!$order) {
  198. abort(500, __('Order does not exist'));
  199. }
  200. return response([
  201. 'data' => $order->status
  202. ]);
  203. }
  204. public function getPaymentMethod()
  205. {
  206. $methods = Payment::select([
  207. 'id',
  208. 'name',
  209. 'payment',
  210. 'icon',
  211. 'handling_fee_fixed',
  212. 'handling_fee_percent'
  213. ])
  214. ->where('enable', 1)->get();
  215. return response([
  216. 'data' => $methods
  217. ]);
  218. }
  219. public function cancel(Request $request)
  220. {
  221. if (empty($request->input('trade_no'))) {
  222. abort(500, __('Invalid parameter'));
  223. }
  224. $order = Order::where('trade_no', $request->input('trade_no'))
  225. ->where('user_id', $request->session()->get('id'))
  226. ->first();
  227. if (!$order) {
  228. abort(500, __('Order does not exist'));
  229. }
  230. if ($order->status !== 0) {
  231. abort(500, __('You can only cancel pending orders'));
  232. }
  233. $orderService = new OrderService($order);
  234. if (!$orderService->cancel()) {
  235. abort(500, __('Cancel failed'));
  236. }
  237. return response([
  238. 'data' => true
  239. ]);
  240. }
  241. }