admin 7 лет назад
Родитель
Сommit
59f0458f43

+ 230 - 217
app/Components/AlipayNotify.php

@@ -2,235 +2,248 @@
 
 namespace App\Components;
 
-class AlipayNotify {
-    /**
-     * HTTPS形式消息验证地址
-     */
-	var $https_verify_url = 'https://mapi.alipay.com/gateway.do?service=notify_verify&';
-	/**
-     * HTTP形式消息验证地址
-     */
-	var $http_verify_url = 'http://notify.alipay.com/trade/notify_query.do?';
-
-	
-	var $sign_type = "MD5";
-	var $partner = "";
-	var $md5_key = "";
-	var $private_key = "";
-	var $alipay_public_key = "";
-	var $transport = "http";
-	
-	/**
-	 * 构造函数
-	 * @param $sign_type 加密方式 MD5/RSA
-	 * return 
-	 */
-	function __construct($sign_type, $partner, $md5_key, $private_key, $alipay_public_key, $transport){
-		$this->sign_type = $sign_type;	
-		$this->partner = $partner;
-		$this->md5_key = $md5_key;
-		$this->private_key = $private_key;
-		$this->alipay_public_key = $alipay_public_key;
-		$this->transport = $transport;
-	}
-	
+/**
+ * Class AlipayNotify
+ *
+ * @author  wz812180
+ *
+ * @package App\Components
+ */
+class AlipayNotify
+{
+    private $https_verify_url = 'https://mapi.alipay.com/gateway.do?service=notify_verify&'; // HTTPS形式消息验证地址
+    private $http_verify_url = 'http://notify.alipay.com/trade/notify_query.do?'; // HTTP形式消息验证地址
+    private $sign_type = "MD5"; // 加密方式:MD5/RSA
+    private $partner = "";
+    private $md5_key = "";
+    private $private_key = "";
+    private $alipay_public_key = "";
+    private $transport = "http";
+
+    function __construct($sign_type, $partner, $md5_key, $private_key, $alipay_public_key, $transport)
+    {
+        $this->sign_type = $sign_type;
+        $this->partner = $partner;
+        $this->md5_key = $md5_key;
+        $this->private_key = $private_key;
+        $this->alipay_public_key = $alipay_public_key;
+        $this->transport = $transport;
+    }
+
     /**
      * 针对notify_url验证消息是否是支付宝发出的合法消息
-     * @return 验证结果
+     *
+     * @return bool 验证结果
      */
-	 public function verifyNotify(){
-		if(empty($_POST)) {//判断POST来的数组是否为空
-			//Tools::Log("POST来的数组为空");
-			return false;
-		}
-		else {
-			//生成签名结果
-			$isSign = $this->getSignVeryfy($_POST, $_POST["sign"]);
-			//Tools::Log($isSign);
-			$converted_res = ($isSign) ? 'true' : 'false';
-			//获取支付宝远程服务器ATN结果(验证是否是支付宝发来的消息)
-			$responseTxt = 'false';
-			if (! empty($_POST["notify_id"])) {
-				$responseTxt = $this->getResponse($_POST["notify_id"]);
-			}
-			//Tools::Log($responseTxt);
-			//验证
-			//$responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
-			//isSign的结果不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
-			if (preg_match("/true$/i",$responseTxt) && $isSign) {
-				return true;
-			} else {
-				return false;
-			}
-		}
-	}
-	
+    public function verifyNotify()
+    {
+        if (empty($_POST)) {
+            return false;
+        } else {
+            // 生成签名结果
+            $isSign = $this->getSignVeryfy($_POST, $_POST["sign"]);
+
+            $converted_res = ($isSign) ? 'true' : 'false';
+
+            // 获取支付宝远程服务器ATN结果(验证是否是支付宝发来的消息)
+            $responseTxt = 'false';
+            if (!empty($_POST["notify_id"])) {
+                $responseTxt = $this->getResponse($_POST["notify_id"]);
+            }
+
+            // 验证
+            // $responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
+            // isSign的结果不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
+            if (preg_match("/true$/i", $responseTxt) && $isSign) {
+                return true;
+            } else {
+                return false;
+            }
+        }
+    }
+
     /**
      * 获取返回时的签名验证结果
-     * @param $para_temp 通知返回来的参数数组
-     * @param $sign 返回的签名结果
-     * @return 签名验证结果
+     *
+     * @param array  $para_temp 通知返回来的参数数组
+     * @param string $sign      返回的签名结果
+     *
+     * @return bool 签名验证结果
      */
-	 function getSignVeryfy($para_temp, $sign) {
-		//除去待签名参数数组中的空值和签名参数
-		$para_filter = $this->paraFilter($para_temp);
-		
-		//对待签名参数数组排序
-		$para_sort = $this->argSort($para_filter);
-		
-		//把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
-		$prestr = $this->createLinkstring($para_sort);
-		
-		$isSgin = false;
-		switch (strtoupper(trim($this->sign_type))) {
-			case "RSA" :
-				$isSgin = $this->rsaVerify($prestr, trim($this->alipay_public_key), $sign);
-				break;
-			case "MD5" :
-				$isSgin = $this->md5Verify($prestr, $sign, trim($this->md5_key));
-				break;
-			default :
-				$isSgin = false;
-		}
-		return $isSgin;
-	}
+    function getSignVeryfy($para_temp, $sign)
+    {
+        // 除去待签名参数数组中的空值和签名参数
+        $para_filter = $this->paraFilter($para_temp);
+
+        // 对待签名参数数组排序
+        $para_sort = $this->argSort($para_filter);
+
+        // 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
+        $prestr = $this->createLinkString($para_sort);
+
+        switch (strtoupper(trim($this->sign_type))) {
+            case "RSA" :
+                $isSgin = $this->rsaVerify($prestr, trim($this->alipay_public_key), $sign);
+                break;
+            case "MD5" :
+                $isSgin = $this->md5Verify($prestr, $sign, trim($this->md5_key));
+                break;
+            default :
+                $isSgin = false;
+        }
+
+        return $isSgin;
+    }
 
     /**
      * 获取远程服务器ATN结果,验证返回URL
-     * @param $notify_id 通知校验ID
-     * @return 服务器ATN结果
+     *
+     * @param integer $notify_id 通知校验ID
+     *
+     * @return string 服务器ATN结果
      * 验证结果集:
-     * invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空 
+     * invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空
      * true 返回正确信息
      * false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟
      */
-	 function getResponse($notify_id) {
-		$transport = strtolower(trim($this->transport));
-		$partner = trim($this->partner);
-		$veryfy_url = '';
-		if($transport == 'https') {
-			$veryfy_url = $this->https_verify_url;
-		}
-		else {
-			$veryfy_url = $this->http_verify_url;
-		}
-		$veryfy_url = $veryfy_url."partner=" . $partner . "&notify_id=" . $notify_id;
-		$responseTxt = $this->getHttpResponseGET($veryfy_url, base_path('ca/cacert_alipay.pem'));
-		
-		return $responseTxt;
-	}
-
-	/**
-	 * RSA验签
-	 * @param $data 待签名数据
-	 * @param $alipay_public_key 支付宝的公钥字符串
-	 * @param $sign 要校对的的签名结果
-	 * return 验证结果
-	 */
-	 function rsaVerify($data, $alipay_public_key, $sign)  {
-		//以下为了初始化私钥,保证在您填写私钥时不管是带格式还是不带格式都可以通过验证。
-		$alipay_public_key=str_replace("-----BEGIN PUBLIC KEY-----","",$alipay_public_key);
-		$alipay_public_key=str_replace("-----END PUBLIC KEY-----","",$alipay_public_key);
-		$alipay_public_key=str_replace("\n","",$alipay_public_key);
-
-		$alipay_public_key='-----BEGIN PUBLIC KEY-----'.PHP_EOL.wordwrap($alipay_public_key, 64, "\n", true) .PHP_EOL.'-----END PUBLIC KEY-----';
-		$res=openssl_get_publickey($alipay_public_key);
-		if($res)
-		{
-			$result = (bool)openssl_verify($data, base64_decode($sign), $res);
-		}
-		else {
-			//Tools::Log("您的支付宝公钥格式不正确!"."<br/>"."The format of your alipay_public_key is incorrect!");
-			exit();
-		}
-		openssl_free_key($res);    
-		return $result;
-	}
-
-	/**
-	 * 验证签名 sign verify
-	 * @param $prestr 需要签名的字符串pre-sign string
-	 * @param $sign 签名结果
-	 * @param $key 私钥
-	 * return 签名结果sign generated
-	 */
-	function md5Verify($prestr, $sign, $key) {
-		$prestr = $prestr . $key;
-		$mysgin = md5($prestr);
-
-		if($mysgin == $sign) {
-			return true;
-		}
-		else {
-			return false;
-		}
-	}
-	
-	/**
-	 * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
-	 * @param $para 需要拼接的数组
-	 * return 拼接完成以后的字符串
-	 */
-	 function createLinkstring($para) {
-		$arg  = "";
-		while (list ($key, $val) = each ($para)) {
-			$arg.=$key."=".$val."&";
-		}
-		//去掉最后一个&字符
-		$arg = substr($arg,0,count($arg)-2);
-		
-		//如果存在转义字符,那么去掉转义
-		if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
-		
-		return $arg;
-	}
-	
-	/**
-	 * 远程获取数据,GET模式
-	 * 注意:
-	 * 1.使用Crul需要修改服务器中php.ini文件的设置,找到php_curl.dll去掉前面的";"就行了
-	 * 2.文件夹中cacert.pem是SSL证书请保证其路径有效,目前默认路径是:getcwd().'\\cacert.pem'
-	 * @param $url 指定URL完整路径地址
-	 * @param $cacert_url 指定当前工作目录绝对路径
-	 * return 远程输出的数据
-	 */
-	 function getHttpResponseGET($url,$cacert_url) {
-		$curl = curl_init($url);
-		curl_setopt($curl, CURLOPT_HEADER, 0 ); // 过滤HTTP头
-		curl_setopt($curl,CURLOPT_RETURNTRANSFER, 1);// 显示输出结果
-		curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);//SSL证书认证
-		curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);//严格认证
-		curl_setopt($curl, CURLOPT_CAINFO,$cacert_url);//证书地址
-		$responseText = curl_exec($curl);
-		//var_dump( curl_error($curl) );//如果执行curl过程中出现异常,可打开此开关,以便查看异常内容
-		curl_close($curl);
-		
-		return $responseText;
-	}
-	
-	/**
-	 * 除去数组中的空值和签名参数
-	 * @param $para 签名参数组
-	 * return 去掉空值与签名参数后的新签名参数组
-	 */
-	function paraFilter($para) {
-		$para_filter = array();
-		while (list ($key, $val) = each ($para)) {
-			if($key == "sign" || $key == "sign_type" || $val == "")continue;
-			else	$para_filter[$key] = $para[$key];
-		}
-		return $para_filter;
-	}
-	
-	/**
-	 * 对数组排序
-	 * @param $para 排序前的数组
-	 * return 排序后的数组
-	 */
-	function argSort($para) {
-		ksort($para);
-		reset($para);
-		return $para;
-	}
+    function getResponse($notify_id)
+    {
+        $transport = strtolower(trim($this->transport));
+        $partner = trim($this->partner);
+
+        $verify_url = $transport == 'https' ? $this->https_verify_url : $this->http_verify_url;
+        $verify_url = $verify_url . "partner=" . $partner . "&notify_id=" . $notify_id;
+        $responseTxt = $this->getHttpResponseGET($verify_url, base_path('ca/cacert_alipay.pem'));
+
+        return $responseTxt;
+    }
+
+    /**
+     * RSA验签
+     *
+     * @param string $data              待签名数据
+     * @param string $alipay_public_key 支付宝的公钥字符串
+     * @param string $sign              要校对的的签名结果
+     *
+     * @return bool
+     */
+    function rsaVerify($data, $alipay_public_key, $sign)
+    {
+        // 以下为了初始化私钥,保证在您填写私钥时不管是带格式还是不带格式都可以通过验证。
+        $alipay_public_key = str_replace("-----BEGIN PUBLIC KEY-----", "", $alipay_public_key);
+        $alipay_public_key = str_replace("-----END PUBLIC KEY-----", "", $alipay_public_key);
+        $alipay_public_key = str_replace("\n", "", $alipay_public_key);
+
+        $alipay_public_key = '-----BEGIN PUBLIC KEY-----' . PHP_EOL . wordwrap($alipay_public_key, 64, "\n", true) . PHP_EOL . '-----END PUBLIC KEY-----';
+        $res = openssl_get_publickey($alipay_public_key);
+        if (!$res) {
+            \Log::error("支付宝公钥格式不正确");
+            exit();
+        }
+
+        $result = (bool)openssl_verify($data, base64_decode($sign), $res);
+        openssl_free_key($res);
+
+        return $result;
+    }
+
+    /**
+     * 验证签名
+     *
+     * @param string $prestr 需要签名的字符串pre-sign
+     * @param string $sign   签名结果
+     * @param string $key    私钥
+     *
+     * @return bool
+     */
+    function md5Verify($prestr, $sign, $key)
+    {
+        $mysgin = md5($prestr . $key);
+
+        return $mysgin == $sign ? true : false;
+    }
+
+    /**
+     * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
+     *
+     * @param array $para 需要拼接的数组
+     *
+     * @return string
+     */
+    function createLinkString($para)
+    {
+        $arg = "";
+        while (list ($key, $val) = each($para)) {
+            $arg .= $key . "=" . $val . "&";
+        }
+
+        // 去掉最后一个&字符
+        $arg = substr($arg, 0, count($arg) - 2);
+
+        // 如果存在转义字符,那么去掉转义
+        if (get_magic_quotes_gpc()) {
+            $arg = stripslashes($arg);
+        }
+
+        return $arg;
+    }
+
+    /**
+     * 远程获取数据,GET模式
+     * 注意:文件夹中cacert.pem是SSL证书请保证其路径有效,目前默认路径是:getcwd().'\\cacert.pem'
+     *
+     * @param string $url        指定URL完整路径地址
+     * @param string $cacert_url 指定当前工作目录绝对路径
+     *
+     * @return mixed
+     */
+    function getHttpResponseGET($url, $cacert_url)
+    {
+        $curl = curl_init($url);
+        curl_setopt($curl, CURLOPT_HEADER, 0); // 过滤HTTP头
+        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 显示输出结果
+        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); // SSL证书认证
+        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); // 严格认证
+        curl_setopt($curl, CURLOPT_CAINFO, $cacert_url); // 证书地址
+        $responseText = curl_exec($curl);
+        //var_dump( curl_error($curl) );//如果执行curl过程中出现异常,可打开此开关,以便查看异常内容
+        curl_close($curl);
+
+        return $responseText;
+    }
+
+    /**
+     * 除去数组中的空值和签名参数
+     *
+     * @param array $para 签名参数组
+     *
+     * @return array 去掉空值与签名参数后的新签名参数组
+     */
+    function paraFilter($para)
+    {
+        $para_filter = [];
+        while (list ($key, $val) = each($para)) {
+            if ($key == "sign" || $key == "sign_type" || $val == "") continue;
+            else    $para_filter[$key] = $para[$key];
+        }
+
+        return $para_filter;
+    }
+
+    /**
+     * 对数组排序
+     *
+     * @param array $para 排序前的数组
+     *
+     * @return array 排序后的数组
+     */
+    function argSort($para)
+    {
+        ksort($para);
+        reset($para);
+
+        return $para;
+    }
 }
