Эх сурвалжийг харах

易支付实装! 易支付&码支付代码简化

兔姬桑 4 жил өмнө
parent
commit
45c7800df5

+ 1 - 1
app/Http/Controllers/Admin/RuleController.php

@@ -276,7 +276,7 @@ class RuleController extends Controller {
 
 		$view['nodeList'] = SsNode::all();
 		$view['ruleList'] = Rule::all();
-		$view['ruleLogs'] = $query->paginate(15)->appends($request->except('page'));
+		$view['ruleLogs'] = $query->latest()->paginate(15)->appends($request->except('page'));
 		return Response::view('admin.rule.ruleLogList', $view);
 	}
 

+ 28 - 2
app/Http/Controllers/Gateway/AbstractPayment.php

@@ -26,10 +26,13 @@ abstract class AbstractPayment {
 
 	protected function postPayment($data, $method): int {
 		// 获取需要的信息
-		$payment = Payment::whereTradeNo($data)->latest()->first();
+		$payment = Payment::query()->whereTradeNo($data)->latest()->first();
 		// 是否为余额购买套餐
 		if($payment){
-			Payment::whereTradeNo($data)->update(['status' => 1]);
+			if($payment->status === 1){// 已处理
+				return 0;
+			}
+			Payment::query()->whereTradeNo($data)->update(['status' => 1]);
 			$order = Order::find($payment->oid);
 		}else{
 			$order = Order::find($data);
@@ -182,4 +185,27 @@ abstract class AbstractPayment {
 
 		return $log->save();
 	}
+
+	// MD5验签
+	protected function verify($data, $key, $signature): bool {
+		return hash_equals($this->aliStyleSign($data, $key), $signature);
+	}
+
+	/**
+	 *  Alipay式数据MD5签名
+	 * @param  array   $data  需要加密的数组
+	 * @param  string  $key   尾部的密钥
+	 * @return string md5加密后的数据
+	 */
+	protected function aliStyleSign($data, $key): string {
+		// 剃离sign,sign_type,空值
+		unset($data['sign'], $data['sign_type']);
+		array_filter($data);
+
+		// 排序
+		ksort($data, SORT_STRING);
+		reset($data);
+
+		return md5(urldecode(http_build_query($data)).$key);
+	}
 }

+ 10 - 11
app/Http/Controllers/Gateway/BitpayX.php

@@ -7,7 +7,6 @@ use Auth;
 use GuzzleHttp\Client;
 use Illuminate\Http\JsonResponse;
 use Log;
-use Psr\Http\Message\StreamInterface;
 use Response;
 
 class BitpayX extends AbstractPayment {
@@ -18,12 +17,12 @@ class BitpayX extends AbstractPayment {
 			'merchant_order_id' => $payment->trade_no,
 			'price_amount'      => (float) $request->input('amount'),
 			'price_currency'    => 'CNY',
-			'pay_currency'      => $request->input('type') == 1? 'ALIPAY' : 'WECHAT',
+			'pay_currency'      => $request->input('type') === '1'? 'ALIPAY' : 'WECHAT',
 			'title'             => '支付单号:'.$payment->trade_no,
-			'description'       => parent::$systemConfig['subject_name']?: parent::$systemConfig['website_name'],
-			'callback_url'      => (parent::$systemConfig['website_callback_url']?: parent::$systemConfig['website_url']).'/callback/notify?method=bitpayx',
-			'success_url'       => parent::$systemConfig['website_url'].'/invoices',
-			'cancel_url'        => parent::$systemConfig['website_url'],
+			'description'       => self::$systemConfig['subject_name']?: self::$systemConfig['website_name'],
+			'callback_url'      => (self::$systemConfig['website_callback_url']?: self::$systemConfig['website_url']).'/callback/notify?method=bitpayx',
+			'success_url'       => self::$systemConfig['website_url'].'/invoices',
+			'cancel_url'        => self::$systemConfig['website_url'],
 			'token'             => $this->sign($this->prepareSignId($payment->trade_no)),
 		];
 
@@ -44,13 +43,13 @@ class BitpayX extends AbstractPayment {
 	}
 
 	private function sign($data) {
-		return strtolower(md5(md5($data).parent::$systemConfig['bitpay_secret']));
+		return strtolower(md5(md5($data).self::$systemConfig['bitpay_secret']));
 	}
 
 	private function prepareSignId($tradeno) {
 		$data_sign = [
 			'merchant_order_id' => $tradeno,
-			'secret'            => parent::$systemConfig['bitpay_secret'],
+			'secret'            => self::$systemConfig['bitpay_secret'],
 			'type'              => 'FIAT'
 		];
 		ksort($data_sign, SORT_STRING);
@@ -58,15 +57,15 @@ class BitpayX extends AbstractPayment {
 		return http_build_query($data_sign);
 	}
 
-	private function mprequest($data, $type = 'pay'): StreamInterface {
+	private function mprequest($data, $type = 'pay') {
 		$client = new Client(['base_uri' => 'https://api.mugglepay.com/v1/', 'timeout' => 10]);
 
 		if($type === 'query'){
 			$request = $client->get('orders/merchant_order_id/status?id='.$data['merchant_order_id'],
-				['json' => ['token' => parent::$systemConfig['bitpay_secret']]]);
+				['json' => ['token' => self::$systemConfig['bitpay_secret']]]);
 		}else{// pay
 			$request = $client->post('orders',
-				['json' => ['token' => parent::$systemConfig['bitpay_secret']], 'body' => json_encode($data)]);
+				['json' => ['token' => self::$systemConfig['bitpay_secret']], 'body' => json_encode($data)]);
 		}
 		if($request->getStatusCode() != 200){
 			Log::debug('BitPayX请求支付错误:'.var_export($request, true));

+ 9 - 44
app/Http/Controllers/Gateway/CodePay.php

@@ -12,63 +12,28 @@ class CodePay extends AbstractPayment {
 		$payment = $this->creatNewPayment(Auth::id(), $request->input('oid'), $request->input('amount'));
 
 		$data = [
-			'id'         => parent::$systemConfig['codepay_id'],
+			'id'         => self::$systemConfig['codepay_id'],
 			'pay_id'     => $payment->trade_no,
 			'type'       => $request->input('type'),            //1支付宝支付 2QQ钱包 3微信支付
 			'price'      => $payment->amount,
 			'page'       => 1,
 			'outTime'    => 900,
-			'param'      => '',
-			'notify_url' => (parent::$systemConfig['website_callback_url']?: parent::$systemConfig['website_url']).'/callback/notify?method=codepay',
-			'return_url' => parent::$systemConfig['website_url'].'/invoices',
+			'notify_url' => (self::$systemConfig['website_callback_url']?: self::$systemConfig['website_url']).'/callback/notify?method=codepay',
+			'return_url' => self::$systemConfig['website_url'].'/invoices',
 		];
+		$data['sign'] = $this->aliStyleSign($data, self::$systemConfig['codepay_key']);
 
-		ksort($data);
-		reset($data);
-
-		$sign = '';
-		$urls = '';
-
-		foreach($data as $key => $val){
-			if($val == '' || $key === 'sign'){
-				continue;
-			}
-			if($sign != ''){
-				$sign .= '&';
-				$urls .= '&';
-			}
-			$sign .= "$key=$val"; //拼接为url参数形式
-			$urls .= "$key=".urlencode($val); //拼接为url参数形式并URL编码参数值
-		}
-		$query = $urls.'&sign='.md5($sign.parent::$systemConfig['codepay_key']); //创建订单所需的参数
-		$url = parent::$systemConfig['codepay_url'].$query; //支付页面
+		$url = self::$systemConfig['codepay_url'].http_build_query($data);
 		Payment::whereId($payment->id)->update(['url' => $url]);
 
 		return Response::json(['status' => 'success', 'url' => $url, 'message' => '创建订单成功!']);
 	}
 
 	public function notify($request): void {
-		ksort($_POST);
-		reset($_POST);
-		$sign = '';
-		foreach($_POST as $key => $val){
-			if($val == '' || $key === 'sign'){
-				continue;
-			}
-			if($sign){
-				$sign .= '&';
-			}
-			$sign .= "$key=$val";
-		}
-		if(!$_POST['pay_no'] || hash_equals($sign.parent::$systemConfig['codepay_key'], $_POST['sign'])){
-			exit('fail');
-		}
-		$payment = Payment::whereTradeNo($_POST['pay_id'])->first();
-
-		if($payment){
-			if($payment->status == 0){
-				$this->postPayment($_POST['pay_id'], '码支付');
-			}
+		$trade_no = $request->input('pay_id');
+		if($trade_no && $request->input('pay_no')
+		   && $this->verify($request->except('method'), self::$systemConfig['codepay_key'], $request->input('sign'))){
+			$this->postPayment($trade_no, '码支付');
 			exit('success');
 		}
 		exit('fail');

+ 10 - 37
app/Http/Controllers/Gateway/EPay.php

@@ -10,7 +10,6 @@ use Illuminate\Http\Request;
 use Response;
 
 class EPay extends AbstractPayment {
-	// Todo Debug测试
 	public function purchase(Request $request): JsonResponse {
 		$payment = $this->creatNewPayment(Auth::id(), $request->input('oid'), $request->input('amount'));
 
@@ -30,58 +29,32 @@ class EPay extends AbstractPayment {
 		$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',
+			'out_trade_no' => $payment->trade_no,
 			'name'         => self::$systemConfig['subject_name']?: self::$systemConfig['website_name'],
 			'money'        => $payment->amount,
 			'sign_type'    => 'MD5'
 		];
-		$data['sign'] = $this->sign($this->prepareSign($data));
-
-		$client = new Client(['timeout' => 5]);
-		$request = $client->get(self::$systemConfig['epay_url'].'/submit.php');
-		$result = json_decode($request->getBody(), true);
-
-		if($request->getStatusCode() != 200){
-			return Response::json(['status' => 'fail', 'message' => '网关处理失败!']);
-		}
-
-		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' => '创建订单成功!']);
-	}
+		$data['sign'] = $this->aliStyleSign($data, self::$systemConfig['epay_key']);
 
-	// 签名字符串
-	private function sign($data): string {
-		unset($data['sign'], $data['sign_type']);
-		array_filter($data);
-		ksort($data);
-		reset($data);
+		$url = self::$systemConfig['epay_url'].'submit.php?'.http_build_query($data);
+		Payment::whereId($payment->id)->update(['url' => $url]);
 
-		return md5(urldecode(http_build_query($data).self::$systemConfig['epay_key']));
+		return Response::json(['status' => 'success', 'url' => $url, 'message' => '创建订单成功!']);
 	}
 
 	public function notify(Request $request): void {
-		if($this->verify($request->except('method'), $request->input('sign'))
-		   && $request->input('trade_status') == 'TRADE_SUCCESS'){
+		if($request->input('trade_status') === 'TRADE_SUCCESS'
+		   && $this->verify($request->except('method'), self::$systemConfig['epay_key'], $request->input('sign'))){
 			$this->postPayment($request->input('out_trade_no'), 'EPay');
-			die('SUCCESS');
+			exit('SUCCESS');
 		}
-		die('FAIL');
-	}
-
-	// 验证签名
-	private function verify($data, $signature): bool {
-		return $this->sign($data) === $signature;
+		exit('FAIL');
 	}
 
 	public function queryInfo(): JsonResponse {
-		$request = self::$client->get('api.php', [
+		$request = (new Client())->get(self::$systemConfig['epay_url'].'api.php', [
 			'query' => [
 				'act' => 'query',
 				'pid' => self::$systemConfig['epay_mch_id'],

+ 2 - 2
app/Http/Controllers/Gateway/PayJs.php

@@ -23,10 +23,10 @@ class PayJs extends AbstractPayment {
 		$payment = $this->creatNewPayment(Auth::id(), $request->input('oid'), $request->input('amount'));
 
 		$result = (new Pay($this::$config))->cashier([
-			'body'         => parent::$systemConfig['subject_name']?: parent::$systemConfig['website_name'],
+			'body'         => self::$systemConfig['subject_name']?: self::$systemConfig['website_name'],
 			'total_fee'    => $payment->amount * 100,
 			'out_trade_no' => $payment->trade_no,
-			'notify_url'   => (parent::$systemConfig['website_callback_url']?: parent::$systemConfig['website_url']).'/callback/notify?method=payjs',
+			'notify_url'   => (self::$systemConfig['website_callback_url']?: self::$systemConfig['website_url']).'/callback/notify?method=payjs',
 		]);
 
 		// 获取收款二维码内容

+ 2 - 3
resources/views/admin/config/system.blade.php

@@ -1242,7 +1242,7 @@
 											<label class="col-md-3 col-form-label" for="codepay_url">请求URL</label>
 											<div class="col-md-7">
 												<div class="input-group">
-													<input type="text" class="form-control" id="codepay_url" value="{{$codepay_url}}"/>
+													<input type="text" class="form-control" id="codepay_url" value="{{$codepay_url}}" placeholder="https://codepay.fateqq.com/creat_order/?"/>
 													<span class="input-group-append">
 														<button class="btn btn-primary" type="button" onclick="update('codepay_url')">修改</button>
 													</span>
@@ -1265,7 +1265,7 @@
 									</div>
 									<div class="form-group col-lg-6">
 										<div class="row">
-											<label class="col-md-3 col-form-label" for="codepay_key">码支付通信密钥</label>
+											<label class="col-md-3 col-form-label" for="codepay_key">通信密钥</label>
 											<div class="col-md-7">
 												<div class="input-group">
 													<input type="text" class="form-control" id="codepay_key" value="{{$codepay_key}}"/>
@@ -1283,7 +1283,6 @@
 											<label class="col-md-3 col-form-label">易支付</label>
 											<div class="col-md-7">
 												<button class="btn btn-primary" type="button" onclick="epayInfo()">咨询查询</button>
-												{{--												请到 <a href="https://codepay.fateqq.com/i/377289" target="_blank">码支付</a>申请账号,然后下载登录其挂机软件--}}
 											</div>
 										</div>
 									</div>