mirror of
				https://github.com/v2board/v2board.git
				synced 2025-10-31 17:31:49 +08:00 
			
		
		
		
	rewrite: payment
This commit is contained in:
		
							
								
								
									
										63
									
								
								app/Http/Controllers/Admin/PaymentController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								app/Http/Controllers/Admin/PaymentController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | ||||
| <?php | ||||
|  | ||||
| namespace App\Http\Controllers\Admin; | ||||
|  | ||||
| use App\Services\PaymentService; | ||||
| use Illuminate\Http\Request; | ||||
| use App\Http\Controllers\Controller; | ||||
| use App\Models\Payment; | ||||
|  | ||||
| class PaymentController extends Controller | ||||
| { | ||||
|     public function getPaymentMethods() | ||||
|     { | ||||
|         $methods = []; | ||||
|         foreach (glob(base_path('app//Payments') . '/*.php') as $file) { | ||||
|             array_push($methods, pathinfo($file)['filename']); | ||||
|         } | ||||
|         return response([ | ||||
|             'data' => $methods | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function fetch() | ||||
|     { | ||||
|         return response([ | ||||
|             'data' => Payment::all() | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getPaymentForm(Request $request) | ||||
|     { | ||||
|         $paymentService = new PaymentService($request->input('payment'), $request->input('id')); | ||||
|         return response([ | ||||
|             'data' => $paymentService->form() | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function save(Request $request) | ||||
|     { | ||||
|         if ($request->input('id')) { | ||||
|             $payment = Payment::find($request->input('id')); | ||||
|             if (!$payment) abort(500, '支付方式不存在'); | ||||
|             try { | ||||
|                 $payment->update($request->input()); | ||||
|             } catch (\Exception $e) { | ||||
|                 abort(500, '更新失败'); | ||||
|             } | ||||
|             return response([ | ||||
|                 'data' => true | ||||
|             ]); | ||||
|         } | ||||
|         if (!Payment::create([ | ||||
|             'name' => $request->input('name'), | ||||
|             'payment' => $request->input('payment'), | ||||
|             'config' => $request->input('config') | ||||
|         ])) { | ||||
|             abort(500, '保存失败'); | ||||
|         } | ||||
|         return response([ | ||||
|             'data' => true | ||||
|         ]); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										45
									
								
								app/Http/Controllers/Guest/PaymentController.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								app/Http/Controllers/Guest/PaymentController.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| <?php | ||||
|  | ||||
| namespace App\Http\Controllers\Guest; | ||||
|  | ||||
| use App\Models\Order; | ||||
| use App\Services\OrderService; | ||||
| use App\Services\PaymentService; | ||||
| use App\Services\TelegramService; | ||||
| use Illuminate\Http\Request; | ||||
| use App\Http\Controllers\Controller; | ||||
|  | ||||
| class PaymentController extends Controller | ||||
| { | ||||
|     public function notify($method, Request $request) | ||||
|     { | ||||
|         $paymentService = new PaymentService($method); | ||||
|         $verify = $paymentService->notify($request->input()); | ||||
|         if ($verify) abort(500, 'verify error'); | ||||
|         if (!$this->handle($verify['trade_no'], $verify['callback_no'])) { | ||||
|             abort(500, 'handle error'); | ||||
|         } | ||||
|         die('success'); | ||||
|     } | ||||
|  | ||||
|     private function handle($tradeNo, $callbackNo) | ||||
|     { | ||||
|         $order = Order::where('trade_no', $tradeNo)->first(); | ||||
|         if ($order->status === 1) return true; | ||||
|         if (!$order) { | ||||
|             abort(500, 'order is not found'); | ||||
|         } | ||||
|         $orderService = new OrderService($order); | ||||
|         if (!$orderService->success($callbackNo)) { | ||||
|             return false; | ||||
|         } | ||||
|         $telegramService = new TelegramService(); | ||||
|         $message = sprintf( | ||||
|             "💰成功收款%s元\n———————————————\n订单号:%s", | ||||
|             $order->total_amount / 100, | ||||
|             $order->trade_no | ||||
|         ); | ||||
|         $telegramService->sendMessageWithAdmin($message); | ||||
|         return true; | ||||
|     } | ||||
| } | ||||
| @@ -2,6 +2,7 @@ | ||||
|  | ||||
| namespace App\Http\Controllers\User; | ||||
|  | ||||
| use App\Models\Payment; | ||||
| use App\Utils\Dict; | ||||
| use Illuminate\Http\Request; | ||||
| use App\Http\Controllers\Controller; | ||||
| @@ -19,4 +20,16 @@ class CommController extends Controller | ||||
|             ] | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function getStripePublicKey(Request $request) | ||||
|     { | ||||
|         $payment = Payment::where('id', $request->input('id')) | ||||
|             ->where('payment', 'StripeCredit') | ||||
|             ->first(); | ||||
|         if (!$payment) abort(500, 'payment is not found'); | ||||
|         $config = json_decode($payment->config, true); | ||||
|         return response([ | ||||
|             'data' => $config['stripe_pk_live'] | ||||
|         ]); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -4,8 +4,10 @@ namespace App\Http\Controllers\User; | ||||
|  | ||||
| use App\Http\Controllers\Controller; | ||||
| use App\Http\Requests\User\OrderSave; | ||||
| use App\Models\Payment; | ||||
| use App\Services\CouponService; | ||||
| use App\Services\OrderService; | ||||
| use App\Services\PaymentService; | ||||
| use App\Services\UserService; | ||||
| use Illuminate\Http\Request; | ||||
| use Illuminate\Support\Facades\Cache; | ||||
| @@ -175,71 +177,20 @@ class OrderController extends Controller | ||||
|                 'data' => true | ||||
|             ]); | ||||
|         } | ||||
|         switch ($method) { | ||||
|             // return type => 0: QRCode / 1: URL / 2: No action | ||||
|             case 0: | ||||
|                 // alipayF2F | ||||
|                 if (!(int)config('v2board.alipay_enable')) { | ||||
|                     abort(500, __('user.order.checkout.pay_method_not_use')); | ||||
|                 } | ||||
|                 return response([ | ||||
|                     'type' => 0, | ||||
|                     'data' => $this->alipayF2F($tradeNo, $order->total_amount) | ||||
|                 ]); | ||||
|             case 2: | ||||
|                 // stripeAlipay | ||||
|                 if (!(int)config('v2board.stripe_alipay_enable')) { | ||||
|                     abort(500, __('user.order.checkout.pay_method_not_use')); | ||||
|                 } | ||||
|                 return response([ | ||||
|                     'type' => 1, | ||||
|                     'data' => $this->stripeAlipay($order) | ||||
|                 ]); | ||||
|             case 3: | ||||
|                 // stripeWepay | ||||
|                 if (!(int)config('v2board.stripe_wepay_enable')) { | ||||
|                     abort(500, __('user.order.checkout.pay_method_not_use')); | ||||
|                 } | ||||
|                 return response([ | ||||
|                     'type' => 0, | ||||
|                     'data' => $this->stripeWepay($order) | ||||
|                 ]); | ||||
|             case 4: | ||||
|                 // bitpayX | ||||
|                 if (!(int)config('v2board.bitpayx_enable')) { | ||||
|                     abort(500, __('user.order.checkout.pay_method_not_use')); | ||||
|                 } | ||||
|                 return response([ | ||||
|                     'type' => 1, | ||||
|                     'data' => $this->bitpayX($order) | ||||
|                 ]); | ||||
|             case 5: | ||||
|                 if (!(int)config('v2board.mgate_enable')) { | ||||
|                     abort(500, __('user.order.checkout.pay_method_not_use')); | ||||
|                 } | ||||
|                 return response([ | ||||
|                     'type' => 1, | ||||
|                     'data' => $this->mgate($order) | ||||
|                 ]); | ||||
|             case 6: | ||||
|                 if (!(int)config('v2board.stripe_card_enable')) { | ||||
|                     abort(500, __('user.order.checkout.pay_method_not_use')); | ||||
|                 } | ||||
|                 return response([ | ||||
|                     'type' => 2, | ||||
|                     'data' => $this->stripeCard($order, $request->input('token')) | ||||
|                 ]); | ||||
|             case 7: | ||||
|                 if (!(int)config('v2board.epay_enable')) { | ||||
|                     abort(500, __('user.order.checkout.pay_method_not_use')); | ||||
|                 } | ||||
|                 return response([ | ||||
|                     'type' => 1, | ||||
|                     'data' => $this->epay($order) | ||||
|                 ]); | ||||
|             default: | ||||
|                 abort(500, __('user.order.checkout.pay_method_not_use')); | ||||
|         } | ||||
|         $payment = Payment::find($method); | ||||
|         if (!$payment || $payment->enable !== 1) abort(500, __('user.order.checkout.pay_method_not_use')); | ||||
|         $paymentService = new PaymentService($payment->payment, $payment->id); | ||||
|         $result = $paymentService->pay([ | ||||
|             'trade_no' => $tradeNo, | ||||
|             'total_amount' => $order->total_amount, | ||||
|             'user_id' => $order->user_id, | ||||
|             'stripe_token' => $request->input('token') | ||||
|         ]); | ||||
|         $order->update(['payment_id' => $method]); | ||||
|         return response([ | ||||
|             'type' => $result['type'], | ||||
|             'data' => $result['data'] | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|     public function check(Request $request) | ||||
| @@ -258,65 +209,15 @@ class OrderController extends Controller | ||||
|  | ||||
|     public function getPaymentMethod() | ||||
|     { | ||||
|         $data = []; | ||||
|         if ((int)config('v2board.alipay_enable')) { | ||||
|             $alipayF2F = new \StdClass(); | ||||
|             $alipayF2F->name = '支付宝'; | ||||
|             $alipayF2F->method = 0; | ||||
|             $alipayF2F->icon = 'alipay'; | ||||
|             array_push($data, $alipayF2F); | ||||
|         } | ||||
|  | ||||
|         if ((int)config('v2board.stripe_alipay_enable')) { | ||||
|             $stripeAlipay = new \StdClass(); | ||||
|             $stripeAlipay->name = '支付宝'; | ||||
|             $stripeAlipay->method = 2; | ||||
|             $stripeAlipay->icon = 'alipay'; | ||||
|             array_push($data, $stripeAlipay); | ||||
|         } | ||||
|  | ||||
|         if ((int)config('v2board.stripe_wepay_enable')) { | ||||
|             $stripeWepay = new \StdClass(); | ||||
|             $stripeWepay->name = '微信'; | ||||
|             $stripeWepay->method = 3; | ||||
|             $stripeWepay->icon = 'wechat'; | ||||
|             array_push($data, $stripeWepay); | ||||
|         } | ||||
|  | ||||
|         if ((int)config('v2board.bitpayx_enable')) { | ||||
|             $bitpayX = new \StdClass(); | ||||
|             $bitpayX->name = config('v2board.bitpayx_name', '在线支付'); | ||||
|             $bitpayX->method = 4; | ||||
|             $bitpayX->icon = 'wallet'; | ||||
|             array_push($data, $bitpayX); | ||||
|         } | ||||
|  | ||||
|         if ((int)config('v2board.mgate_enable')) { | ||||
|             $obj = new \StdClass(); | ||||
|             $obj->name = config('v2board.mgate_name', '在线支付'); | ||||
|             $obj->method = 5; | ||||
|             $obj->icon = 'wallet'; | ||||
|             array_push($data, $obj); | ||||
|         } | ||||
|  | ||||
|         if ((int)config('v2board.stripe_card_enable')) { | ||||
|             $obj = new \StdClass(); | ||||
|             $obj->name = '信用卡'; | ||||
|             $obj->method = 6; | ||||
|             $obj->icon = 'card'; | ||||
|             array_push($data, $obj); | ||||
|         } | ||||
|  | ||||
|         if ((int)config('v2board.epay_enable')) { | ||||
|             $obj = new \StdClass(); | ||||
|             $obj->name = config('v2board.epay_name', '在线支付'); | ||||
|             $obj->method = 7; | ||||
|             $obj->icon = 'wallet'; | ||||
|             array_push($data, $obj); | ||||
|         } | ||||
|         $methods = Payment::select([ | ||||
|             'id', | ||||
|             'name', | ||||
|             'payment' | ||||
|         ]) | ||||
|             ->where('enable', 1)->get(); | ||||
|  | ||||
|         return response([ | ||||
|             'data' => $data | ||||
|             'data' => $methods | ||||
|         ]); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -99,6 +99,11 @@ class AdminRoute | ||||
|             $router->post('/knowledge/show', 'Admin\\KnowledgeController@show'); | ||||
|             $router->post('/knowledge/drop', 'Admin\\KnowledgeController@drop'); | ||||
|             $router->post('/knowledge/sort', 'Admin\\KnowledgeController@sort'); | ||||
|             // Payment | ||||
|             $router->get ('/payment/fetch', 'Admin\\PaymentController@fetch'); | ||||
|             $router->get ('/payment/getPaymentMethods', 'Admin\\PaymentController@getPaymentMethods'); | ||||
|             $router->post('/payment/getPaymentForm', 'Admin\\PaymentController@getPaymentForm'); | ||||
|             $router->post('/payment/save', 'Admin\\PaymentController@save'); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -20,6 +20,8 @@ class GuestRoute | ||||
|             $router->post('/order/epayNotify', 'Guest\\OrderController@epayNotify'); | ||||
|             // Telegram | ||||
|             $router->post('/telegram/webhook', 'Guest\\TelegramController@webhook'); | ||||
|             // Payment | ||||
|             $router->match(['get', 'post'], '/payment/{method}', 'Guest\\PaymentController@notify'); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -51,6 +51,7 @@ class UserRoute | ||||
|             $router->get ('/telegram/getBotInfo', 'User\\TelegramController@getBotInfo'); | ||||
|             // Comm | ||||
|             $router->get ('/comm/config', 'User\\CommController@config'); | ||||
|             $router->Post('/comm/getStripePublicKey', 'User\\CommController@getStripePublicKey'); | ||||
|             // Knowledge | ||||
|             $router->get ('/knowledge/fetch', 'User\\KnowledgeController@fetch'); | ||||
|             $router->get ('/knowledge/getCategory', 'User\\KnowledgeController@getCategory'); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user