+
 ?>

+ 250 - 223
app/Components/AlipaySubmit.php

@@ -4,237 +4,264 @@ namespace App\Components;
 
 use \DOMDocument;
 
-class AlipaySubmit {
-
-	/**
-	 *支付宝网关地址(新)
-	 */
-	var $alipay_gateway_new = 'https://mapi.alipay.com/gateway.do?';
-	
-	var $sign_type = "MD5";
-	var $partner = "";
-	var $md5_key = "";
-	var $private_key = "";
-	
-	/**
-	 * 构造函数
-	 * @param $sign_type 加密方式 MD5/RSA
-	 * return 
-	 */
-	function __construct($sign_type, $partner, $md5_key, $private_key){
-		$this->sign_type = $sign_type;	
-		$this->partner = $partner;
-		$this->md5_key = $md5_key;
-		$this->private_key = $private_key;
-	}
-	
-	
-	/**
-	 * 生成签名结果
-	 * Generate the sign
-	 * @param $para_sort 已排序要签名的数组Parameters to sign
-	 * return 签名结果字符串sign generated
-	 */
-	function buildRequestMysign($para_sort) {
-		//把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
-    	//Rearrange parameters in the data set alphabetically and connect rearranged parameters with & like "parametername=value"
-		$prestr = $this->createLinkstring($para_sort);
-		
-		$mysign = "";
-		switch (strtoupper(trim($this->sign_type))) {
-			case "MD5" :
-				$mysign = $this->md5Sign($prestr, $this->md5_key);
-				break;
-			case "RSA" :
-				$mysign = $this->rsaSign($prestr, $this->private_key);
-				break;
-			default :
-				$mysign = "";
-		}
-		
-		return $mysign;
-	}
-
-	/**
+/**
+ * Class AlipaySubmit
+ *
+ * @author  wz812180
+ *
+ * @package App\Components
+ */
+class AlipaySubmit
+{
+    var $alipay_gateway_new = 'https://mapi.alipay.com/gateway.do?'; // 支付宝网关地址(新)
+    var $sign_type = "MD5"; // 加密方式:MD5/RSA
+    var $partner = "";
+    var $md5_key = "";
+    var $private_key = "";
+
+    function __construct($sign_type, $partner, $md5_key, $private_key)
+    {
+        $this->sign_type = $sign_type;
+        $this->partner = $partner;
+        $this->md5_key = $md5_key;
+        $this->private_key = $private_key;
+    }
+
+    /**
+     * 生成签名结果
+     *
+     * @param array $para_sort 已排序要签名的数组
+     *
+     * @return string
+     */
+    function buildRequestMysign($para_sort)
+    {
+        // 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
+        $prestr = $this->createLinkString($para_sort);
+
+        switch (strtoupper(trim($this->sign_type))) {
+            case "MD5" :
+                $mysign = $this->md5Sign($prestr, $this->md5_key);
+                break;
+            case "RSA" :
+                $mysign = $this->rsaSign($prestr, $this->private_key);
+                break;
+            default :
+                $mysign = "";
+        }
+
+        return $mysign;
+    }
+
+    /**
      * 生成要请求给支付宝的参数数组
-     * @param $para_temp 请求前的参数数组
-     * @return 要请求的参数数组
+     *
+     * @param array $para_temp 请求前的参数数组
+     *
+     * @return array
      */
-	function buildRequestPara($para_temp) {
-		//除去待签名参数数组中的空值和签名参数
-		$para_filter = $this->paraFilter($para_temp);
-
-		//对待签名参数数组排序
-		$para_sort = $this->argSort($para_filter);
-
-		//生成签名结果
-		$mysign = $this->buildRequestMysign($para_sort);
-		
-		//签名结果与签名方式加入请求提交参数组中
-		$para_sort['sign'] = $mysign;
-		$para_sort['sign_type'] = strtoupper(trim($this->sign_type));
-		
-		return $para_sort;
-	}
-
-	/**
+    function buildRequestPara($para_temp)
+    {
+        // 除去待签名参数数组中的空值和签名参数
+        $para_filter = $this->paraFilter($para_temp);
+
+        // 对待签名参数数组排序
+        $para_sort = $this->argSort($para_filter);
+
+        // 生成签名结果
+        $mysign = $this->buildRequestMysign($para_sort);
+
+        // 签名结果与签名方式加入请求提交参数组中
+        $para_sort['sign'] = $mysign;
+        $para_sort['sign_type'] = strtoupper(trim($this->sign_type));
+
+        return $para_sort;
+    }
+
+    /**
      * 生成要请求给支付宝的参数数组
-     * @param $para_temp 请求前的参数数组
-     * @return 要请求的参数数组字符串
+     *
+     * @param array $para_temp 请求前的参数数组
+     *
+     * @return string
      */
-	function buildRequestParaToString($para_temp) {
-		//待请求参数数组
-		$para = $this->buildRequestPara($para_temp);
-		
-		//把参数组中所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对字符串做urlencode编码
-		$request_data = $this->createLinkstringUrlencode($para);
-		
-		return $request_data;
-	}
-	
+    function buildRequestParaToString($para_temp)
+    {
+        // 待请求参数数组
+        $para = $this->buildRequestPara($para_temp);
+
+        // 把参数组中所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对字符串做urlencode编码
+        $request_data = $this->createLinkStringUrlEncode($para);
+
+        return $request_data;
+    }
+
     /**
      * 建立请求,以表单HTML形式构造(默认)
-     * @param $para_temp 请求参数数组
-     * @param $method 提交方式。两个值可选:post、get
-     * @param $button_name 确认按钮显示文字
-     * @return 提交表单HTML文本
+     *
+     * @param array  $para_temp   请求参数数组
+     * @param string $method      提交方式。两个值可选:post、get
+     * @param string $button_name 确认按钮显示文字
+     *
+     * @return string
      */
-	public function buildRequestForm($para_temp, $method, $button_name) {
-		//待请求参数数组
-		$para = $this->buildRequestPara($para_temp);
-		
-		$sHtml = "<form id='alipaysubmit' name='alipaysubmit' action='".$this->alipay_gateway_new."_input_charset=utf-8' method='".$method."'>";
-		while (list ($key, $val) = each ($para)) {
-            $sHtml.= "<input type='hidden' name='".$key."' value='".$val."'/>";
+    public function buildRequestForm($para_temp, $method, $button_name)
+    {
+        // 待请求参数数组
+        $para = $this->buildRequestPara($para_temp);
+
+        $sHtml = "<form id='alipaysubmit' name='alipaysubmit' action='" . $this->alipay_gateway_new . "_input_charset=utf-8' method='" . $method . "'>";
+        while (list ($key, $val) = each($para)) {
+            $sHtml .= "<input type='hidden' name='" . $key . "' value='" . $val . "'/>";
         }
 
-		//submit按钮控件请不要含有name属性
-        $sHtml = $sHtml."<input type='submit'  value='".$button_name."' style='display:none;'></form>";
-		
-		$sHtml = $sHtml."<script>document.forms['alipaysubmit'].submit();</script>";
-		//Tools::Log($sHtml);
-		return $sHtml;
-	}
-	
-	
-	/**
+        // submit按钮控件请不要含有name属性
+        $sHtml = $sHtml . "<input type='submit'  value='" . $button_name . "' style='display:none;'></form>";
+        $sHtml = $sHtml . "<script>document.forms['alipaysubmit'].submit();</script>";
+
+        return $sHtml;
+    }
+
+    /**
      * 用于防钓鱼,调用接口query_timestamp来获取时间戳的处理函数
-	 * 注意:该功能PHP5环境及以上支持,因此必须服务器、本地电脑中装有支持DOMDocument、SSL的PHP配置环境。建议本地调试时使用PHP开发软件
-     * return 时间戳字符串
-	 */
-	function query_timestamp() {
-		$url = $this->alipay_gateway_new."service=query_timestamp&partner=".trim(strtolower($this->partner))."&_input_charset=utf-8";
-		$encrypt_key = "";		
-
-		$doc = new DOMDocument();
-		$doc->load($url);
-		$itemEncrypt_key = $doc->getElementsByTagName( "encrypt_key" );
-		$encrypt_key = $itemEncrypt_key->item(0)->nodeValue;
-		
-		return $encrypt_key;
-	}
-	
-		/**
-	 * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
-	 * @param $para 需要拼接的数组
-	 * return 拼接完成以后的字符串
-	 */
-	 function createLinkstring($para) {
-		$arg  = "";
-		while (list ($key, $val) = each ($para)) {
-			$arg.=$key."=".$val."&";
-		}
-		//去掉最后一个&字符
-		$arg = substr($arg,0,count($arg)-2);
-		
-		//如果存在转义字符,那么去掉转义
-		if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
-		
-		return $arg;
-	}
-	
-	/**
-	 * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对字符串做urlencode编码
-	 * @param $para 需要拼接的数组
-	 * return 拼接完成以后的字符串
-	 */
-	function createLinkstringUrlencode($para) {
-		$arg  = "";
-		while (list ($key, $val) = each ($para)) {
-			$arg.=$key."=".urlencode($val)."&";
-		}
-		//去掉最后一个&字符
-		$arg = substr($arg,0,count($arg)-2);
-		
-		//如果存在转义字符,那么去掉转义
-		if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
-		
-		return $arg;
-	}
-	
-	/**
-	 * RSA签名
-	 * @param $data 待签名数据
-	 * @param $private_key 商户私钥字符串
-	 * return 签名结果
-	 */
-	function rsaSign($data, $private_key) {
-		//以下为了初始化私钥,保证在您填写私钥时不管是带格式还是不带格式都可以通过验证。
-		$private_key=str_replace("-----BEGIN RSA PRIVATE KEY-----","",$private_key);
-		$private_key=str_replace("-----END RSA PRIVATE KEY-----","",$private_key);
-		$private_key=str_replace("\n","",$private_key);
-
-		$private_key="-----BEGIN RSA PRIVATE KEY-----".PHP_EOL .wordwrap($private_key, 64, "\n", true). PHP_EOL."-----END RSA PRIVATE KEY-----";
-
-		$res=openssl_get_privatekey($private_key);
-
-		if($res)
-		{
-			openssl_sign($data, $sign,$res);
-		}
-		else {
-			echo "您的私钥格式不正确!"."<br/>"."The format of your private_key is incorrect!";
-			exit();
-		}
-		openssl_free_key($res);
-		//base64编码
-		$sign = base64_encode($sign);
-		return $sign;
-	}
-	
-	/**
-	 * sign  签名字符串
-	 * @param $prestr 需要签名的字符串
-	 * @param $key 私钥
-	 * return 签名结果 sign generated
-	 */
-	function md5Sign($prestr, $key) {
-		$prestr = $prestr . $key;
-		return md5($prestr);
-	}
-	
-	/**
-	 * 除去数组中的空值和签名参数
-	 * @param $para 签名参数组
-	 * return 去掉空值与签名参数后的新签名参数组
-	 */
-	function paraFilter($para) {
-		$para_filter = array();
-		while (list ($key, $val) = each ($para)) {
-			if($key == "sign" || $key == "sign_type" || $val == "")continue;
-			else	$para_filter[$key] = $para[$key];
-		}
-		return $para_filter;
-	}
-	
-	/**
-	 * 对数组排序
-	 * @param $para 排序前的数组
-	 * return 排序后的数组
-	 */
-	function argSort($para) {
-		ksort($para);
-		reset($para);
-		return $para;
-	}
+     *
+     * @return string
+     */
+    function query_timestamp()
+    {
+        $url = $this->alipay_gateway_new . "service=query_timestamp&partner=" . trim(strtolower($this->partner)) . "&_input_charset=utf-8";
+
+        $doc = new DOMDocument();
+        $doc->load($url);
+        $itemEncrypt_key = $doc->getElementsByTagName("encrypt_key");
+        $encrypt_key = $itemEncrypt_key->item(0)->nodeValue;
+
+        return $encrypt_key;
+    }
+
+    /**
+     * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
+     *
+     * @param array $para
+     *
+     * @return bool|string
+     */
+    function createLinkString($para)
+    {
+        $arg = "";
+        while (list ($key, $val) = each($para)) {
+            $arg .= $key . "=" . $val . "&";
+        }
+
+        // 去掉最后一个&字符
+        $arg = substr($arg, 0, count($arg) - 2);
+
+        // 如果存在转义字符,那么去掉转义
+        if (get_magic_quotes_gpc()) {
+            $arg = stripslashes($arg);
+        }
+
+        return $arg;
+    }
+
+    /**
+     * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对字符串做urlencode编码
+     *
+     * @param array $para 需要拼接的数组
+     *
+     * @return bool|string
+     */
+    function createLinkStringUrlEncode($para)
+    {
+        $arg = "";
+        while (list ($key, $val) = each($para)) {
+            $arg .= $key . "=" . urlencode($val) . "&";
+        }
+
+        // 去掉最后一个&字符
+        $arg = substr($arg, 0, count($arg) - 2);
+
+        // 如果存在转义字符,那么去掉转义
+        if (get_magic_quotes_gpc()) {
+            $arg = stripslashes($arg);
+        }
+
+        return $arg;
+    }
+
+    /**
+     * RSA签名
+     *
+     * @param string $data        待签名数据
+     * @param string $private_key 商户私钥字符串
+     *
+     * @return string
+     */
+    function rsaSign($data, $private_key)
+    {
+        //以下为了初始化私钥,保证在您填写私钥时不管是带格式还是不带格式都可以通过验证。
+        $private_key = str_replace("-----BEGIN RSA PRIVATE KEY-----", "", $private_key);
+        $private_key = str_replace("-----END RSA PRIVATE KEY-----", "", $private_key);
+        $private_key = str_replace("\n", "", $private_key);
+        $private_key = "-----BEGIN RSA PRIVATE KEY-----" . PHP_EOL . wordwrap($private_key, 64, "\n", true) . PHP_EOL . "-----END RSA PRIVATE KEY-----";
+
+        $res = openssl_get_privatekey($private_key);
+        if (!$res) {
+            \Log::error("私钥格式不正确");
+            exit();
+        }
+
+        openssl_sign($data, $sign, $res);
+        openssl_free_key($res);
+
+        $sign = base64_encode($sign); // base64编码
+
+        return $sign;
+    }
+
+    /**
+     * 签名字符串
+     *
+     * @param string $prestr 需要签名的字符串
+     * @param string $key    私钥
+     *
+     * @return string
+     */
+    function md5Sign($prestr, $key)
+    {
+        return md5($prestr . $key);
+    }
+
+    /**
+     * 除去数组中的空值和签名参数
+     *
+     * @param array $para 签名参数组
+     *
+     * @return array
+     */
+    function paraFilter($para)
+    {
+        $para_filter = [];
+        while (list ($key, $val) = each($para)) {
+            if ($key == "sign" || $key == "sign_type" || $val == "") continue;
+            else    $para_filter[$key] = $para[$key];
+        }
+
+        return $para_filter;
+    }
+
+    /**
+     * 对数组排序
+     *
+     * @param array $para 排序前的数组
+     *
+     * @return mixed
+     */
+    function argSort($para)
+    {
+        ksort($para);
+        reset($para);
+
+        return $para;
+    }
 }

+ 7 - 0
app/Components/Trimepay.php

@@ -2,6 +2,13 @@
 
 namespace App\Components;
 
+/**
+ * Class Trimepay
+ *
+ * @author  deepbwork
+ *
+ * @package App\Components
+ */
 class Trimepay
 {
     private $appId;

+ 9 - 6
app/Http/Controllers/AdminController.php

@@ -1979,7 +1979,7 @@ EOF;
 
         // 演示环境禁止修改特定配置项
         if (env('APP_DEMO')) {
-            if (in_array($name, ['website_url', 'push_bear_send_key', 'push_bear_qrcode', 'youzan_client_id', 'youzan_client_secret', 'kdt_id', 'is_forbid_china', 'trimepay_appid', 'trimepay_appsecret','alipay_partner','alipay_key','alipay_transport','alipay_sign_type','alipay_private_key','alipay_public_key'])) {
+            if (in_array($name, ['website_url', 'push_bear_send_key', 'push_bear_qrcode', 'youzan_client_id', 'youzan_client_secret', 'kdt_id', 'is_forbid_china', 'trimepay_appid', 'trimepay_appsecret', 'alipay_partner', 'alipay_key', 'alipay_transport', 'alipay_sign_type', 'alipay_private_key', 'alipay_public_key'])) {
                 return Response::json(['status' => 'fail', 'data' => '', 'message' => '演示环境禁止修改该配置']);
             }
         }
@@ -2000,7 +2000,8 @@ EOF;
             if ($is_trimepay->value) {
                 return Response::json(['status' => 'fail', 'data' => '', 'message' => '已经在使用【TrimePay支付】']);
             }
-			$is_alipay = Config::query()->where('name', 'is_alipay')->first();
+
+            $is_alipay = Config::query()->where('name', 'is_alipay')->first();
             if ($is_alipay->value) {
                 return Response::json(['status' => 'fail', 'data' => '', 'message' => '已经在使用【AliPay支付】']);
             }
@@ -2012,19 +2013,21 @@ EOF;
             if ($is_youzan->value) {
                 return Response::json(['status' => 'fail', 'data' => '', 'message' => '已经在使用【有赞云支付】']);
             }
-			$is_alipay = Config::query()->where('name', 'is_alipay')->first();
+
+            $is_alipay = Config::query()->where('name', 'is_alipay')->first();
             if ($is_alipay->value) {
                 return Response::json(['status' => 'fail', 'data' => '', 'message' => '已经在使用【AliPay支付】']);
             }
         }
-		
-		// 用AliPay支付不可用有赞云支付和TrimePay
+
+        // 用AliPay支付不可用有赞云支付和TrimePay
         if (in_array($name, ['is_alipay']) && $name) {
             $is_youzan = Config::query()->where('name', 'is_youzan')->first();
             if ($is_youzan->value) {
                 return Response::json(['status' => 'fail', 'data' => '', 'message' => '已经在使用【有赞云支付】']);
             }
-			$is_trimepay = Config::query()->where('name', 'is_trimepay')->first();
+
+            $is_trimepay = Config::query()->where('name', 'is_trimepay')->first();
             if ($is_trimepay->value) {
                 return Response::json(['status' => 'fail', 'data' => '', 'message' => '已经在使用【TrimePay支付】']);
             }

+ 41 - 30
app/Http/Controllers/Api/AlipayController.php

@@ -20,6 +20,13 @@ use DB;
 use Mail;
 use Hash;
 
+/**
+ * Class AlipayController
+ *
+ * @author  wz812180
+ *
+ * @package App\Http\Controllers\Api
+ */
 class AlipayController extends Controller
 {
     protected static $systemConfig;
@@ -40,42 +47,46 @@ class AlipayController extends Controller
     public function store(Request $request)
     {
         \Log::info("【AliPay】回调接口[POST]:" . var_export($request->all(), true));
-		$result = "fail";
-		$alipayNotify = new AlipayNotify(self::$systemConfig['alipay_sign_type'],self::$systemConfig['alipay_partner'],self::$systemConfig['alipay_key'],self::$systemConfig['alipay_private_key'],self::$systemConfig['alipay_public_key'],self::$systemConfig['alipay_transport']);
-		//验证支付宝交易
-		$verify_result = $alipayNotify->verifyNotify();
-		if($verify_result) {//验证成功
-			$result = "success";
-			if($_POST['trade_status'] == 'TRADE_FINISHED'||$_POST['trade_status'] == 'TRADE_SUCCESS') {
-				//商户订单号
-				$data = array();
-				$data['out_trade_no'] = $request->get('out_trade_no');
-				//支付宝交易号
-				$data['trade_no'] = $request->get('trade_no');
-				//交易状态
-				$data['trade_status'] = $request->get('trade_status');
-				//交易金额
-				$data['total_fee'] = $request->get('total_fee');
-
-				$this->tradePaid($data);
-			}else{
-				Log::info('AliPay-POST:交易失败[' . getClientIp() . ']');
-			}
-		}else{
-			Log::info('AliPay-POST:验证失败[' . getClientIp() . ']');
-		}
-		//返回验证结果
-		exit($result);
+
+        $result = "fail";
+        $alipayNotify = new AlipayNotify(self::$systemConfig['alipay_sign_type'], self::$systemConfig['alipay_partner'], self::$systemConfig['alipay_key'], self::$systemConfig['alipay_private_key'], self::$systemConfig['alipay_public_key'], self::$systemConfig['alipay_transport']);
+
+        // 验证支付宝交易
+        $verify_result = $alipayNotify->verifyNotify();
+        if ($verify_result) { // 验证成功
+            $result = "success";
+            if ($_POST['trade_status'] == 'TRADE_FINISHED' || $_POST['trade_status'] == 'TRADE_SUCCESS') {
+                // 商户订单号
+                $data = [];
+                $data['out_trade_no'] = $request->get('out_trade_no');
+                // 支付宝交易号
+                $data['trade_no'] = $request->get('trade_no');
+                // 交易状态
+                $data['trade_status'] = $request->get('trade_status');
+                // 交易金额
+                $data['total_fee'] = $request->get('total_fee');
+
+                $this->tradePaid($data);
+            } else {
+                Log::info('AliPay-POST:交易失败[' . getClientIp() . ']');
+            }
+        } else {
+            Log::info('AliPay-POST:验证失败[' . getClientIp() . ']');
+        }
+
+        // 返回验证结果
+        exit($result);
     }
 
     // 交易支付
     private function tradePaid($msg)
     {
-        Log::info('【alipay】回调交易支付');
-		//获取未完成状态的订单防止重复增加时间
+        Log::info('【Alipay】回调交易支付');
+
+        // 获取未完成状态的订单防止重复增加时间
         $payment = Payment::query()->with(['order', 'order.goods'])->where('status', 0)->where('order_sn', $msg['out_trade_no'])->first();
         if (!$payment) {
-            Log::info('【alipay】回调订单不存在');
+            Log::info('【Alipay】回调订单不存在');
             return;
         }
 
@@ -261,7 +272,7 @@ class AlipayController extends Controller
             DB::commit();
         } catch (\Exception $e) {
             DB::rollBack();
-            Log::info('【Trimepay】回调更新支付单和订单异常:' . $e->getMessage());
+            Log::info('【Alipay】回调更新支付单和订单异常:' . $e->getMessage());
         }
     }
 

+ 38 - 35
app/Http/Controllers/PaymentController.php

@@ -47,9 +47,10 @@ class PaymentController extends Controller
         }
 
         // 判断是否开启有赞云支付
-        if (!self::$systemConfig['is_youzan'] && !self::$systemConfig['is_trimepay']&& !self::$systemConfig['is_alipay']) {
+        if (!self::$systemConfig['is_youzan'] && !self::$systemConfig['is_trimepay'] && !self::$systemConfig['is_alipay']) {
             return Response::json(['status' => 'fail', 'data' => '', 'message' => '创建支付单失败:系统并未开启在线支付功能']);
         }
+
         // 判断是否存在同个商品的未支付订单
         $existsOrder = Order::query()->where('status', 0)->where('user_id', Auth::user()->id)->where('goods_id', $goods_id)->exists();
         if ($existsOrder) {
@@ -72,7 +73,7 @@ class PaymentController extends Controller
                 return Response::json(['status' => 'fail', 'data' => '', 'message' => '创建支付单失败:此商品每人限购1次']);
             }
         }
-		
+
         // 使用优惠券
         if ($coupon_sn) {
             $coupon = Coupon::query()->where('status', 0)->where('is_del', 0)->whereIn('type', [1, 2])->where('sn', $coupon_sn)->first();
@@ -93,7 +94,7 @@ class PaymentController extends Controller
         } elseif ($amount == 0) {
             return Response::json(['status' => 'fail', 'data' => '', 'message' => '创建支付单失败:订单总价为0,无需使用在线支付']);
         }
-		
+
         // 验证账号是否存在有效期更长的套餐
         if ($goods->type == 2) {
             $existOrderList = Order::query()
@@ -112,7 +113,7 @@ class PaymentController extends Controller
                 }
             }
         }
-		
+
         DB::beginTransaction();
         try {
             $orderSn = date('ymdHis') . mt_rand(100000, 999999);
@@ -121,12 +122,12 @@ class PaymentController extends Controller
             // 支付方式
             if (self::$systemConfig['is_youzan']) {
                 $pay_way = 2;
-            } else if (self::$systemConfig['is_trimepay']) {
+            } elseif (self::$systemConfig['is_trimepay']) {
                 $pay_way = 3;
-            } else if (self::$systemConfig['is_alipay']) {
+            } elseif (self::$systemConfig['is_alipay']) {
                 $pay_way = 4;
             }
-			
+
             // 生成订单
             $order = new Order();
             $order->order_sn = $orderSn;
@@ -150,12 +151,12 @@ class PaymentController extends Controller
 
                     throw new \Exception($result['error_response']['msg']);
                 }
-            } else if (self::$systemConfig['is_trimepay']) {
+            } elseif (self::$systemConfig['is_trimepay']) {
                 $trimepay = new Trimepay(self::$systemConfig['trimepay_appid'], self::$systemConfig['trimepay_appsecret']);
 
                 if ($pay_type == 1) {
                     $payMethod = 'ALIPAY_QR';
-                } else if ($pay_type == 2) {
+                } elseif ($pay_type == 2) {
                     $payMethod = 'WEPAY_QR';
                 }
 
@@ -165,23 +166,24 @@ class PaymentController extends Controller
 
                     throw new \Exception($result['msg']);
                 }
-            }else if (self::$systemConfig['is_alipay']) {
-				$parameter = array(
-					"service"       => "create_forex_trade",                   //WAP:create_forex_trade_wap ,即时到帐:create_forex_trade
-					"partner"       => self::$systemConfig['alipay_partner'],
-					"notify_url"	=> self::$systemConfig['website_url']."/api/alipay",  //异步回调接口
-					"return_url"	=> self::$systemConfig['website_url'],
-					"out_trade_no"	=> $orderSn,                               //订单号
-					"subject"	=> "Package",                                  //订单名称
-					"total_fee"	=> $amount,                                    //金额
-					"body"	=> "",                                             //商品描述,可为空
-					"currency" => self::$systemConfig['alipay_currency'],      //币种
-					"product_code" => "NEW_OVERSEAS_SELLER",
-					"_input_charset" => "utf-8"
-				);
-				//建立请求
-				$alipaySubmit = new AlipaySubmit(self::$systemConfig['alipay_sign_type'],self::$systemConfig['alipay_partner'],self::$systemConfig['alipay_key'],self::$systemConfig['alipay_private_key']);
-				$result = $alipaySubmit->buildRequestForm($parameter,"post", "确认");
+            } elseif (self::$systemConfig['is_alipay']) {
+                $parameter = [
+                    "service"        => "create_forex_trade", // WAP:create_forex_trade_wap ,即时到帐:create_forex_trade
+                    "partner"        => self::$systemConfig['alipay_partner'],
+                    "notify_url"     => self::$systemConfig['website_url'] . "/api/alipay", // 异步回调接口
+                    "return_url"     => self::$systemConfig['website_url'],
+                    "out_trade_no"   => $orderSn, // 订单号
+                    "subject"        => "Package", // 订单名称
+                    "total_fee"      => $amount, // 金额
+                    "body"           => "", // 商品描述,可为空
+                    "currency"       => self::$systemConfig['alipay_currency'], // 币种
+                    "product_code"   => "NEW_OVERSEAS_SELLER",
+                    "_input_charset" => "utf-8"
+                ];
+		
+                // 建立请求
+                $alipaySubmit = new AlipaySubmit(self::$systemConfig['alipay_sign_type'], self::$systemConfig['alipay_partner'], self::$systemConfig['alipay_key'], self::$systemConfig['alipay_private_key']);
+                $result = $alipaySubmit->buildRequestForm($parameter, "post", "确认");
             }
 
             $payment = new Payment();
