Quellcode durchsuchen

改用laravel自带uuid + 新支付:易支付(待测试)

兔姬桑 vor 4 Jahren
Ursprung
Commit
e257ed55d9

+ 2 - 1
app/Components/Helpers.php

@@ -10,6 +10,7 @@ use App\Models\User;
 use App\Models\UserCreditLog;
 use App\Models\UserSubscribe;
 use App\Models\UserTrafficModifyLog;
+use Str;
 
 class Helpers {
 	// 不生成的端口
@@ -82,7 +83,7 @@ class Helpers {
 		// 生成一个可用端口
 		$user->port = self::systemConfig()['is_rand_port']? self::getRandPort() : self::getOnlyPort();
 		$user->passwd = makeRandStr();
-		$user->vmess_id = createGuid();
+		$user->vmess_id = Str::uuid();
 		$user->enable = 1;
 		$user->method = self::getDefaultMethod();
 		$user->protocol = self::getDefaultProtocol();

+ 8 - 2
app/Http/Controllers/AdminController.php

@@ -43,6 +43,7 @@ use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
 use Redirect;
 use Response;
 use Session;
+use Str;
 use Symfony\Component\HttpFoundation\BinaryFileResponse;
 use Validator;
 
@@ -246,7 +247,7 @@ class AdminController extends Controller {
 			$user->password = Hash::make($request->input('password')?: makeRandStr());
 			$user->port = $request->input('port')?: $this->makePort();
 			$user->passwd = $request->input('passwd')?: makeRandStr();
-			$user->vmess_id = $request->input('uuid')?: createGuid();
+			$user->vmess_id = $request->input('uuid')?: Str::uuid();
 			$user->transfer_enable = toGB($request->input('transfer_enable')?: 0);
 			$user->enable = $request->input('enable')?: 0;
 			$user->method = $request->input('method');
@@ -367,7 +368,7 @@ class AdminController extends Controller {
 					'email'           => $email,
 					'port'            => $port,
 					'passwd'          => $request->input('passwd')?: makeRandStr(),
-					'vmess_id'        => $request->input('uuid')?: createGuid(),
+					'vmess_id'        => $request->input('uuid')?: Str::uuid(),
 					'transfer_enable' => toGB($transfer_enable?: 0),
 					'enable'          => $status < 0? 0 : $request->input('enable'),
 					'method'          => $request->input('method'),
@@ -1152,6 +1153,11 @@ class AdminController extends Controller {
 						return Response::json(['status' => 'fail', 'message' => '请先设置【码支付】必要参数']);
 					}
 					break;
+				case 'epay':
+					if(!self::$systemConfig['epay_url'] || !self::$systemConfig['epay_mch_id'] || !self::$systemConfig['epay_key']){
+						return Response::json(['status' => 'fail', 'message' => '请先设置【易支付】必要参数']);
+					}
+					break;
 				case 'payjs':
 					if(!self::$systemConfig['payjs_mch_id'] || !self::$systemConfig['payjs_key']){
 						return Response::json(['status' => 'fail', 'message' => '请先设置【PayJs】必要参数']);

+ 2 - 11
app/Http/Controllers/Controller.php

@@ -12,22 +12,13 @@ use Illuminate\Foundation\Validation\ValidatesRequests;
 use Illuminate\Http\UploadedFile;
 use Illuminate\Routing\Controller as BaseController;
 use RuntimeException;
+use Str;
 
 class Controller extends BaseController {
 	use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
 
-	// 生成随机密码
-	public function makePasswd() {
-		return makeRandStr();
-	}
-
-	// 生成UUID
-	public function makeUUID() {
-		return createGuid();
-	}
-
 	// 生成网站安全码
-	public function makeSecurityCode() {
+	public function makeSecurityCode(): string {
 		return strtolower(makeRandStr(8));
 	}
 

+ 5 - 20
app/Http/Controllers/Gateway/AbstractPayment.php

@@ -12,6 +12,7 @@ use App\Models\User;
 use Illuminate\Http\JsonResponse;
 use Illuminate\Http\Request;
 use Log;
+use Str;
 
 abstract class AbstractPayment {
 	protected static $systemConfig;
@@ -26,7 +27,7 @@ abstract class AbstractPayment {
 
 	protected function postPayment($data, $method): int {
 		// 获取需要的信息
-		$payment = Payment::whereTradeNo($data)->first();
+		$payment = Payment::whereTradeNo($data)->latest()->first();
 		// 是否为余额购买套餐
 		if($payment){
 			Payment::whereTradeNo($data)->update(['status' => 1]);
@@ -120,9 +121,7 @@ abstract class AbstractPayment {
 						User::query()->whereId($order->user->referral_uid)->increment('invite_num', 1);
 					}
 					//按照返利模式进行返利判断
-					if(self::$systemConfig['referral_type'] == 2
-					   || (self::$systemConfig['referral_type'] == 1
-					       && !$referral)){
+					if(self::$systemConfig['referral_type'] == 2 || (self::$systemConfig['referral_type'] == 1 && !$referral)){
 						$this->addReferralLog($order->user_id, $order->user->referral_uid, $order->oid, $order->amount,
 							$order->amount * self::$systemConfig['referral_percent']);
 					}
@@ -155,14 +154,13 @@ abstract class AbstractPayment {
 		$log->amount = $amount;
 		$log->ref_amount = $refAmount;
 		$log->status = 0;
-		$log->save();
 
-		return 0;
+		return $log->save();
 	}
 
 	protected function creatNewPayment($uid, $oid, $amount): Payment {
 		$payment = new Payment();
-		$payment->trade_no = self::generateGuid();
+		$payment->trade_no = substr(str_replace('-', '', Str::uuid()), 0, 8);
 		$payment->user_id = $uid;
 		$payment->oid = $oid;
 		$payment->amount = $amount;
@@ -171,19 +169,6 @@ abstract class AbstractPayment {
 		return $payment;
 	}
 
-	public static function generateGuid(): string {
-		mt_srand((double) microtime() * 10000);
-		$charId = strtoupper(md5(uniqid(mt_rand() + time(), true)));
-		$hyphen = chr(45);
-		$uuid = chr(123).substr($charId, 0, 8).$hyphen.substr($charId, 8, 4).$hyphen.substr($charId, 12,
-				4).$hyphen.substr($charId, 16, 4).$hyphen.substr($charId, 20, 12).chr(125);
-
-		$uuid = str_replace(['}', '{', '-'], '', $uuid);
-		$uuid = substr($uuid, 0, 8);
-
-		return $uuid;
-	}
-
 	/**
 	 * @param  string  $trade_no      本地订单号
 	 * @param  string  $out_trade_no  外部订单号

+ 76 - 0
app/Http/Controllers/Gateway/EPay.php

@@ -0,0 +1,76 @@
+<?php
+
+namespace App\Http\Controllers\Gateway;
+
+use App\Components\Curl;
+use App\Models\Payment;
+use Auth;
+use Illuminate\Http\JsonResponse;
+use Illuminate\Http\Request;
+use Response;
+
+class EPay extends AbstractPayment {
+	public function purchase(Request $request): JsonResponse {
+		$payment = $this->creatNewPayment(Auth::id(), $request->input('oid'), $request->input('amount'));
+
+		switch($request->input('type')){
+			case 2:
+				$type = 'qqpay';
+				break;
+			case 3:
+				$type = 'wxpay';
+				break;
+			case 1:
+			default:
+				$type = 'alipay';
+				break;
+		}
+
+
+		$data = [
+			'pid'          => self::$systemConfig['epay_mch_id'],
+			'type'         => $type,
+			'out_trade_no' => $payment->trade_no,
+			'notify_url'   => (self::$systemConfig['website_callback_url']?: self::$systemConfig['website_url']).'/callback/notify?method=epay',
+			'return_url'   => self::$systemConfig['website_url'].'/invoices',
+			'name'         => self::$systemConfig['subject_name']?: self::$systemConfig['website_name'],
+			'money'        => $payment->amount,
+
+		];
+		$data['sign'] = $this->sign($this->prepareSign($data));
+
+		$result = json_decode(Curl::send(self::$systemConfig['epay_url'].'/submit.php', $data), true);
+		if(!$result){
+			return Response::json(['status' => 'fail', 'message' => '支付处理失败!']);
+		}
+
+		Payment::whereId($payment->id)->update(['qr_code' => 1, 'url' => $result['pay_url']]);
+
+		return Response::json(['status' => 'success', 'data' => $payment->trade_no, 'message' => '创建订单成功!']);
+	}
+
+	// 签名字符串
+	private function sign($data): string {
+		return strtolower(md5($data.self::$systemConfig['epay_key']));
+	}
+
+	private function prepareSign($data): string {
+		ksort($data);
+		return http_build_query($data);
+	}
+
+	public function notify(Request $request): void {
+
+		if(!$this->verify($request->all(), $request->input('sign'))){
+			die('FAIL');
+		}
+		$this->postPayment($request->input('out_trade_no'), 'EPay');
+		die('SUCCESS');
+	}
+
+	// 验证签名
+	private function verify($data, $signature): bool {
+		unset($data['sign']);
+		return $this->sign($this->prepareSign($data)) === $signature;
+	}
+}

+ 4 - 1
app/Http/Controllers/PaymentController.php

@@ -5,6 +5,7 @@ namespace App\Http\Controllers;
 use App\Components\Helpers;
 use App\Http\Controllers\Gateway\BitpayX;
 use App\Http\Controllers\Gateway\CodePay;
+use App\Http\Controllers\Gateway\EPay;
 use App\Http\Controllers\Gateway\F2Fpay;
 use App\Http\Controllers\Gateway\Local;
 use App\Http\Controllers\Gateway\PayJs;
@@ -53,6 +54,8 @@ class PaymentController extends Controller {
 				return new BitpayX();
 			case 'paypal':
 				return new PayPal();
+			case 'epay':
+				return new EPay();
 			default:
 				Log::error("未知支付:".self::$method);
 
@@ -189,7 +192,7 @@ class PaymentController extends Controller {
 			Helpers::addCouponLog($coupon->id, $goods_id, $order->oid, '订单支付使用');
 		}
 
-		$request->merge(['oid' => $order->oid, 'amount' => $amount, 'type' => $request->input('pay_type')]);
+		$request->merge(['oid' => $order->oid, 'amount' => $amount, 'type' => $pay_type]);
 
 		// 生成支付单
 		return self::getClient()->purchase($request);

+ 0 - 13
app/helpers.php

@@ -208,19 +208,6 @@ if(!function_exists('getIPv6')){
 	}
 }
 
-// 随机UUID
-if(!function_exists('createGuid')){
-	function createGuid() {
-		mt_srand((double) microtime() * 10000);
-		$charid = strtoupper(md5(uniqid(mt_rand(), true)));
-		$hyphen = chr(45);
-		$uuid = substr($charid, 0, 8).$hyphen.substr($charid, 8, 4).$hyphen.substr($charid, 12,
-				4).$hyphen.substr($charid, 16, 4).$hyphen.substr($charid, 20, 12);
-
-		return strtolower($uuid);
-	}
-}
-
 // 过滤emoji表情
 if(!function_exists('filterEmoji')){
 	function filterEmoji($str) {

+ 52 - 0
resources/views/admin/config/system.blade.php

@@ -1112,6 +1112,7 @@
 												<option value="">关闭</option>
 												<option value="f2fpay">F2F</option>
 												<option value="codepay">码支付</option>
+												<option value="epay">易支付</option>
 											</select>
 										</div>
 									</div>
@@ -1121,6 +1122,7 @@
 											<select class="col-md-3" id="is_QQPay" data-plugin="selectpicker" data-style="btn-outline btn-primary" onchange="updateFromOther('select','is_QQPay')">
 												<option value="">关闭</option>
 												<option value="codepay">码支付</option>
+												<option value="epay">易支付</option>
 											</select>
 										</div>
 									</div>
@@ -1131,6 +1133,7 @@
 												<option value="">关闭</option>
 												<option value="codepay">码支付</option>
 												<option value="payjs">PayJS</option>
+												<option value="epay">易支付</option>
 											</select>
 										</div>
 									</div>
@@ -1274,6 +1277,55 @@
 										</div>
 									</div>
 								</div>
+								<div class="row pb-70">
+									<div class="form-group col-lg-6">
+										<div class="row">
+											<label class="col-md-3 col-form-label">易支付</label>
+											<div class="col-md-7">
+												{{--												请到 <a href="https://codepay.fateqq.com/i/377289" target="_blank">码支付</a>申请账号,然后下载登录其挂机软件--}}
+											</div>
+										</div>
+									</div>
+									<div class="form-group col-lg-6">
+										<div class="row">
+											<label class="col-md-3 col-form-label" for="epay_url">请求URL</label>
+											<div class="col-md-7">
+												<div class="input-group">
+													<input type="text" class="form-control" id="epay_url" value="{{$epay_url}}" placeholder="https://www.example.com"/>
+													<span class="input-group-append">
+														<button class="btn btn-primary" type="button" onclick="update('epay_url')">修改</button>
+													</span>
+												</div>
+											</div>
+										</div>
+									</div>
+									<div class="form-group col-lg-6">
+										<div class="row">
+											<label class="col-md-3 col-form-label" for="epay_mch_id">商户ID</label>
+											<div class="col-md-7">
+												<div class="input-group">
+													<input type="text" class="form-control" id="epay_mch_id" value="{{$epay_mch_id}}"/>
+													<span class="input-group-append">
+														<button class="btn btn-primary" type="button" onclick="update('epay_mch_id')">修改</button>
+													</span>
+												</div>
+											</div>
+										</div>
+									</div>
+									<div class="form-group col-lg-6">
+										<div class="row">
+											<label class="col-md-3 col-form-label" for="epay_key">商户签名</label>
+											<div class="col-md-7">
+												<div class="input-group">
+													<input type="text" class="form-control" id="epay_key" value="{{$epay_key}}"/>
+													<span class="input-group-append">
+														<button class="btn btn-primary" type="button" onclick="update('epay_key')">修改</button>
+													</span>
+												</div>
+											</div>
+										</div>
+									</div>
+								</div>
 								<div class="row pb-70">
 									<div class="form-group col-lg-6">
 										<div class="row">

+ 2 - 2
resources/views/admin/node/nodeInfo.blade.php

@@ -432,7 +432,7 @@
 			$('#passwd').val('{{$node->passwd}}');
 			$("input[name='type'][value='{{$node->type}}']").click();
 
-			@if($node->type==1)
+			@if($node->type == 1 || $node->type == 4)
 			// ShadowsocksR
 			$('#method').selectpicker('val', '{{$node->method}}');
 			$('#protocol').selectpicker('val', '{{$node->protocol}}');
@@ -444,7 +444,7 @@
 			@endif
 			@endif
 
-			@if($node->type==2)
+			@if($node->type == 2)
 			//V2Ray
 			$('#v2_alter_id').val('{{$node->v2_alter_id}}');
 			$('#v2_port').val('{{$node->v2_port}}');

+ 1 - 1
resources/views/admin/node/nodeList.blade.php

@@ -44,7 +44,7 @@
 								@if($node->is_relay)
 									中转
 								@else
-									{{$node->type == 2 ? 'V2' : 'SSR'}}
+									{{$node->type_label}}
 								@endif
 							</td>
 							<td> {{$node->name}} </td>

+ 2 - 2
routes/web.php

@@ -13,8 +13,8 @@ Route::group(['middleware' => ['isForbidden', 'affiliate', 'isMaintenance']], fu
 	Route::get('active/{token}', 'AuthController@active'); // 激活账号
 	Route::post('sendCode', 'AuthController@sendCode'); // 发送注册验证码
 	Route::get('free', 'AuthController@free'); // 免费邀请码
-	Route::get('makePasswd', 'Controller@makePasswd'); // 生成密码
-	Route::get('makeUUID', 'Controller@makeUUID'); // 生成UUID
+	Route::get('makePasswd', makeRandStr()); // 生成随机密码
+	Route::get('makeUUID', Str::uuid()); // 生成UUID
 	Route::get('makeSecurityCode', 'Controller@makeSecurityCode'); // 生成网站安全码
 });
 Route::any('admin/login', 'AuthController@login')->middleware('isForbidden', 'isSecurity'); // 登录

+ 4 - 1
sql/db.sql

@@ -416,7 +416,10 @@ VALUES ('1', 'is_rand_port', 0),
        ('109', 'paypal_secret', ''),
        ('110', 'paypal_certificate', ''),
        ('111', 'paypal_app_id', ''),
-       ('112', 'redirect_url', '');
+       ('112', 'redirect_url', ''),
+       ('113', 'epay_url', ''),
+       ('114', 'epay_mch_id', ''),
+       ('115', 'epay_key', '');
 
 -- ----------------------------
 -- Table structure for article

+ 3 - 0
sql/mod/20200720.sql

@@ -0,0 +1,3 @@
+INSERT INTO `config` VALUES ('113', 'epay_url', '');
+INSERT INTO `config` VALUES ('114', 'epay_mch_id', '');
+INSERT INTO `config` VALUES ('115', 'epay_key', '');