@@ -196,11 +198,11 @@ class PaymentController extends Controller
                 $payment->qr_url = $result['response']['qr_url'];
                 $payment->qr_code = $result['response']['qr_code'];
                 $payment->qr_local_url = $this->base64ImageSaver($result['response']['qr_code']);
-            } else if (self::$systemConfig['is_trimepay']) {
+            } elseif (self::$systemConfig['is_trimepay']) {
                 $payment->qr_url = $result['data'];
                 $payment->qr_code = 'https://www.zhihu.com/qrcode?url=' . $result['data'];
                 $payment->qr_local_url = 'https://www.zhihu.com/qrcode?url=' . $result['data'];
-            }else if (self::$systemConfig['is_alipay']) {
+            } elseif (self::$systemConfig['is_alipay']) {
                 $payment->qr_code = $result;
             }
             $payment->status = 0;
@@ -217,12 +219,12 @@ class PaymentController extends Controller
             }
 
             DB::commit();
-			if (self::$systemConfig['is_alipay']) {
-				//alipay返回支付信息
-				return Response::json(['status' => 'success', 'data' => $result, 'message' => '创建订单成功,正在转到付款页面,请稍后']);
-			}else{
-				return Response::json(['status' => 'success', 'data' => $sn, 'message' => '创建订单成功,正在转到付款页面,请稍后']);
-			}
+            if (self::$systemConfig['is_alipay']) {
+                // Alipay返回支付信息
+                return Response::json(['status' => 'success', 'data' => $result, 'message' => '创建订单成功,正在转到付款页面,请稍后']);
+            } else {
+                return Response::json(['status' => 'success', 'data' => $sn, 'message' => '创建订单成功,正在转到付款页面,请稍后']);
+            }
         } catch (\Exception $e) {
             DB::rollBack();
 
@@ -255,7 +257,8 @@ class PaymentController extends Controller
         $view['website_logo'] = self::$systemConfig['website_logo'];
         $view['website_analytics'] = self::$systemConfig['website_analytics'];
         $view['website_customer_service'] = self::$systemConfig['website_customer_service'];
-		$view['is_alipay'] = self::$systemConfig['is_alipay'];
+        $view['is_alipay'] = self::$systemConfig['is_alipay'];
+
         return Response::view('payment.detail', $view);
     }
 

+ 2 - 2
app/Http/Controllers/UserController.php

@@ -775,8 +775,8 @@ class UserController extends Controller
             $view['goods'] = $goods;
             $view['is_youzan'] = self::$systemConfig['is_youzan'];
             $view['is_trimepay'] = self::$systemConfig['is_trimepay'];
-			$view['is_alipay'] = self::$systemConfig['is_alipay'];
-			
+            $view['is_alipay'] = self::$systemConfig['is_alipay'];
+
             return Response::view('user.buy', $view);
         }
     }

+ 2 - 24
ca/cacert.pem

@@ -1,7 +1,7 @@
 ##
 ## Bundle of CA Root Certificates
 ##
-## Certificate data from Mozilla as of: Wed Oct 17 03:12:10 2018 GMT
+## Certificate data from Mozilla as of: Wed Dec  5 04:12:10 2018 GMT
 ##
 ## This is a bundle of X.509 certificates of public Certificate Authorities
 ## (CA). These were automatically extracted from Mozilla's root certificates
@@ -14,7 +14,7 @@
 ## Just configure this file as the SSLCACertificateFile.
 ##
 ## Conversion done with mk-ca-bundle.pl version 1.27.
-## SHA256: 3f875d87fee4ce3d966c69f1d6c111aa95c0143ade59e4fa24882c582bb5f0ca
+## SHA256: 35b415062acb8c2c27607083b5b3bec8f4ff57463c9b9f06db3e8df3ea895592
 ##
 
 
@@ -261,28 +261,6 @@ gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
 X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
 -----END CERTIFICATE-----
 
-Visa eCommerce Root
-===================
------BEGIN CERTIFICATE-----
-MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
-EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
-QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
-WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
-VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
-bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
-F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
-RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
-TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
-/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
-GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
-MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
-CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
-YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
-zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
-YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
-398znM/jra6O1I7mT1GvFpLgXPYHDw==
------END CERTIFICATE-----
-
 Comodo AAA Services root
 ========================
 -----BEGIN CERTIFICATE-----

+ 1 - 5
readme.md

@@ -261,11 +261,7 @@ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
 yum install ntp
 ntpdate cn.pool.ntp.org
 ````
-编辑crontab表,每天时间校准一次。 
-```
-crontab -e 
-```
-编辑内容
+#### 每日自动校时(crontab)
 ```
 0 0 * * * /usr/sbin/ntpdate cn.pool.ntp.org 
 ```

+ 2 - 0
resources/views/admin/addNode.blade.php

@@ -372,6 +372,8 @@
                                                                     <option value="srtp">视频通话数据 (SRTP)</option>
                                                                     <option value="utp">BT下载数据 (uTP)</option>
                                                                     <option value="wechat-video">微信视频通话</option>
+                                                                    <option value="dtls">DTLS1.2数据包</option>
+                                                                    <option value="wireguard">WireGuard数据包</option>
                                                                 </select>
                                                             </div>
                                                         </div>

+ 2 - 0
resources/views/admin/editNode.blade.php

@@ -371,6 +371,8 @@
                                                                     <option value="srtp" @if($node->v2_type == 'srtp') selected @endif>视频通话数据 (SRTP)</option>
                                                                     <option value="utp" @if($node->v2_type == 'utp') selected @endif>BT下载数据 (uTP)</option>
                                                                     <option value="wechat-video" @if($node->v2_type == 'wechat-video') selected @endif>微信视频通话</option>
+                                                                    <option value="dtls" @if($node->v2_type == 'dtls') selected @endif>DTLS1.2数据包</option>
+                                                                    <option value="wireguard" @if($node->v2_type == 'wireguard') selected @endif>WireGuard数据包</option>
                                                                 </select>
                                                             </div>
                                                         </div>

+ 12 - 16
resources/views/payment/detail.blade.php

@@ -54,16 +54,16 @@
     <script type="text/javascript">
         // 每800毫秒查询一次订单状态
         $(document).ready(function(){
-			//支付宝直接跳转支付
-			 @if($is_alipay)
-				 document.body.innerHTML += unescapeHTML("{{$payment->qr_code}}");
-				 document.forms['alipaysubmit'].submit();
-			 @endif
+            // 支付宝直接跳转支付
+            @if($is_alipay)
+                document.body.innerHTML += unescapeHTML("{{$payment->qr_code}}");
+                document.forms['alipaysubmit'].submit();
+            @endif
             setInterval("getStatus()", 800);
         });
 
         // 检查支付单状态
-        function getStatus () {
+        function getStatus() {
             var sn = '{{$payment->sn}}';
 
             $.get("{{url('payment/getStatus')}}", {sn:sn}, function (ret) {
@@ -89,15 +89,11 @@
         } else {
             x.setAttribute("height", "75%");
         }
-		
-		/**
-		 * @function unescapeHTML 还原html脚本 < > & " '
-		 * @param a -
-		 *            字符串
-		 */
-		function unescapeHTML(a){
-			a = "" + a;
-			return a.replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/g, "&").replace(/&quot;/g, '"').replace(/&#039;/g, "'");
-		}
+
+        // 还原html脚本 < > & " '
+        function unescapeHTML(str) {
+            str = "" + str;
+            return str.replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/g, "&").replace(/&quot;/g, '"').replace(/&#039;/g, "'");
+        }
     </script>
 @endsection

+ 7 - 7
resources/views/user/buy.blade.php

@@ -164,13 +164,13 @@
                 success: function (ret) {
 					layer.msg(ret.message, {time:1300}, function() {
                         if (ret.status == 'success') {
-							if(pay_type==4){
-								//如果是alipay支付写入alipay的支付页面
-								document.body.innerHTML += ret.data;
-								document.forms['alipaysubmit'].submit();
-							}else{
-								window.location.href = '{{url('payment')}}' + "/" + ret.data;
-							}
+                            if (pay_type==4) {
+                                // 如果是Alipay支付写入Alipay的支付页面
+                                document.body.innerHTML += ret.data;
+                                document.forms['alipaysubmit'].submit();
+                            } else {
+                                window.location.href = '{{url('payment')}}' + "/" + ret.data;
+                            }
                         } else {
                             window.location.href = '{{url('invoices')}}';
                         }