zxhxx 3 年之前
父節點
當前提交
ccd27245ae
共有 93 個文件被更改,包括 8193 次插入8435 次删除
  1. 1 3
      .idea/gp.iml
  2. 1 3
      .idea/php.xml
  3. 2 1
      composer.json
  4. 53 141
      composer.lock
  5. 142 15
      vendor/composer/ClassLoader.php
  6. 337 0
      vendor/composer/InstalledVersions.php
  7. 1 0
      vendor/composer/autoload_classmap.php
  8. 2 1
      vendor/composer/autoload_psr4.php
  9. 7 2
      vendor/composer/autoload_real.php
  10. 15 9
      vendor/composer/autoload_static.php
  11. 3088 3126
      vendor/composer/installed.json
  12. 632 0
      vendor/composer/installed.php
  13. 26 0
      vendor/composer/platform_check.php
  14. 2 0
      vendor/jialeo/payment/.gitignore
  15. 69 0
      vendor/jialeo/payment/README.md
  16. 20 0
      vendor/jialeo/payment/composer.json
  17. 143 0
      vendor/jialeo/payment/doc/Alipay.md
  18. 26 0
      vendor/jialeo/payment/doc/Applepay.md
  19. 263 0
      vendor/jialeo/payment/doc/Wechatpay.md
  20. 29 0
      vendor/jialeo/payment/src/Alipay/AppPay.php
  21. 244 0
      vendor/jialeo/payment/src/Alipay/BaseAlipay.php
  22. 129 0
      vendor/jialeo/payment/src/Alipay/BasePay.php
  23. 57 0
      vendor/jialeo/payment/src/Alipay/Notify.php
  24. 26 0
      vendor/jialeo/payment/src/Alipay/QrcodePay.php
  25. 116 0
      vendor/jialeo/payment/src/Alipay/Refund.php
  26. 105 0
      vendor/jialeo/payment/src/Alipay/Transfer.php
  27. 102 0
      vendor/jialeo/payment/src/Alipay/Utils/Rsa2Encrypt.php
  28. 15 0
      vendor/jialeo/payment/src/Alipay/WapPay.php
  29. 16 0
      vendor/jialeo/payment/src/Alipay/WebPay.php
  30. 83 0
      vendor/jialeo/payment/src/Applepay/IAP.php
  31. 81 0
      vendor/jialeo/payment/src/Common/Curl.php
  32. 17 0
      vendor/jialeo/payment/src/Common/PaymentException.php
  33. 26 0
      vendor/jialeo/payment/src/Paypal/AppPay.php
  34. 69 0
      vendor/jialeo/payment/src/Paypal/BasePay.php
  35. 215 0
      vendor/jialeo/payment/src/Paypal/BasePaypalPay.php
  36. 69 0
      vendor/jialeo/payment/src/Paypal/MassPay.php
  37. 52 0
      vendor/jialeo/payment/src/Paypal/Notify.php
  38. 46 0
      vendor/jialeo/payment/src/Paypal/Refund.php
  39. 13 0
      vendor/jialeo/payment/src/Paypal/WebPay.php
  40. 57 0
      vendor/jialeo/payment/src/Unionpay/AppPay.php
  41. 75 0
      vendor/jialeo/payment/src/Unionpay/BasePay.php
  42. 67 0
      vendor/jialeo/payment/src/Unionpay/BaseUnionpay.php
  43. 55 0
      vendor/jialeo/payment/src/Unionpay/Notify.php
  44. 111 0
      vendor/jialeo/payment/src/Unionpay/Refund.php
  45. 172 0
      vendor/jialeo/payment/src/Unionpay/Utils/Rsa.php
  46. 43 0
      vendor/jialeo/payment/src/Unionpay/WebPay.php
  47. 45 0
      vendor/jialeo/payment/src/Wechatpay/AppPay.php
  48. 128 0
      vendor/jialeo/payment/src/Wechatpay/BasePay.php
  49. 210 0
      vendor/jialeo/payment/src/Wechatpay/BaseWechatpay.php
  50. 31 0
      vendor/jialeo/payment/src/Wechatpay/H5Pay.php
  51. 44 0
      vendor/jialeo/payment/src/Wechatpay/MpPay.php
  52. 31 0
      vendor/jialeo/payment/src/Wechatpay/NativePay.php
  53. 72 0
      vendor/jialeo/payment/src/Wechatpay/Notify.php
  54. 173 0
      vendor/jialeo/payment/src/Wechatpay/RedPack.php
  55. 132 0
      vendor/jialeo/payment/src/Wechatpay/Refund.php
  56. 88 0
      vendor/jialeo/payment/src/Wechatpay/RefundNotify.php
  57. 59 0
      vendor/jialeo/payment/src/Wechatpay/Tools.php
  58. 256 0
      vendor/jialeo/payment/src/Wechatpay/Transfer.php
  59. 4 4
      vendor/services.php
  60. 0 1
      vendor/topthink/think-cache/.gitignore
  61. 0 201
      vendor/topthink/think-cache/LICENSE
  62. 0 75
      vendor/topthink/think-cache/README.md
  63. 0 24
      vendor/topthink/think-cache/composer.json
  64. 0 271
      vendor/topthink/think-cache/src/CacheManager.php
  65. 0 210
      vendor/topthink/think-cache/src/cache/CacheItem.php
  66. 0 349
      vendor/topthink/think-cache/src/cache/Driver.php
  67. 0 130
      vendor/topthink/think-cache/src/cache/TagSet.php
  68. 0 286
      vendor/topthink/think-cache/src/cache/driver/File.php
  69. 0 208
      vendor/topthink/think-cache/src/cache/driver/Memcache.php
  70. 0 220
      vendor/topthink/think-cache/src/cache/driver/Memcached.php
  71. 0 244
      vendor/topthink/think-cache/src/cache/driver/Redis.php
  72. 0 174
      vendor/topthink/think-cache/src/cache/driver/Wincache.php
  73. 0 22
      vendor/topthink/think-cache/src/exception/InvalidArgumentException.php
  74. 0 31
      vendor/topthink/think-cache/src/facade/Cache.php
  75. 0 3
      vendor/topthink/think-container/.gitignore
  76. 0 24
      vendor/topthink/think-container/.travis.yml
  77. 0 201
      vendor/topthink/think-container/LICENSE
  78. 0 98
      vendor/topthink/think-container/README.md
  79. 0 26
      vendor/topthink/think-container/composer.json
  80. 0 25
      vendor/topthink/think-container/phpunit.xml.dist
  81. 0 598
      vendor/topthink/think-container/src/Container.php
  82. 0 98
      vendor/topthink/think-container/src/Facade.php
  83. 0 39
      vendor/topthink/think-container/src/exception/ClassNotFoundException.php
  84. 0 290
      vendor/topthink/think-container/tests/ContainerTest.php
  85. 0 3
      vendor/topthink/think-container/tests/bootstrap.php
  86. 0 1
      vendor/topthink/think-log/.gitignore
  87. 0 201
      vendor/topthink/think-log/LICENSE
  88. 0 38
      vendor/topthink/think-log/README.md
  89. 0 21
      vendor/topthink/think-log/composer.json
  90. 0 510
      vendor/topthink/think-log/src/LogManager.php
  91. 0 32
      vendor/topthink/think-log/src/facade/Log.php
  92. 0 208
      vendor/topthink/think-log/src/log/driver/File.php
  93. 0 268
      vendor/topthink/think-log/src/log/driver/Socket.php

+ 1 - 3
.idea/gp.iml

@@ -7,13 +7,11 @@
       <sourceFolder url="file://$MODULE_DIR$/extend" isTestSource="false" />
       <sourceFolder url="file://$MODULE_DIR$/spec" isTestSource="true" />
       <sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" />
-      <excludeFolder url="file://$MODULE_DIR$/vendor/topthink/think-cache" />
       <excludeFolder url="file://$MODULE_DIR$/vendor/workerman/workerman" />
       <excludeFolder url="file://$MODULE_DIR$/vendor/topthink/think-template" />
       <excludeFolder url="file://$MODULE_DIR$/vendor/xaboy/form-builder" />
       <excludeFolder url="file://$MODULE_DIR$/vendor/monolog/monolog" />
       <excludeFolder url="file://$MODULE_DIR$/vendor/topthink/think-queue" />
-      <excludeFolder url="file://$MODULE_DIR$/vendor/topthink/think-container" />
       <excludeFolder url="file://$MODULE_DIR$/vendor/workerman/channel" />
       <excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/cache" />
       <excludeFolder url="file://$MODULE_DIR$/vendor/topthink/think-helper" />
@@ -21,7 +19,6 @@
       <excludeFolder url="file://$MODULE_DIR$/vendor/composer" />
       <excludeFolder url="file://$MODULE_DIR$/vendor/topthink/think-image" />
       <excludeFolder url="file://$MODULE_DIR$/vendor/topthink/think-view" />
-      <excludeFolder url="file://$MODULE_DIR$/vendor/topthink/think-log" />
       <excludeFolder url="file://$MODULE_DIR$/vendor/topthink/think-orm" />
       <excludeFolder url="file://$MODULE_DIR$/vendor/topthink/think-factory" />
       <excludeFolder url="file://$MODULE_DIR$/vendor/topthink/framework" />
@@ -61,6 +58,7 @@
       <excludeFolder url="file://$MODULE_DIR$/vendor/ralouphie/getallheaders" />
       <excludeFolder url="file://$MODULE_DIR$/vendor/spatie/macroable" />
       <excludeFolder url="file://$MODULE_DIR$/vendor/qiniu/php-sdk" />
+      <excludeFolder url="file://$MODULE_DIR$/vendor/jialeo/payment" />
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />

+ 1 - 3
.idea/php.xml

@@ -2,13 +2,11 @@
 <project version="4">
   <component name="PhpIncludePathManager">
     <include_path>
-      <path value="$PROJECT_DIR$/vendor/topthink/think-cache" />
       <path value="$PROJECT_DIR$/vendor/workerman/workerman" />
       <path value="$PROJECT_DIR$/vendor/topthink/think-template" />
       <path value="$PROJECT_DIR$/vendor/xaboy/form-builder" />
       <path value="$PROJECT_DIR$/vendor/monolog/monolog" />
       <path value="$PROJECT_DIR$/vendor/topthink/think-queue" />
-      <path value="$PROJECT_DIR$/vendor/topthink/think-container" />
       <path value="$PROJECT_DIR$/vendor/workerman/channel" />
       <path value="$PROJECT_DIR$/vendor/doctrine/cache" />
       <path value="$PROJECT_DIR$/vendor/topthink/think-helper" />
@@ -16,7 +14,6 @@
       <path value="$PROJECT_DIR$/vendor/composer" />
       <path value="$PROJECT_DIR$/vendor/topthink/think-image" />
       <path value="$PROJECT_DIR$/vendor/topthink/think-view" />
-      <path value="$PROJECT_DIR$/vendor/topthink/think-log" />
       <path value="$PROJECT_DIR$/vendor/topthink/think-orm" />
       <path value="$PROJECT_DIR$/vendor/topthink/think-factory" />
       <path value="$PROJECT_DIR$/vendor/topthink/framework" />
@@ -56,6 +53,7 @@
       <path value="$PROJECT_DIR$/vendor/ralouphie/getallheaders" />
       <path value="$PROJECT_DIR$/vendor/spatie/macroable" />
       <path value="$PROJECT_DIR$/vendor/qiniu/php-sdk" />
+      <path value="$PROJECT_DIR$/vendor/jialeo/payment" />
     </include_path>
   </component>
   <component name="PhpProjectSharedConfiguration" php_language_level="7.1">

+ 2 - 1
composer.json

@@ -38,7 +38,8 @@
         "spatie/macroable": "^1.0",
         "dh2y/think-qrcode": "^2.0",
         "topthink/think-multi-app": "^1.0",
-        "topthink/think-template": "^2.0"
+        "topthink/think-template": "^2.0",
+        "jialeo/payment": "^0.16.0"
     },
     "autoload": {
         "psr-4": {

+ 53 - 141
composer.lock

@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "07590fe9e1560a40838ccd52a9ce1d72",
+    "content-hash": "94cb517fb42adc83924757f9601a029f",
     "packages": [
         {
             "name": "aliyuncs/oss-sdk-php",
@@ -527,6 +527,56 @@
             ],
             "time": "2018-12-04T20:46:45+00:00"
         },
+        {
+            "name": "jialeo/payment",
+            "version": "0.16",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/jialeo/payment.git",
+                "reference": "28e5db40f8ab409f1b0f13c1588d29a004246d07"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/jialeo/payment/zipball/28e5db40f8ab409f1b0f13c1588d29a004246d07",
+                "reference": "28e5db40f8ab409f1b0f13c1588d29a004246d07",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.6.4"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "JiaLeo\\Payment\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Liang",
+                    "email": "chenjialiang@han-zi.cn"
+                }
+            ],
+            "description": "Alipay,Unicompay",
+            "keywords": [
+                "Unicompay",
+                "alipay"
+            ],
+            "support": {
+                "issues": "https://github.com/jialeo/payment/issues",
+                "source": "https://github.com/jialeo/payment/tree/0.16"
+            },
+            "time": "2020-04-29T08:25:58+00:00"
+        },
         {
             "name": "league/flysystem",
             "version": "1.0.57",
@@ -2398,53 +2448,6 @@
             ],
             "time": "2019-10-23T23:28:43+00:00"
         },
-        {
-            "name": "topthink/think-cache",
-            "version": "v2.0.6",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/top-think/think-cache.git",
-                "reference": "75a56b24affc65b51688fd89ada48c102757fd74"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/top-think/think-cache/zipball/75a56b24affc65b51688fd89ada48c102757fd74",
-                "reference": "75a56b24affc65b51688fd89ada48c102757fd74",
-                "shasum": "",
-                "mirrors": [
-                    {
-                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                        "preferred": true
-                    }
-                ]
-            },
-            "require": {
-                "opis/closure": "^3.1",
-                "php": ">=7.1.0",
-                "psr/cache": "~1.0",
-                "psr/simple-cache": "^1.0",
-                "topthink/think-container": "~2.0"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-4": {
-                    "think\\": "src"
-                },
-                "files": []
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "Apache-2.0"
-            ],
-            "authors": [
-                {
-                    "name": "liu21st",
-                    "email": "liu21st@gmail.com"
-                }
-            ],
-            "description": "Cache Manager",
-            "time": "2019-07-07T14:34:35+00:00"
-        },
         {
             "name": "topthink/think-captcha",
             "version": "v3.0.1",
@@ -2497,54 +2500,6 @@
             "description": "captcha package for thinkphp",
             "time": "2019-06-06T07:16:01+00:00"
         },
-        {
-            "name": "topthink/think-container",
-            "version": "v2.0.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/top-think/think-container.git",
-                "reference": "8ae724dccc8f6241229db29ef757a22934b76800"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/top-think/think-container/zipball/8ae724dccc8f6241229db29ef757a22934b76800",
-                "reference": "8ae724dccc8f6241229db29ef757a22934b76800",
-                "shasum": "",
-                "mirrors": [
-                    {
-                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                        "preferred": true
-                    }
-                ]
-            },
-            "require": {
-                "php": ">=7.1.0",
-                "psr/container": "~1.0",
-                "topthink/think-helper": "^3.1"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^7.0"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-4": {
-                    "think\\": "src"
-                },
-                "files": []
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "Apache-2.0"
-            ],
-            "authors": [
-                {
-                    "name": "liu21st",
-                    "email": "liu21st@gmail.com"
-                }
-            ],
-            "description": "PHP Container & Facade Manager",
-            "time": "2019-07-10T09:09:11+00:00"
-        },
         {
             "name": "topthink/think-factory",
             "version": "v1.0.1",
@@ -2678,50 +2633,6 @@
             "description": "The ThinkPHP5 Image Package",
             "time": "2016-09-29T06:05:43+00:00"
         },
-        {
-            "name": "topthink/think-log",
-            "version": "v2.0.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/top-think/think-log.git",
-                "reference": "de0bf6644228b39f03239cdc03251040d34a7b07"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/top-think/think-log/zipball/de0bf6644228b39f03239cdc03251040d34a7b07",
-                "reference": "de0bf6644228b39f03239cdc03251040d34a7b07",
-                "shasum": "",
-                "mirrors": [
-                    {
-                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                        "preferred": true
-                    }
-                ]
-            },
-            "require": {
-                "php": ">=7.1.0",
-                "psr/log": "~1.0",
-                "topthink/think-container": "^2.0"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-4": {
-                    "think\\": "src"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "Apache-2.0"
-            ],
-            "authors": [
-                {
-                    "name": "liu21st",
-                    "email": "liu21st@gmail.com"
-                }
-            ],
-            "description": "think log",
-            "time": "2019-07-07T14:47:46+00:00"
-        },
         {
             "name": "topthink/think-multi-app",
             "version": "v1.0.11",
@@ -3119,5 +3030,6 @@
         "ext-bcmath": "*",
         "ext-mbstring": "*"
     },
-    "platform-dev": []
+    "platform-dev": [],
+    "plugin-api-version": "2.1.0"
 }

+ 142 - 15
vendor/composer/ClassLoader.php

@@ -37,57 +37,130 @@ namespace Composer\Autoload;
  *
  * @author Fabien Potencier <fabien@symfony.com>
  * @author Jordi Boggiano <j.boggiano@seld.be>
- * @see    http://www.php-fig.org/psr/psr-0/
- * @see    http://www.php-fig.org/psr/psr-4/
+ * @see    https://www.php-fig.org/psr/psr-0/
+ * @see    https://www.php-fig.org/psr/psr-4/
  */
 class ClassLoader
 {
+    /** @var ?string */
+    private $vendorDir;
+
     // PSR-4
+    /**
+     * @var array[]
+     * @psalm-var array<string, array<string, int>>
+     */
     private $prefixLengthsPsr4 = array();
+    /**
+     * @var array[]
+     * @psalm-var array<string, array<int, string>>
+     */
     private $prefixDirsPsr4 = array();
+    /**
+     * @var array[]
+     * @psalm-var array<string, string>
+     */
     private $fallbackDirsPsr4 = array();
 
     // PSR-0
+    /**
+     * @var array[]
+     * @psalm-var array<string, array<string, string[]>>
+     */
     private $prefixesPsr0 = array();
+    /**
+     * @var array[]
+     * @psalm-var array<string, string>
+     */
     private $fallbackDirsPsr0 = array();
 
+    /** @var bool */
     private $useIncludePath = false;
+
+    /**
+     * @var string[]
+     * @psalm-var array<string, string>
+     */
     private $classMap = array();
+
+    /** @var bool */
     private $classMapAuthoritative = false;
+
+    /**
+     * @var bool[]
+     * @psalm-var array<string, bool>
+     */
     private $missingClasses = array();
+
+    /** @var ?string */
     private $apcuPrefix;
 
+    /**
+     * @var self[]
+     */
+    private static $registeredLoaders = array();
+
+    /**
+     * @param ?string $vendorDir
+     */
+    public function __construct($vendorDir = null)
+    {
+        $this->vendorDir = $vendorDir;
+    }
+
+    /**
+     * @return string[]
+     */
     public function getPrefixes()
     {
         if (!empty($this->prefixesPsr0)) {
-            return call_user_func_array('array_merge', $this->prefixesPsr0);
+            return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
         }
 
         return array();
     }
 
+    /**
+     * @return array[]
+     * @psalm-return array<string, array<int, string>>
+     */
     public function getPrefixesPsr4()
     {
         return $this->prefixDirsPsr4;
     }
 
+    /**
+     * @return array[]
+     * @psalm-return array<string, string>
+     */
     public function getFallbackDirs()
     {
         return $this->fallbackDirsPsr0;
     }
 
+    /**
+     * @return array[]
+     * @psalm-return array<string, string>
+     */
     public function getFallbackDirsPsr4()
     {
         return $this->fallbackDirsPsr4;
     }
 
+    /**
+     * @return string[] Array of classname => path
+     * @psalm-var array<string, string>
+     */
     public function getClassMap()
     {
         return $this->classMap;
     }
 
     /**
-     * @param array $classMap Class to filename map
+     * @param string[] $classMap Class to filename map
+     * @psalm-param array<string, string> $classMap
+     *
+     * @return void
      */
     public function addClassMap(array $classMap)
     {
@@ -102,9 +175,11 @@ class ClassLoader
      * Registers a set of PSR-0 directories for a given prefix, either
      * appending or prepending to the ones previously set for this prefix.
      *
-     * @param string       $prefix  The prefix
-     * @param array|string $paths   The PSR-0 root directories
-     * @param bool         $prepend Whether to prepend the directories
+     * @param string          $prefix  The prefix
+     * @param string[]|string $paths   The PSR-0 root directories
+     * @param bool            $prepend Whether to prepend the directories
+     *
+     * @return void
      */
     public function add($prefix, $paths, $prepend = false)
     {
@@ -147,11 +222,13 @@ class ClassLoader
      * Registers a set of PSR-4 directories for a given namespace, either
      * appending or prepending to the ones previously set for this namespace.
      *
-     * @param string       $prefix  The prefix/namespace, with trailing '\\'
-     * @param array|string $paths   The PSR-4 base directories
-     * @param bool         $prepend Whether to prepend the directories
+     * @param string          $prefix  The prefix/namespace, with trailing '\\'
+     * @param string[]|string $paths   The PSR-4 base directories
+     * @param bool            $prepend Whether to prepend the directories
      *
      * @throws \InvalidArgumentException
+     *
+     * @return void
      */
     public function addPsr4($prefix, $paths, $prepend = false)
     {
@@ -195,8 +272,10 @@ class ClassLoader
      * Registers a set of PSR-0 directories for a given prefix,
      * replacing any others previously set for this prefix.
      *
-     * @param string       $prefix The prefix
-     * @param array|string $paths  The PSR-0 base directories
+     * @param string          $prefix The prefix
+     * @param string[]|string $paths  The PSR-0 base directories
+     *
+     * @return void
      */
     public function set($prefix, $paths)
     {
@@ -211,10 +290,12 @@ class ClassLoader
      * Registers a set of PSR-4 directories for a given namespace,
      * replacing any others previously set for this namespace.
      *
-     * @param string       $prefix The prefix/namespace, with trailing '\\'
-     * @param array|string $paths  The PSR-4 base directories
+     * @param string          $prefix The prefix/namespace, with trailing '\\'
+     * @param string[]|string $paths  The PSR-4 base directories
      *
      * @throws \InvalidArgumentException
+     *
+     * @return void
      */
     public function setPsr4($prefix, $paths)
     {
@@ -234,6 +315,8 @@ class ClassLoader
      * Turns on searching the include path for class files.
      *
      * @param bool $useIncludePath
+     *
+     * @return void
      */
     public function setUseIncludePath($useIncludePath)
     {
@@ -256,6 +339,8 @@ class ClassLoader
      * that have not been registered with the class map.
      *
      * @param bool $classMapAuthoritative
+     *
+     * @return void
      */
     public function setClassMapAuthoritative($classMapAuthoritative)
     {
@@ -276,6 +361,8 @@ class ClassLoader
      * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
      *
      * @param string|null $apcuPrefix
+     *
+     * @return void
      */
     public function setApcuPrefix($apcuPrefix)
     {
@@ -296,25 +383,44 @@ class ClassLoader
      * Registers this instance as an autoloader.
      *
      * @param bool $prepend Whether to prepend the autoloader or not
+     *
+     * @return void
      */
     public function register($prepend = false)
     {
         spl_autoload_register(array($this, 'loadClass'), true, $prepend);
+
+        if (null === $this->vendorDir) {
+            return;
+        }
+
+        if ($prepend) {
+            self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
+        } else {
+            unset(self::$registeredLoaders[$this->vendorDir]);
+            self::$registeredLoaders[$this->vendorDir] = $this;
+        }
     }
 
     /**
      * Unregisters this instance as an autoloader.
+     *
+     * @return void
      */
     public function unregister()
     {
         spl_autoload_unregister(array($this, 'loadClass'));
+
+        if (null !== $this->vendorDir) {
+            unset(self::$registeredLoaders[$this->vendorDir]);
+        }
     }
 
     /**
      * Loads the given class or interface.
      *
      * @param  string    $class The name of the class
-     * @return bool|null True if loaded, null otherwise
+     * @return true|null True if loaded, null otherwise
      */
     public function loadClass($class)
     {
@@ -323,6 +429,8 @@ class ClassLoader
 
             return true;
         }
+
+        return null;
     }
 
     /**
@@ -367,6 +475,21 @@ class ClassLoader
         return $file;
     }
 
+    /**
+     * Returns the currently registered loaders indexed by their corresponding vendor directories.
+     *
+     * @return self[]
+     */
+    public static function getRegisteredLoaders()
+    {
+        return self::$registeredLoaders;
+    }
+
+    /**
+     * @param  string       $class
+     * @param  string       $ext
+     * @return string|false
+     */
     private function findFileWithExtension($class, $ext)
     {
         // PSR-4 lookup
@@ -438,6 +561,10 @@ class ClassLoader
  * Scope isolated include.
  *
  * Prevents access to $this/self from included files.
+ *
+ * @param  string $file
+ * @return void
+ * @private
  */
 function includeFile($file)
 {

+ 337 - 0
vendor/composer/InstalledVersions.php

@@ -0,0 +1,337 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer;
+
+use Composer\Autoload\ClassLoader;
+use Composer\Semver\VersionParser;
+
+/**
+ * This class is copied in every Composer installed project and available to all
+ *
+ * See also https://getcomposer.org/doc/07-runtime.md#installed-versions
+ *
+ * To require its presence, you can require `composer-runtime-api ^2.0`
+ */
+class InstalledVersions
+{
+    private static $installed;
+    private static $canGetVendors;
+    private static $installedByVendor = array();
+
+    /**
+     * Returns a list of all package names which are present, either by being installed, replaced or provided
+     *
+     * @return string[]
+     * @psalm-return list<string>
+     */
+    public static function getInstalledPackages()
+    {
+        $packages = array();
+        foreach (self::getInstalled() as $installed) {
+            $packages[] = array_keys($installed['versions']);
+        }
+
+        if (1 === \count($packages)) {
+            return $packages[0];
+        }
+
+        return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
+    }
+
+    /**
+     * Returns a list of all package names with a specific type e.g. 'library'
+     *
+     * @param  string   $type
+     * @return string[]
+     * @psalm-return list<string>
+     */
+    public static function getInstalledPackagesByType($type)
+    {
+        $packagesByType = array();
+
+        foreach (self::getInstalled() as $installed) {
+            foreach ($installed['versions'] as $name => $package) {
+                if (isset($package['type']) && $package['type'] === $type) {
+                    $packagesByType[] = $name;
+                }
+            }
+        }
+
+        return $packagesByType;
+    }
+
+    /**
+     * Checks whether the given package is installed
+     *
+     * This also returns true if the package name is provided or replaced by another package
+     *
+     * @param  string $packageName
+     * @param  bool   $includeDevRequirements
+     * @return bool
+     */
+    public static function isInstalled($packageName, $includeDevRequirements = true)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (isset($installed['versions'][$packageName])) {
+                return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Checks whether the given package satisfies a version constraint
+     *
+     * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
+     *
+     *   Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
+     *
+     * @param  VersionParser $parser      Install composer/semver to have access to this class and functionality
+     * @param  string        $packageName
+     * @param  string|null   $constraint  A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
+     * @return bool
+     */
+    public static function satisfies(VersionParser $parser, $packageName, $constraint)
+    {
+        $constraint = $parser->parseConstraints($constraint);
+        $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
+
+        return $provided->matches($constraint);
+    }
+
+    /**
+     * Returns a version constraint representing all the range(s) which are installed for a given package
+     *
+     * It is easier to use this via isInstalled() with the $constraint argument if you need to check
+     * whether a given version of a package is installed, and not just whether it exists
+     *
+     * @param  string $packageName
+     * @return string Version constraint usable with composer/semver
+     */
+    public static function getVersionRanges($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            $ranges = array();
+            if (isset($installed['versions'][$packageName]['pretty_version'])) {
+                $ranges[] = $installed['versions'][$packageName]['pretty_version'];
+            }
+            if (array_key_exists('aliases', $installed['versions'][$packageName])) {
+                $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
+            }
+            if (array_key_exists('replaced', $installed['versions'][$packageName])) {
+                $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
+            }
+            if (array_key_exists('provided', $installed['versions'][$packageName])) {
+                $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
+            }
+
+            return implode(' || ', $ranges);
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @param  string      $packageName
+     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
+     */
+    public static function getVersion($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            if (!isset($installed['versions'][$packageName]['version'])) {
+                return null;
+            }
+
+            return $installed['versions'][$packageName]['version'];
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @param  string      $packageName
+     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
+     */
+    public static function getPrettyVersion($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            if (!isset($installed['versions'][$packageName]['pretty_version'])) {
+                return null;
+            }
+
+            return $installed['versions'][$packageName]['pretty_version'];
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @param  string      $packageName
+     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
+     */
+    public static function getReference($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            if (!isset($installed['versions'][$packageName]['reference'])) {
+                return null;
+            }
+
+            return $installed['versions'][$packageName]['reference'];
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @param  string      $packageName
+     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
+     */
+    public static function getInstallPath($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @return array
+     * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}
+     */
+    public static function getRootPackage()
+    {
+        $installed = self::getInstalled();
+
+        return $installed[0]['root'];
+    }
+
+    /**
+     * Returns the raw installed.php data for custom implementations
+     *
+     * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
+     * @return array[]
+     * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}
+     */
+    public static function getRawData()
+    {
+        @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
+
+        if (null === self::$installed) {
+            // only require the installed.php file if this file is loaded from its dumped location,
+            // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
+            if (substr(__DIR__, -8, 1) !== 'C') {
+                self::$installed = include __DIR__ . '/installed.php';
+            } else {
+                self::$installed = array();
+            }
+        }
+
+        return self::$installed;
+    }
+
+    /**
+     * Returns the raw data of all installed.php which are currently loaded for custom implementations
+     *
+     * @return array[]
+     * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
+     */
+    public static function getAllRawData()
+    {
+        return self::getInstalled();
+    }
+
+    /**
+     * Lets you reload the static array from another file
+     *
+     * This is only useful for complex integrations in which a project needs to use
+     * this class but then also needs to execute another project's autoloader in process,
+     * and wants to ensure both projects have access to their version of installed.php.
+     *
+     * A typical case would be PHPUnit, where it would need to make sure it reads all
+     * the data it needs from this class, then call reload() with
+     * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
+     * the project in which it runs can then also use this class safely, without
+     * interference between PHPUnit's dependencies and the project's dependencies.
+     *
+     * @param  array[] $data A vendor/composer/installed.php data set
+     * @return void
+     *
+     * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>} $data
+     */
+    public static function reload($data)
+    {
+        self::$installed = $data;
+        self::$installedByVendor = array();
+    }
+
+    /**
+     * @return array[]
+     * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
+     */
+    private static function getInstalled()
+    {
+        if (null === self::$canGetVendors) {
+            self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
+        }
+
+        $installed = array();
+
+        if (self::$canGetVendors) {
+            foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
+                if (isset(self::$installedByVendor[$vendorDir])) {
+                    $installed[] = self::$installedByVendor[$vendorDir];
+                } elseif (is_file($vendorDir.'/composer/installed.php')) {
+                    $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
+                    if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
+                        self::$installed = $installed[count($installed) - 1];
+                    }
+                }
+            }
+        }
+
+        if (null === self::$installed) {
+            // only require the installed.php file if this file is loaded from its dumped location,
+            // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
+            if (substr(__DIR__, -8, 1) !== 'C') {
+                self::$installed = require __DIR__ . '/installed.php';
+            } else {
+                self::$installed = array();
+            }
+        }
+        $installed[] = self::$installed;
+
+        return $installed;
+    }
+}

+ 1 - 0
vendor/composer/autoload_classmap.php

@@ -8,6 +8,7 @@ $baseDir = dirname($vendorDir);
 return array(
     'ArithmeticError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php',
     'AssertionError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php',
+    'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
     'DivisionByZeroError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php',
     'Error' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/Error.php',
     'ParseError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/ParseError.php',

+ 2 - 1
vendor/composer/autoload_psr4.php

@@ -9,7 +9,7 @@ return array(
     'think\\view\\driver\\' => array($vendorDir . '/topthink/think-view/src'),
     'think\\captcha\\' => array($vendorDir . '/topthink/think-captcha/src'),
     'think\\app\\' => array($vendorDir . '/topthink/think-multi-app/src'),
-    'think\\' => array($vendorDir . '/topthink/framework/src/think', $vendorDir . '/topthink/think-cache/src', $vendorDir . '/topthink/think-container/src', $vendorDir . '/topthink/think-factory/src', $vendorDir . '/topthink/think-helper/src', $vendorDir . '/topthink/think-image/src', $vendorDir . '/topthink/think-log/src', $vendorDir . '/topthink/think-orm/src', $vendorDir . '/topthink/think-queue/src', $vendorDir . '/topthink/think-template/src'),
+    'think\\' => array($vendorDir . '/topthink/framework/src/think', $vendorDir . '/topthink/think-factory/src', $vendorDir . '/topthink/think-helper/src', $vendorDir . '/topthink/think-image/src', $vendorDir . '/topthink/think-orm/src', $vendorDir . '/topthink/think-queue/src', $vendorDir . '/topthink/think-template/src'),
     'dh2y\\qrcode\\' => array($vendorDir . '/dh2y/think-qrcode/src'),
     'crmeb\\' => array($baseDir . '/crmeb'),
     'app\\' => array($baseDir . '/app'),
@@ -37,6 +37,7 @@ return array(
     'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
     'League\\Flysystem\\Cached\\' => array($vendorDir . '/league/flysystem-cached-adapter/src'),
     'League\\Flysystem\\' => array($vendorDir . '/league/flysystem/src'),
+    'JiaLeo\\Payment\\' => array($vendorDir . '/jialeo/payment/src'),
     'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'),
     'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'),
     'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'),

+ 7 - 2
vendor/composer/autoload_real.php

@@ -13,19 +13,24 @@ class ComposerAutoloaderInitf16474ac994ccc25392f403933800b79
         }
     }
 
+    /**
+     * @return \Composer\Autoload\ClassLoader
+     */
     public static function getLoader()
     {
         if (null !== self::$loader) {
             return self::$loader;
         }
 
+        require __DIR__ . '/platform_check.php';
+
         spl_autoload_register(array('ComposerAutoloaderInitf16474ac994ccc25392f403933800b79', 'loadClassLoader'), true, true);
-        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
+        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
         spl_autoload_unregister(array('ComposerAutoloaderInitf16474ac994ccc25392f403933800b79', 'loadClassLoader'));
 
         $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
         if ($useStaticLoader) {
-            require_once __DIR__ . '/autoload_static.php';
+            require __DIR__ . '/autoload_static.php';
 
             call_user_func(\Composer\Autoload\ComposerStaticInitf16474ac994ccc25392f403933800b79::getInitializer($loader));
         } else {

+ 15 - 9
vendor/composer/autoload_static.php

@@ -88,6 +88,10 @@ class ComposerStaticInitf16474ac994ccc25392f403933800b79
             'League\\Flysystem\\Cached\\' => 24,
             'League\\Flysystem\\' => 17,
         ),
+        'J' => 
+        array (
+            'JiaLeo\\Payment\\' => 15,
+        ),
         'G' => 
         array (
             'GuzzleHttp\\Psr7\\' => 16,
@@ -126,15 +130,12 @@ class ComposerStaticInitf16474ac994ccc25392f403933800b79
         'think\\' => 
         array (
             0 => __DIR__ . '/..' . '/topthink/framework/src/think',
-            1 => __DIR__ . '/..' . '/topthink/think-cache/src',
-            2 => __DIR__ . '/..' . '/topthink/think-container/src',
-            3 => __DIR__ . '/..' . '/topthink/think-factory/src',
-            4 => __DIR__ . '/..' . '/topthink/think-helper/src',
-            5 => __DIR__ . '/..' . '/topthink/think-image/src',
-            6 => __DIR__ . '/..' . '/topthink/think-log/src',
-            7 => __DIR__ . '/..' . '/topthink/think-orm/src',
-            8 => __DIR__ . '/..' . '/topthink/think-queue/src',
-            9 => __DIR__ . '/..' . '/topthink/think-template/src',
+            1 => __DIR__ . '/..' . '/topthink/think-factory/src',
+            2 => __DIR__ . '/..' . '/topthink/think-helper/src',
+            3 => __DIR__ . '/..' . '/topthink/think-image/src',
+            4 => __DIR__ . '/..' . '/topthink/think-orm/src',
+            5 => __DIR__ . '/..' . '/topthink/think-queue/src',
+            6 => __DIR__ . '/..' . '/topthink/think-template/src',
         ),
         'dh2y\\qrcode\\' => 
         array (
@@ -244,6 +245,10 @@ class ComposerStaticInitf16474ac994ccc25392f403933800b79
         array (
             0 => __DIR__ . '/..' . '/league/flysystem/src',
         ),
+        'JiaLeo\\Payment\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/jialeo/payment/src',
+        ),
         'GuzzleHttp\\Psr7\\' => 
         array (
             0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src',
@@ -324,6 +329,7 @@ class ComposerStaticInitf16474ac994ccc25392f403933800b79
     public static $classMap = array (
         'ArithmeticError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php',
         'AssertionError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php',
+        'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
         'DivisionByZeroError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php',
         'Error' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/Error.php',
         'ParseError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/ParseError.php',

+ 3088 - 3126
vendor/composer/installed.json

@@ -1,3207 +1,3169 @@
-[
-    {
-        "name": "aliyuncs/oss-sdk-php",
-        "version": "v2.3.0",
-        "version_normalized": "2.3.0.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/aliyun/aliyun-oss-php-sdk.git",
-            "reference": "e69f57916678458642ac9d2fd341ae78a56996c8"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/aliyun/aliyun-oss-php-sdk/zipball/e69f57916678458642ac9d2fd341ae78a56996c8",
-            "reference": "e69f57916678458642ac9d2fd341ae78a56996c8",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+{
+    "packages": [
+        {
+            "name": "aliyuncs/oss-sdk-php",
+            "version": "v2.3.0",
+            "version_normalized": "2.3.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/aliyun/aliyun-oss-php-sdk.git",
+                "reference": "e69f57916678458642ac9d2fd341ae78a56996c8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/aliyun/aliyun-oss-php-sdk/zipball/e69f57916678458642ac9d2fd341ae78a56996c8",
+                "reference": "e69f57916678458642ac9d2fd341ae78a56996c8",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0",
+                "satooshi/php-coveralls": "~1.0"
+            },
+            "time": "2018-01-08T06:59:35+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "OSS\\": "src/OSS"
                 }
-            ]
-        },
-        "require": {
-            "php": ">=5.3"
-        },
-        "require-dev": {
-            "phpunit/phpunit": "~4.0",
-            "satooshi/php-coveralls": "~1.0"
-        },
-        "time": "2018-01-08T06:59:35+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "OSS\\": "src/OSS"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Aliyuncs",
-                "homepage": "http://www.aliyun.com"
-            }
-        ],
-        "description": "Aliyun OSS SDK for PHP",
-        "homepage": "http://www.aliyun.com/product/oss/"
-    },
-    {
-        "name": "dh2y/think-qrcode",
-        "version": "2.0",
-        "version_normalized": "2.0.0.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/cinaofdai/think-qrcode.git",
-            "reference": "977d032afa27b1852f5fc5441fad2497f6db7ff5"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/cinaofdai/think-qrcode/zipball/977d032afa27b1852f5fc5441fad2497f6db7ff5",
-            "reference": "977d032afa27b1852f5fc5441fad2497f6db7ff5",
-            "shasum": "",
-            "mirrors": [
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+                    "name": "Aliyuncs",
+                    "homepage": "http://www.aliyun.com"
                 }
-            ]
-        },
-        "require": {
-            "php": ">=5.4.0"
-        },
-        "time": "2019-07-10T02:57:29+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "dh2y\\qrcode\\": "src/"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "dh2y",
-                "email": "xiaodai54_long@163.com"
-            }
-        ],
-        "description": "qrcode for thinkphp5",
-        "homepage": "https://github.com/cinaofdai/think-qrcode"
-    },
-    {
-        "name": "doctrine/cache",
-        "version": "v1.4.4",
-        "version_normalized": "1.4.4.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/doctrine/cache.git",
-            "reference": "6433826dd02c9e5be8a127320dc13e7e6625d020"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/doctrine/cache/zipball/6433826dd02c9e5be8a127320dc13e7e6625d020",
-            "reference": "6433826dd02c9e5be8a127320dc13e7e6625d020",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+            ],
+            "description": "Aliyun OSS SDK for PHP",
+            "homepage": "http://www.aliyun.com/product/oss/",
+            "install-path": "../aliyuncs/oss-sdk-php"
+        },
+        {
+            "name": "dh2y/think-qrcode",
+            "version": "2.0",
+            "version_normalized": "2.0.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/cinaofdai/think-qrcode.git",
+                "reference": "977d032afa27b1852f5fc5441fad2497f6db7ff5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/cinaofdai/think-qrcode/zipball/977d032afa27b1852f5fc5441fad2497f6db7ff5",
+                "reference": "977d032afa27b1852f5fc5441fad2497f6db7ff5",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.4.0"
+            },
+            "time": "2019-07-10T02:57:29+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "dh2y\\qrcode\\": "src/"
                 }
-            ]
-        },
-        "require": {
-            "php": ">=5.3.2"
-        },
-        "conflict": {
-            "doctrine/common": ">2.2,<2.4"
-        },
-        "require-dev": {
-            "phpunit/phpunit": ">=3.7",
-            "predis/predis": "~1.0",
-            "satooshi/php-coveralls": "~0.6"
-        },
-        "time": "2015-11-02T18:33:51+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.5.x-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-0": {
-                "Doctrine\\Common\\Cache\\": "lib/"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Roman Borschel",
-                "email": "roman@code-factory.org"
-            },
-            {
-                "name": "Benjamin Eberlei",
-                "email": "kontakt@beberlei.de"
-            },
-            {
-                "name": "Guilherme Blanco",
-                "email": "guilhermeblanco@gmail.com"
-            },
-            {
-                "name": "Jonathan Wage",
-                "email": "jonwage@gmail.com"
-            },
-            {
-                "name": "Johannes Schmitt",
-                "email": "schmittjoh@gmail.com"
-            }
-        ],
-        "description": "Caching library offering an object-oriented API for many cache backends",
-        "homepage": "http://www.doctrine-project.org",
-        "keywords": [
-            "cache",
-            "caching"
-        ]
-    },
-    {
-        "name": "firebase/php-jwt",
-        "version": "v5.0.0",
-        "version_normalized": "5.0.0.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/firebase/php-jwt.git",
-            "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/firebase/php-jwt/zipball/9984a4d3a32ae7673d6971ea00bae9d0a1abba0e",
-            "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e",
-            "shasum": "",
-            "mirrors": [
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+                    "name": "dh2y",
+                    "email": "xiaodai54_long@163.com"
                 }
-            ]
-        },
-        "require": {
-            "php": ">=5.3.0"
-        },
-        "require-dev": {
-            "phpunit/phpunit": " 4.8.35"
-        },
-        "time": "2017-06-27T22:17:23+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Firebase\\JWT\\": "src"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "BSD-3-Clause"
-        ],
-        "authors": [
-            {
-                "name": "Neuman Vong",
-                "email": "neuman+pear@twilio.com",
-                "role": "Developer"
-            },
-            {
-                "name": "Anant Narayanan",
-                "email": "anant@php.net",
-                "role": "Developer"
-            }
-        ],
-        "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
-        "homepage": "https://github.com/firebase/php-jwt"
-    },
-    {
-        "name": "guzzle/guzzle",
-        "version": "v3.9.3",
-        "version_normalized": "3.9.3.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/guzzle/guzzle3.git",
-            "reference": "0645b70d953bc1c067bbc8d5bc53194706b628d9"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/guzzle/guzzle3/zipball/0645b70d953bc1c067bbc8d5bc53194706b628d9",
-            "reference": "0645b70d953bc1c067bbc8d5bc53194706b628d9",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+            ],
+            "description": "qrcode for thinkphp5",
+            "homepage": "https://github.com/cinaofdai/think-qrcode",
+            "install-path": "../dh2y/think-qrcode"
+        },
+        {
+            "name": "doctrine/cache",
+            "version": "v1.4.4",
+            "version_normalized": "1.4.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/cache.git",
+                "reference": "6433826dd02c9e5be8a127320dc13e7e6625d020"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/cache/zipball/6433826dd02c9e5be8a127320dc13e7e6625d020",
+                "reference": "6433826dd02c9e5be8a127320dc13e7e6625d020",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3.2"
+            },
+            "conflict": {
+                "doctrine/common": ">2.2,<2.4"
+            },
+            "require-dev": {
+                "phpunit/phpunit": ">=3.7",
+                "predis/predis": "~1.0",
+                "satooshi/php-coveralls": "~0.6"
+            },
+            "time": "2015-11-02T18:33:51+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.5.x-dev"
                 }
-            ]
-        },
-        "require": {
-            "ext-curl": "*",
-            "php": ">=5.3.3",
-            "symfony/event-dispatcher": "~2.1"
-        },
-        "replace": {
-            "guzzle/batch": "self.version",
-            "guzzle/cache": "self.version",
-            "guzzle/common": "self.version",
-            "guzzle/http": "self.version",
-            "guzzle/inflection": "self.version",
-            "guzzle/iterator": "self.version",
-            "guzzle/log": "self.version",
-            "guzzle/parser": "self.version",
-            "guzzle/plugin": "self.version",
-            "guzzle/plugin-async": "self.version",
-            "guzzle/plugin-backoff": "self.version",
-            "guzzle/plugin-cache": "self.version",
-            "guzzle/plugin-cookie": "self.version",
-            "guzzle/plugin-curlauth": "self.version",
-            "guzzle/plugin-error-response": "self.version",
-            "guzzle/plugin-history": "self.version",
-            "guzzle/plugin-log": "self.version",
-            "guzzle/plugin-md5": "self.version",
-            "guzzle/plugin-mock": "self.version",
-            "guzzle/plugin-oauth": "self.version",
-            "guzzle/service": "self.version",
-            "guzzle/stream": "self.version"
-        },
-        "require-dev": {
-            "doctrine/cache": "~1.3",
-            "monolog/monolog": "~1.0",
-            "phpunit/phpunit": "3.7.*",
-            "psr/log": "~1.0",
-            "symfony/class-loader": "~2.1",
-            "zendframework/zend-cache": "2.*,<2.3",
-            "zendframework/zend-log": "2.*,<2.3"
-        },
-        "suggest": {
-            "guzzlehttp/guzzle": "Guzzle 5 has moved to a new package name. The package you have installed, Guzzle 3, is deprecated."
-        },
-        "time": "2015-03-18T18:23:50+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "3.9-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-0": {
-                "Guzzle": "src/",
-                "Guzzle\\Tests": "tests/"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Michael Dowling",
-                "email": "mtdowling@gmail.com",
-                "homepage": "https://github.com/mtdowling"
-            },
-            {
-                "name": "Guzzle Community",
-                "homepage": "https://github.com/guzzle/guzzle/contributors"
-            }
-        ],
-        "description": "PHP HTTP client. This library is deprecated in favor of https://packagist.org/packages/guzzlehttp/guzzle",
-        "homepage": "http://guzzlephp.org/",
-        "keywords": [
-            "client",
-            "curl",
-            "framework",
-            "http",
-            "http client",
-            "rest",
-            "web service"
-        ],
-        "abandoned": "guzzlehttp/guzzle"
-    },
-    {
-        "name": "guzzlehttp/guzzle",
-        "version": "6.3.3",
-        "version_normalized": "6.3.3.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/guzzle/guzzle.git",
-            "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba",
-            "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-0": {
+                    "Doctrine\\Common\\Cache\\": "lib/"
                 }
-            ]
-        },
-        "require": {
-            "guzzlehttp/promises": "^1.0",
-            "guzzlehttp/psr7": "^1.4",
-            "php": ">=5.5"
-        },
-        "require-dev": {
-            "ext-curl": "*",
-            "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
-            "psr/log": "^1.0"
-        },
-        "suggest": {
-            "psr/log": "Required for using the Log middleware"
-        },
-        "time": "2018-04-22T15:46:56+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "6.3-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "files": [
-                "src/functions_include.php"
-            ],
-            "psr-4": {
-                "GuzzleHttp\\": "src/"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Michael Dowling",
-                "email": "mtdowling@gmail.com",
-                "homepage": "https://github.com/mtdowling"
-            }
-        ],
-        "description": "Guzzle is a PHP HTTP client library",
-        "homepage": "http://guzzlephp.org/",
-        "keywords": [
-            "client",
-            "curl",
-            "framework",
-            "http",
-            "http client",
-            "rest",
-            "web service"
-        ]
-    },
-    {
-        "name": "guzzlehttp/promises",
-        "version": "v1.3.1",
-        "version_normalized": "1.3.1.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/guzzle/promises.git",
-            "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
-            "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
-            "shasum": "",
-            "mirrors": [
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
-        },
-        "require": {
-            "php": ">=5.5.0"
-        },
-        "require-dev": {
-            "phpunit/phpunit": "^4.0"
-        },
-        "time": "2016-12-20T10:07:11+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.4-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "GuzzleHttp\\Promise\\": "src/"
-            },
-            "files": [
-                "src/functions_include.php"
-            ]
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Michael Dowling",
-                "email": "mtdowling@gmail.com",
-                "homepage": "https://github.com/mtdowling"
-            }
-        ],
-        "description": "Guzzle promises library",
-        "keywords": [
-            "promise"
-        ]
-    },
-    {
-        "name": "guzzlehttp/psr7",
-        "version": "1.5.2",
-        "version_normalized": "1.5.2.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/guzzle/psr7.git",
-            "reference": "9f83dded91781a01c63574e387eaa769be769115"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/guzzle/psr7/zipball/9f83dded91781a01c63574e387eaa769be769115",
-            "reference": "9f83dded91781a01c63574e387eaa769be769115",
-            "shasum": "",
-            "mirrors": [
+                    "name": "Roman Borschel",
+                    "email": "roman@code-factory.org"
+                },
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
-        },
-        "require": {
-            "php": ">=5.4.0",
-            "psr/http-message": "~1.0",
-            "ralouphie/getallheaders": "^2.0.5"
-        },
-        "provide": {
-            "psr/http-message-implementation": "1.0"
-        },
-        "require-dev": {
-            "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8"
-        },
-        "time": "2018-12-04T20:46:45+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.5-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "GuzzleHttp\\Psr7\\": "src/"
-            },
-            "files": [
-                "src/functions_include.php"
-            ]
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Michael Dowling",
-                "email": "mtdowling@gmail.com",
-                "homepage": "https://github.com/mtdowling"
-            },
-            {
-                "name": "Tobias Schultze",
-                "homepage": "https://github.com/Tobion"
-            }
-        ],
-        "description": "PSR-7 message implementation that also provides common utility methods",
-        "keywords": [
-            "http",
-            "message",
-            "psr-7",
-            "request",
-            "response",
-            "stream",
-            "uri",
-            "url"
-        ]
-    },
-    {
-        "name": "league/flysystem",
-        "version": "1.0.57",
-        "version_normalized": "1.0.57.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/thephpleague/flysystem.git",
-            "reference": "0e9db7f0b96b9f12dcf6f65bc34b72b1a30ea55a"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/0e9db7f0b96b9f12dcf6f65bc34b72b1a30ea55a",
-            "reference": "0e9db7f0b96b9f12dcf6f65bc34b72b1a30ea55a",
-            "shasum": "",
-            "mirrors": [
+                    "name": "Benjamin Eberlei",
+                    "email": "kontakt@beberlei.de"
+                },
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
-        },
-        "require": {
-            "ext-fileinfo": "*",
-            "php": ">=5.5.9"
-        },
-        "conflict": {
-            "league/flysystem-sftp": "<1.0.6"
-        },
-        "require-dev": {
-            "phpspec/phpspec": "^3.4",
-            "phpunit/phpunit": "^5.7.10"
-        },
-        "suggest": {
-            "ext-fileinfo": "Required for MimeType",
-            "ext-ftp": "Allows you to use FTP server storage",
-            "ext-openssl": "Allows you to use FTPS server storage",
-            "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2",
-            "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3",
-            "league/flysystem-azure": "Allows you to use Windows Azure Blob storage",
-            "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching",
-            "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem",
-            "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files",
-            "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib",
-            "league/flysystem-webdav": "Allows you to use WebDAV storage",
-            "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter",
-            "spatie/flysystem-dropbox": "Allows you to use Dropbox storage",
-            "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications"
-        },
-        "time": "2019-10-16T21:01:05+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.1-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "League\\Flysystem\\": "src/"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Frank de Jonge",
-                "email": "info@frenky.net"
-            }
-        ],
-        "description": "Filesystem abstraction: Many filesystems, one API.",
-        "keywords": [
-            "Cloud Files",
-            "WebDAV",
-            "abstraction",
-            "aws",
-            "cloud",
-            "copy.com",
-            "dropbox",
-            "file systems",
-            "files",
-            "filesystem",
-            "filesystems",
-            "ftp",
-            "rackspace",
-            "remote",
-            "s3",
-            "sftp",
-            "storage"
-        ]
-    },
-    {
-        "name": "league/flysystem-cached-adapter",
-        "version": "1.0.9",
-        "version_normalized": "1.0.9.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/thephpleague/flysystem-cached-adapter.git",
-            "reference": "08ef74e9be88100807a3b92cc9048a312bf01d6f"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/thephpleague/flysystem-cached-adapter/zipball/08ef74e9be88100807a3b92cc9048a312bf01d6f",
-            "reference": "08ef74e9be88100807a3b92cc9048a312bf01d6f",
-            "shasum": "",
-            "mirrors": [
+                    "name": "Guilherme Blanco",
+                    "email": "guilhermeblanco@gmail.com"
+                },
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
-        },
-        "require": {
-            "league/flysystem": "~1.0",
-            "psr/cache": "^1.0.0"
-        },
-        "require-dev": {
-            "mockery/mockery": "~0.9",
-            "phpspec/phpspec": "^3.4",
-            "phpunit/phpunit": "^5.7",
-            "predis/predis": "~1.0",
-            "tedivm/stash": "~0.12"
-        },
-        "suggest": {
-            "ext-phpredis": "Pure C implemented extension for PHP"
-        },
-        "time": "2018-07-09T20:51:04+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "League\\Flysystem\\Cached\\": "src/"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "frankdejonge",
-                "email": "info@frenky.net"
-            }
-        ],
-        "description": "An adapter decorator to enable meta-data caching."
-    },
-    {
-        "name": "monolog/monolog",
-        "version": "1.24.0",
-        "version_normalized": "1.24.0.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/Seldaek/monolog.git",
-            "reference": "bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/Seldaek/monolog/zipball/bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266",
-            "reference": "bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266",
-            "shasum": "",
-            "mirrors": [
+                    "name": "Jonathan Wage",
+                    "email": "jonwage@gmail.com"
+                },
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+                    "name": "Johannes Schmitt",
+                    "email": "schmittjoh@gmail.com"
                 }
-            ]
-        },
-        "require": {
-            "php": ">=5.3.0",
-            "psr/log": "~1.0"
-        },
-        "provide": {
-            "psr/log-implementation": "1.0.0"
-        },
-        "require-dev": {
-            "aws/aws-sdk-php": "^2.4.9 || ^3.0",
-            "doctrine/couchdb": "~1.0@dev",
-            "graylog2/gelf-php": "~1.0",
-            "jakub-onderka/php-parallel-lint": "0.9",
-            "php-amqplib/php-amqplib": "~2.4",
-            "php-console/php-console": "^3.1.3",
-            "phpunit/phpunit": "~4.5",
-            "phpunit/phpunit-mock-objects": "2.3.0",
-            "ruflin/elastica": ">=0.90 <3.0",
-            "sentry/sentry": "^0.13",
-            "swiftmailer/swiftmailer": "^5.3|^6.0"
-        },
-        "suggest": {
-            "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
-            "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
-            "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
-            "ext-mongo": "Allow sending log messages to a MongoDB server",
-            "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
-            "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver",
-            "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
-            "php-console/php-console": "Allow sending log messages to Google Chrome",
-            "rollbar/rollbar": "Allow sending log messages to Rollbar",
-            "ruflin/elastica": "Allow sending log messages to an Elastic Search server",
-            "sentry/sentry": "Allow sending log messages to a Sentry server"
-        },
-        "time": "2018-11-05T09:00:11+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "2.0.x-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Monolog\\": "src/Monolog"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Jordi Boggiano",
-                "email": "j.boggiano@seld.be",
-                "homepage": "http://seld.be"
-            }
-        ],
-        "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
-        "homepage": "http://github.com/Seldaek/monolog",
-        "keywords": [
-            "log",
-            "logging",
-            "psr-3"
-        ]
-    },
-    {
-        "name": "nesbot/carbon",
-        "version": "2.20.0",
-        "version_normalized": "2.20.0.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/briannesbitt/Carbon.git",
-            "reference": "bc671b896c276795fad8426b0aa24e8ade0f2498"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/bc671b896c276795fad8426b0aa24e8ade0f2498",
-            "reference": "bc671b896c276795fad8426b0aa24e8ade0f2498",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+            ],
+            "description": "Caching library offering an object-oriented API for many cache backends",
+            "homepage": "http://www.doctrine-project.org",
+            "keywords": [
+                "cache",
+                "caching"
+            ],
+            "install-path": "../doctrine/cache"
+        },
+        {
+            "name": "firebase/php-jwt",
+            "version": "v5.0.0",
+            "version_normalized": "5.0.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/firebase/php-jwt.git",
+                "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/firebase/php-jwt/zipball/9984a4d3a32ae7673d6971ea00bae9d0a1abba0e",
+                "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": " 4.8.35"
+            },
+            "time": "2017-06-27T22:17:23+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Firebase\\JWT\\": "src"
                 }
-            ]
-        },
-        "require": {
-            "ext-json": "*",
-            "php": "^7.1.8 || ^8.0",
-            "symfony/translation": "^3.4 || ^4.0"
-        },
-        "require-dev": {
-            "friendsofphp/php-cs-fixer": "^2.14 || ^3.0",
-            "kylekatarnls/multi-tester": "^1.1",
-            "phpmd/phpmd": "^2.6",
-            "phpstan/phpstan": "^0.11",
-            "phpunit/phpunit": "^7.5 || ^8.0",
-            "squizlabs/php_codesniffer": "^3.4"
-        },
-        "time": "2019-06-25T10:00:57+00:00",
-        "type": "library",
-        "extra": {
-            "laravel": {
-                "providers": [
-                    "Carbon\\Laravel\\ServiceProvider"
-                ]
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Carbon\\": "src/Carbon/"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Brian Nesbitt",
-                "email": "brian@nesbot.com",
-                "homepage": "http://nesbot.com"
-            }
-        ],
-        "description": "A simple API extension for DateTime.",
-        "homepage": "http://carbon.nesbot.com",
-        "keywords": [
-            "date",
-            "datetime",
-            "time"
-        ]
-    },
-    {
-        "name": "opis/closure",
-        "version": "3.4.1",
-        "version_normalized": "3.4.1.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/opis/closure.git",
-            "reference": "e79f851749c3caa836d7ccc01ede5828feb762c7"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/opis/closure/zipball/e79f851749c3caa836d7ccc01ede5828feb762c7",
-            "reference": "e79f851749c3caa836d7ccc01ede5828feb762c7",
-            "shasum": "",
-            "mirrors": [
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
-        },
-        "require": {
-            "php": "^5.4 || ^7.0"
-        },
-        "require-dev": {
-            "jeremeamia/superclosure": "^2.0",
-            "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
-        },
-        "time": "2019-10-19T18:38:51+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "3.3.x-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Opis\\Closure\\": "src/"
-            },
-            "files": [
-                "functions.php"
-            ]
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Marius Sarca",
-                "email": "marius.sarca@gmail.com"
-            },
-            {
-                "name": "Sorin Sarca",
-                "email": "sarca_sorin@hotmail.com"
-            }
-        ],
-        "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.",
-        "homepage": "https://opis.io/closure",
-        "keywords": [
-            "anonymous functions",
-            "closure",
-            "function",
-            "serializable",
-            "serialization",
-            "serialize"
-        ]
-    },
-    {
-        "name": "overtrue/socialite",
-        "version": "1.3.0",
-        "version_normalized": "1.3.0.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/overtrue/socialite.git",
-            "reference": "fda55f0acef43a144799b1957a8f93d9f5deffce"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/overtrue/socialite/zipball/fda55f0acef43a144799b1957a8f93d9f5deffce",
-            "reference": "fda55f0acef43a144799b1957a8f93d9f5deffce",
-            "shasum": "",
-            "mirrors": [
+                    "name": "Neuman Vong",
+                    "email": "neuman+pear@twilio.com",
+                    "role": "Developer"
+                },
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+                    "name": "Anant Narayanan",
+                    "email": "anant@php.net",
+                    "role": "Developer"
                 }
-            ]
-        },
-        "require": {
-            "guzzlehttp/guzzle": "~5.0|~6.0",
-            "php": ">=5.4.0",
-            "symfony/http-foundation": "~2.6|~2.7|~2.8|~3.0"
-        },
-        "require-dev": {
-            "mockery/mockery": "~0.9",
-            "phpunit/phpunit": "~4.0"
-        },
-        "time": "2017-08-04T06:28:22+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Overtrue\\Socialite\\": "src/"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "overtrue",
-                "email": "anzhengchao@gmail.com"
-            }
-        ],
-        "description": "A collection of OAuth 2 packages that extracts from laravel/socialite.",
-        "keywords": [
-            "login",
-            "oauth",
-            "qq",
-            "social",
-            "wechat",
-            "weibo"
-        ]
-    },
-    {
-        "name": "overtrue/wechat",
-        "version": "3.3.33",
-        "version_normalized": "3.3.33.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/overtrue/wechat.git",
-            "reference": "78e5476df330754040d1c400d0bca640d5b77cb7"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/overtrue/wechat/zipball/78e5476df330754040d1c400d0bca640d5b77cb7",
-            "reference": "78e5476df330754040d1c400d0bca640d5b77cb7",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+            ],
+            "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
+            "homepage": "https://github.com/firebase/php-jwt",
+            "install-path": "../firebase/php-jwt"
+        },
+        {
+            "name": "guzzle/guzzle",
+            "version": "v3.9.3",
+            "version_normalized": "3.9.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/guzzle3.git",
+                "reference": "0645b70d953bc1c067bbc8d5bc53194706b628d9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/guzzle3/zipball/0645b70d953bc1c067bbc8d5bc53194706b628d9",
+                "reference": "0645b70d953bc1c067bbc8d5bc53194706b628d9",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-curl": "*",
+                "php": ">=5.3.3",
+                "symfony/event-dispatcher": "~2.1"
+            },
+            "replace": {
+                "guzzle/batch": "self.version",
+                "guzzle/cache": "self.version",
+                "guzzle/common": "self.version",
+                "guzzle/http": "self.version",
+                "guzzle/inflection": "self.version",
+                "guzzle/iterator": "self.version",
+                "guzzle/log": "self.version",
+                "guzzle/parser": "self.version",
+                "guzzle/plugin": "self.version",
+                "guzzle/plugin-async": "self.version",
+                "guzzle/plugin-backoff": "self.version",
+                "guzzle/plugin-cache": "self.version",
+                "guzzle/plugin-cookie": "self.version",
+                "guzzle/plugin-curlauth": "self.version",
+                "guzzle/plugin-error-response": "self.version",
+                "guzzle/plugin-history": "self.version",
+                "guzzle/plugin-log": "self.version",
+                "guzzle/plugin-md5": "self.version",
+                "guzzle/plugin-mock": "self.version",
+                "guzzle/plugin-oauth": "self.version",
+                "guzzle/service": "self.version",
+                "guzzle/stream": "self.version"
+            },
+            "require-dev": {
+                "doctrine/cache": "~1.3",
+                "monolog/monolog": "~1.0",
+                "phpunit/phpunit": "3.7.*",
+                "psr/log": "~1.0",
+                "symfony/class-loader": "~2.1",
+                "zendframework/zend-cache": "2.*,<2.3",
+                "zendframework/zend-log": "2.*,<2.3"
+            },
+            "suggest": {
+                "guzzlehttp/guzzle": "Guzzle 5 has moved to a new package name. The package you have installed, Guzzle 3, is deprecated."
+            },
+            "time": "2015-03-18T18:23:50+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.9-dev"
                 }
-            ]
-        },
-        "require": {
-            "doctrine/cache": "1.4.*",
-            "ext-openssl": "*",
-            "guzzlehttp/guzzle": "~6.2",
-            "monolog/monolog": "^1.17",
-            "overtrue/socialite": "^1.0.25",
-            "php": ">=5.5.0",
-            "pimple/pimple": "~3.0",
-            "symfony/http-foundation": "~2.6|~2.7|~2.8|~3.0",
-            "symfony/psr-http-message-bridge": "~0.3|^1.0"
-        },
-        "require-dev": {
-            "mockery/mockery": "^0.9.9",
-            "overtrue/phplint": "dev-master",
-            "phpunit/phpunit": "~4.0"
-        },
-        "time": "2018-10-17T12:27:27+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "EasyWeChat\\": "src/"
-            },
-            "files": [
-                "src/Payment/helpers.php"
-            ]
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "overtrue",
-                "email": "anzhengchao@gmail.com"
-            }
-        ],
-        "description": "微信SDK",
-        "keywords": [
-            "sdk",
-            "wechat",
-            "weixin",
-            "weixin-sdk"
-        ]
-    },
-    {
-        "name": "paragonie/random_compat",
-        "version": "v9.99.99",
-        "version_normalized": "9.99.99.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/paragonie/random_compat.git",
-            "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95",
-            "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-0": {
+                    "Guzzle": "src/",
+                    "Guzzle\\Tests": "tests/"
                 }
-            ]
-        },
-        "require": {
-            "php": "^7"
-        },
-        "require-dev": {
-            "phpunit/phpunit": "4.*|5.*",
-            "vimeo/psalm": "^1"
-        },
-        "suggest": {
-            "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
-        },
-        "time": "2018-07-02T15:55:56+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Paragon Initiative Enterprises",
-                "email": "security@paragonie.com",
-                "homepage": "https://paragonie.com"
-            }
-        ],
-        "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
-        "keywords": [
-            "csprng",
-            "polyfill",
-            "pseudorandom",
-            "random"
-        ]
-    },
-    {
-        "name": "phpoffice/phpexcel",
-        "version": "1.8.2",
-        "version_normalized": "1.8.2.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/PHPOffice/PHPExcel.git",
-            "reference": "1441011fb7ecdd8cc689878f54f8b58a6805f870"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/PHPOffice/PHPExcel/zipball/1441011fb7ecdd8cc689878f54f8b58a6805f870",
-            "reference": "1441011fb7ecdd8cc689878f54f8b58a6805f870",
-            "shasum": "",
-            "mirrors": [
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
-        },
-        "require": {
-            "ext-mbstring": "*",
-            "ext-xml": "*",
-            "ext-xmlwriter": "*",
-            "php": "^5.2|^7.0"
-        },
-        "require-dev": {
-            "squizlabs/php_codesniffer": "2.*"
-        },
-        "time": "2018-11-22T23:07:24+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-0": {
-                "PHPExcel": "Classes/"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "LGPL-2.1"
-        ],
-        "authors": [
-            {
-                "name": "Maarten Balliauw",
-                "homepage": "http://blog.maartenballiauw.be"
-            },
-            {
-                "name": "Erik Tilt"
-            },
-            {
-                "name": "Franck Lefevre",
-                "homepage": "http://rootslabs.net"
-            },
-            {
-                "name": "Mark Baker",
-                "homepage": "http://markbakeruk.net"
-            }
-        ],
-        "description": "PHPExcel - OpenXML - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine",
-        "homepage": "https://github.com/PHPOffice/PHPExcel",
-        "keywords": [
-            "OpenXML",
-            "excel",
-            "php",
-            "spreadsheet",
-            "xls",
-            "xlsx"
-        ],
-        "abandoned": "phpoffice/phpspreadsheet"
-    },
-    {
-        "name": "pimple/pimple",
-        "version": "v3.2.3",
-        "version_normalized": "3.2.3.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/silexphp/Pimple.git",
-            "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/silexphp/Pimple/zipball/9e403941ef9d65d20cba7d54e29fe906db42cf32",
-            "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32",
-            "shasum": "",
-            "mirrors": [
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+                    "name": "Guzzle Community",
+                    "homepage": "https://github.com/guzzle/guzzle/contributors"
                 }
-            ]
-        },
-        "require": {
-            "php": ">=5.3.0",
-            "psr/container": "^1.0"
-        },
-        "require-dev": {
-            "symfony/phpunit-bridge": "^3.2"
-        },
-        "time": "2018-01-21T07:42:36+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "3.2.x-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-0": {
-                "Pimple": "src/"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Fabien Potencier",
-                "email": "fabien@symfony.com"
-            }
-        ],
-        "description": "Pimple, a simple Dependency Injection Container",
-        "homepage": "http://pimple.sensiolabs.org",
-        "keywords": [
-            "container",
-            "dependency injection"
-        ]
-    },
-    {
-        "name": "psr/cache",
-        "version": "1.0.1",
-        "version_normalized": "1.0.1.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/php-fig/cache.git",
-            "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
-            "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+            ],
+            "description": "PHP HTTP client. This library is deprecated in favor of https://packagist.org/packages/guzzlehttp/guzzle",
+            "homepage": "http://guzzlephp.org/",
+            "keywords": [
+                "client",
+                "curl",
+                "framework",
+                "http",
+                "http client",
+                "rest",
+                "web service"
+            ],
+            "abandoned": "guzzlehttp/guzzle",
+            "install-path": "../guzzle/guzzle"
+        },
+        {
+            "name": "guzzlehttp/guzzle",
+            "version": "6.3.3",
+            "version_normalized": "6.3.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/guzzle.git",
+                "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba",
+                "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "guzzlehttp/promises": "^1.0",
+                "guzzlehttp/psr7": "^1.4",
+                "php": ">=5.5"
+            },
+            "require-dev": {
+                "ext-curl": "*",
+                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
+                "psr/log": "^1.0"
+            },
+            "suggest": {
+                "psr/log": "Required for using the Log middleware"
+            },
+            "time": "2018-04-22T15:46:56+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "6.3-dev"
                 }
-            ]
-        },
-        "require": {
-            "php": ">=5.3.0"
-        },
-        "time": "2016-08-06T20:24:11+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.0.x-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Psr\\Cache\\": "src/"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "PHP-FIG",
-                "homepage": "http://www.php-fig.org/"
-            }
-        ],
-        "description": "Common interface for caching libraries",
-        "keywords": [
-            "cache",
-            "psr",
-            "psr-6"
-        ]
-    },
-    {
-        "name": "psr/container",
-        "version": "1.0.0",
-        "version_normalized": "1.0.0.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/php-fig/container.git",
-            "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
-            "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "files": [
+                    "src/functions_include.php"
+                ],
+                "psr-4": {
+                    "GuzzleHttp\\": "src/"
                 }
-            ]
-        },
-        "require": {
-            "php": ">=5.3.0"
-        },
-        "time": "2017-02-14T16:28:37+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.0.x-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Psr\\Container\\": "src/"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "PHP-FIG",
-                "homepage": "http://www.php-fig.org/"
-            }
-        ],
-        "description": "Common Container Interface (PHP FIG PSR-11)",
-        "homepage": "https://github.com/php-fig/container",
-        "keywords": [
-            "PSR-11",
-            "container",
-            "container-interface",
-            "container-interop",
-            "psr"
-        ]
-    },
-    {
-        "name": "psr/http-message",
-        "version": "1.0.1",
-        "version_normalized": "1.0.1.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/php-fig/http-message.git",
-            "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
-            "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
-            "shasum": "",
-            "mirrors": [
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
                 }
-            ]
-        },
-        "require": {
-            "php": ">=5.3.0"
-        },
-        "time": "2016-08-06T14:39:51+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.0.x-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Psr\\Http\\Message\\": "src/"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "PHP-FIG",
-                "homepage": "http://www.php-fig.org/"
-            }
-        ],
-        "description": "Common interface for HTTP messages",
-        "homepage": "https://github.com/php-fig/http-message",
-        "keywords": [
-            "http",
-            "http-message",
-            "psr",
-            "psr-7",
-            "request",
-            "response"
-        ]
-    },
-    {
-        "name": "psr/log",
-        "version": "1.1.2",
-        "version_normalized": "1.1.2.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/php-fig/log.git",
-            "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801",
-            "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+            ],
+            "description": "Guzzle is a PHP HTTP client library",
+            "homepage": "http://guzzlephp.org/",
+            "keywords": [
+                "client",
+                "curl",
+                "framework",
+                "http",
+                "http client",
+                "rest",
+                "web service"
+            ],
+            "install-path": "../guzzlehttp/guzzle"
+        },
+        {
+            "name": "guzzlehttp/promises",
+            "version": "v1.3.1",
+            "version_normalized": "1.3.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/promises.git",
+                "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
+                "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.5.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.0"
+            },
+            "time": "2016-12-20T10:07:11+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4-dev"
                 }
-            ]
-        },
-        "require": {
-            "php": ">=5.3.0"
-        },
-        "time": "2019-11-01T11:05:21+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.1.x-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Psr\\Log\\": "Psr/Log/"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "PHP-FIG",
-                "homepage": "http://www.php-fig.org/"
-            }
-        ],
-        "description": "Common interface for logging libraries",
-        "homepage": "https://github.com/php-fig/log",
-        "keywords": [
-            "log",
-            "psr",
-            "psr-3"
-        ]
-    },
-    {
-        "name": "psr/simple-cache",
-        "version": "1.0.1",
-        "version_normalized": "1.0.1.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/php-fig/simple-cache.git",
-            "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
-            "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
-            "shasum": "",
-            "mirrors": [
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Promise\\": "src/"
+                },
+                "files": [
+                    "src/functions_include.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
                 }
-            ]
-        },
-        "require": {
-            "php": ">=5.3.0"
-        },
-        "time": "2017-10-23T01:57:42+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.0.x-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Psr\\SimpleCache\\": "src/"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "PHP-FIG",
-                "homepage": "http://www.php-fig.org/"
-            }
-        ],
-        "description": "Common interfaces for simple caching",
-        "keywords": [
-            "cache",
-            "caching",
-            "psr",
-            "psr-16",
-            "simple-cache"
-        ]
-    },
-    {
-        "name": "qcloud/cos-sdk-v5",
-        "version": "v1.3.3",
-        "version_normalized": "1.3.3.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/tencentyun/cos-php-sdk-v5.git",
-            "reference": "cd1b9cefa04521eaf125a82eb53552d9a87aae4d"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/tencentyun/cos-php-sdk-v5/zipball/cd1b9cefa04521eaf125a82eb53552d9a87aae4d",
-            "reference": "cd1b9cefa04521eaf125a82eb53552d9a87aae4d",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+            ],
+            "description": "Guzzle promises library",
+            "keywords": [
+                "promise"
+            ],
+            "install-path": "../guzzlehttp/promises"
+        },
+        {
+            "name": "guzzlehttp/psr7",
+            "version": "1.5.2",
+            "version_normalized": "1.5.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/psr7.git",
+                "reference": "9f83dded91781a01c63574e387eaa769be769115"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/psr7/zipball/9f83dded91781a01c63574e387eaa769be769115",
+                "reference": "9f83dded91781a01c63574e387eaa769be769115",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.4.0",
+                "psr/http-message": "~1.0",
+                "ralouphie/getallheaders": "^2.0.5"
+            },
+            "provide": {
+                "psr/http-message-implementation": "1.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8"
+            },
+            "time": "2018-12-04T20:46:45+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.5-dev"
                 }
-            ]
-        },
-        "require": {
-            "guzzle/guzzle": "~3.7",
-            "php": ">=5.3.0"
-        },
-        "time": "2019-08-07T10:15:47+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-0": {
-                "Qcloud\\Cos\\": "src/"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "yaozongyou",
-                "email": "yaozongyou@vip.qq.com"
-            },
-            {
-                "name": "lewzylu",
-                "email": "327874225@qq.com"
-            }
-        ],
-        "description": "PHP SDK for QCloud COS",
-        "keywords": [
-            "cos",
-            "php",
-            "qcloud"
-        ]
-    },
-    {
-        "name": "qiniu/php-sdk",
-        "version": "v7.2.9",
-        "version_normalized": "7.2.9.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/qiniu/php-sdk.git",
-            "reference": "afe7d8715d8a688b1d8d8cdf031240d2363dad90"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/qiniu/php-sdk/zipball/afe7d8715d8a688b1d8d8cdf031240d2363dad90",
-            "reference": "afe7d8715d8a688b1d8d8cdf031240d2363dad90",
-            "shasum": "",
-            "mirrors": [
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Psr7\\": "src/"
+                },
+                "files": [
+                    "src/functions_include.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
-        },
-        "require": {
-            "php": ">=5.3.3"
-        },
-        "require-dev": {
-            "phpunit/phpunit": "~4.0",
-            "squizlabs/php_codesniffer": "~2.3"
-        },
-        "time": "2019-07-09T07:55:07+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Qiniu\\": "src/Qiniu"
-            },
-            "files": [
-                "src/Qiniu/functions.php"
-            ]
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Qiniu",
-                "email": "sdk@qiniu.com",
-                "homepage": "http://www.qiniu.com"
-            }
-        ],
-        "description": "Qiniu Resource (Cloud) Storage SDK for PHP",
-        "homepage": "http://developer.qiniu.com/",
-        "keywords": [
-            "cloud",
-            "qiniu",
-            "sdk",
-            "storage"
-        ]
-    },
-    {
-        "name": "ralouphie/getallheaders",
-        "version": "2.0.5",
-        "version_normalized": "2.0.5.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/ralouphie/getallheaders.git",
-            "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/5601c8a83fbba7ef674a7369456d12f1e0d0eafa",
-            "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa",
-            "shasum": "",
-            "mirrors": [
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+                    "name": "Tobias Schultze",
+                    "homepage": "https://github.com/Tobion"
                 }
-            ]
-        },
-        "require": {
-            "php": ">=5.3"
-        },
-        "require-dev": {
-            "phpunit/phpunit": "~3.7.0",
-            "satooshi/php-coveralls": ">=1.0"
-        },
-        "time": "2016-02-11T07:05:27+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "files": [
-                "src/getallheaders.php"
-            ]
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Ralph Khattar",
-                "email": "ralph.khattar@gmail.com"
-            }
-        ],
-        "description": "A polyfill for getallheaders."
-    },
-    {
-        "name": "spatie/macroable",
-        "version": "1.0.0",
-        "version_normalized": "1.0.0.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/spatie/macroable.git",
-            "reference": "74b0d189ce75142f1706aad834d5a428dfc7c3c3"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/spatie/macroable/zipball/74b0d189ce75142f1706aad834d5a428dfc7c3c3",
-            "reference": "74b0d189ce75142f1706aad834d5a428dfc7c3c3",
-            "shasum": "",
-            "mirrors": [
+            ],
+            "description": "PSR-7 message implementation that also provides common utility methods",
+            "keywords": [
+                "http",
+                "message",
+                "psr-7",
+                "request",
+                "response",
+                "stream",
+                "uri",
+                "url"
+            ],
+            "install-path": "../guzzlehttp/psr7"
+        },
+        {
+            "name": "jialeo/payment",
+            "version": "0.16",
+            "version_normalized": "0.16.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/jialeo/payment.git",
+                "reference": "28e5db40f8ab409f1b0f13c1588d29a004246d07"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/jialeo/payment/zipball/28e5db40f8ab409f1b0f13c1588d29a004246d07",
+                "reference": "28e5db40f8ab409f1b0f13c1588d29a004246d07",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.6.4"
+            },
+            "time": "2020-04-29T08:25:58+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "JiaLeo\\Payment\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+                    "name": "Liang",
+                    "email": "chenjialiang@han-zi.cn"
                 }
-            ]
-        },
-        "require": {
-            "php": "^7.0"
-        },
-        "require-dev": {
-            "phpunit/phpunit": "^6.3"
-        },
-        "time": "2017-09-18T09:51:20+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Spatie\\Macroable\\": "src"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Freek Van der Herten",
-                "email": "freek@spatie.be",
-                "homepage": "https://spatie.be",
-                "role": "Developer"
-            }
-        ],
-        "description": "A trait to dynamically add methods to a class",
-        "homepage": "https://github.com/spatie/macroable",
-        "keywords": [
-            "macroable",
-            "spatie"
-        ]
-    },
-    {
-        "name": "symfony/event-dispatcher",
-        "version": "v2.8.50",
-        "version_normalized": "2.8.50.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/symfony/event-dispatcher.git",
-            "reference": "a77e974a5fecb4398833b0709210e3d5e334ffb0"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a77e974a5fecb4398833b0709210e3d5e334ffb0",
-            "reference": "a77e974a5fecb4398833b0709210e3d5e334ffb0",
-            "shasum": "",
-            "mirrors": [
+            ],
+            "description": "Alipay,Unicompay",
+            "keywords": [
+                "Unicompay",
+                "alipay"
+            ],
+            "support": {
+                "issues": "https://github.com/jialeo/payment/issues",
+                "source": "https://github.com/jialeo/payment/tree/0.16"
+            },
+            "install-path": "../jialeo/payment"
+        },
+        {
+            "name": "league/flysystem",
+            "version": "1.0.57",
+            "version_normalized": "1.0.57.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/thephpleague/flysystem.git",
+                "reference": "0e9db7f0b96b9f12dcf6f65bc34b72b1a30ea55a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/0e9db7f0b96b9f12dcf6f65bc34b72b1a30ea55a",
+                "reference": "0e9db7f0b96b9f12dcf6f65bc34b72b1a30ea55a",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-fileinfo": "*",
+                "php": ">=5.5.9"
+            },
+            "conflict": {
+                "league/flysystem-sftp": "<1.0.6"
+            },
+            "require-dev": {
+                "phpspec/phpspec": "^3.4",
+                "phpunit/phpunit": "^5.7.10"
+            },
+            "suggest": {
+                "ext-fileinfo": "Required for MimeType",
+                "ext-ftp": "Allows you to use FTP server storage",
+                "ext-openssl": "Allows you to use FTPS server storage",
+                "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2",
+                "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3",
+                "league/flysystem-azure": "Allows you to use Windows Azure Blob storage",
+                "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching",
+                "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem",
+                "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files",
+                "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib",
+                "league/flysystem-webdav": "Allows you to use WebDAV storage",
+                "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter",
+                "spatie/flysystem-dropbox": "Allows you to use Dropbox storage",
+                "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications"
+            },
+            "time": "2019-10-16T21:01:05+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "League\\Flysystem\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Frank de Jonge",
+                    "email": "info@frenky.net"
+                }
+            ],
+            "description": "Filesystem abstraction: Many filesystems, one API.",
+            "keywords": [
+                "Cloud Files",
+                "WebDAV",
+                "abstraction",
+                "aws",
+                "cloud",
+                "copy.com",
+                "dropbox",
+                "file systems",
+                "files",
+                "filesystem",
+                "filesystems",
+                "ftp",
+                "rackspace",
+                "remote",
+                "s3",
+                "sftp",
+                "storage"
+            ],
+            "install-path": "../league/flysystem"
+        },
+        {
+            "name": "league/flysystem-cached-adapter",
+            "version": "1.0.9",
+            "version_normalized": "1.0.9.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/thephpleague/flysystem-cached-adapter.git",
+                "reference": "08ef74e9be88100807a3b92cc9048a312bf01d6f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/thephpleague/flysystem-cached-adapter/zipball/08ef74e9be88100807a3b92cc9048a312bf01d6f",
+                "reference": "08ef74e9be88100807a3b92cc9048a312bf01d6f",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "league/flysystem": "~1.0",
+                "psr/cache": "^1.0.0"
+            },
+            "require-dev": {
+                "mockery/mockery": "~0.9",
+                "phpspec/phpspec": "^3.4",
+                "phpunit/phpunit": "^5.7",
+                "predis/predis": "~1.0",
+                "tedivm/stash": "~0.12"
+            },
+            "suggest": {
+                "ext-phpredis": "Pure C implemented extension for PHP"
+            },
+            "time": "2018-07-09T20:51:04+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "League\\Flysystem\\Cached\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "frankdejonge",
+                    "email": "info@frenky.net"
+                }
+            ],
+            "description": "An adapter decorator to enable meta-data caching.",
+            "install-path": "../league/flysystem-cached-adapter"
+        },
+        {
+            "name": "monolog/monolog",
+            "version": "1.24.0",
+            "version_normalized": "1.24.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Seldaek/monolog.git",
+                "reference": "bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Seldaek/monolog/zipball/bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266",
+                "reference": "bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3.0",
+                "psr/log": "~1.0"
+            },
+            "provide": {
+                "psr/log-implementation": "1.0.0"
+            },
+            "require-dev": {
+                "aws/aws-sdk-php": "^2.4.9 || ^3.0",
+                "doctrine/couchdb": "~1.0@dev",
+                "graylog2/gelf-php": "~1.0",
+                "jakub-onderka/php-parallel-lint": "0.9",
+                "php-amqplib/php-amqplib": "~2.4",
+                "php-console/php-console": "^3.1.3",
+                "phpunit/phpunit": "~4.5",
+                "phpunit/phpunit-mock-objects": "2.3.0",
+                "ruflin/elastica": ">=0.90 <3.0",
+                "sentry/sentry": "^0.13",
+                "swiftmailer/swiftmailer": "^5.3|^6.0"
+            },
+            "suggest": {
+                "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
+                "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
+                "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
+                "ext-mongo": "Allow sending log messages to a MongoDB server",
+                "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
+                "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver",
+                "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
+                "php-console/php-console": "Allow sending log messages to Google Chrome",
+                "rollbar/rollbar": "Allow sending log messages to Rollbar",
+                "ruflin/elastica": "Allow sending log messages to an Elastic Search server",
+                "sentry/sentry": "Allow sending log messages to a Sentry server"
+            },
+            "time": "2018-11-05T09:00:11+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Monolog\\": "src/Monolog"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "http://seld.be"
+                }
+            ],
+            "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
+            "homepage": "http://github.com/Seldaek/monolog",
+            "keywords": [
+                "log",
+                "logging",
+                "psr-3"
+            ],
+            "install-path": "../monolog/monolog"
+        },
+        {
+            "name": "nesbot/carbon",
+            "version": "2.20.0",
+            "version_normalized": "2.20.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/briannesbitt/Carbon.git",
+                "reference": "bc671b896c276795fad8426b0aa24e8ade0f2498"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/bc671b896c276795fad8426b0aa24e8ade0f2498",
+                "reference": "bc671b896c276795fad8426b0aa24e8ade0f2498",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-json": "*",
+                "php": "^7.1.8 || ^8.0",
+                "symfony/translation": "^3.4 || ^4.0"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^2.14 || ^3.0",
+                "kylekatarnls/multi-tester": "^1.1",
+                "phpmd/phpmd": "^2.6",
+                "phpstan/phpstan": "^0.11",
+                "phpunit/phpunit": "^7.5 || ^8.0",
+                "squizlabs/php_codesniffer": "^3.4"
+            },
+            "time": "2019-06-25T10:00:57+00:00",
+            "type": "library",
+            "extra": {
+                "laravel": {
+                    "providers": [
+                        "Carbon\\Laravel\\ServiceProvider"
+                    ]
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Carbon\\": "src/Carbon/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Brian Nesbitt",
+                    "email": "brian@nesbot.com",
+                    "homepage": "http://nesbot.com"
+                }
+            ],
+            "description": "A simple API extension for DateTime.",
+            "homepage": "http://carbon.nesbot.com",
+            "keywords": [
+                "date",
+                "datetime",
+                "time"
+            ],
+            "install-path": "../nesbot/carbon"
+        },
+        {
+            "name": "opis/closure",
+            "version": "3.4.1",
+            "version_normalized": "3.4.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/opis/closure.git",
+                "reference": "e79f851749c3caa836d7ccc01ede5828feb762c7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/opis/closure/zipball/e79f851749c3caa836d7ccc01ede5828feb762c7",
+                "reference": "e79f851749c3caa836d7ccc01ede5828feb762c7",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^5.4 || ^7.0"
+            },
+            "require-dev": {
+                "jeremeamia/superclosure": "^2.0",
+                "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
+            },
+            "time": "2019-10-19T18:38:51+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.3.x-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Opis\\Closure\\": "src/"
+                },
+                "files": [
+                    "functions.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Marius Sarca",
+                    "email": "marius.sarca@gmail.com"
+                },
+                {
+                    "name": "Sorin Sarca",
+                    "email": "sarca_sorin@hotmail.com"
+                }
+            ],
+            "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.",
+            "homepage": "https://opis.io/closure",
+            "keywords": [
+                "anonymous functions",
+                "closure",
+                "function",
+                "serializable",
+                "serialization",
+                "serialize"
+            ],
+            "install-path": "../opis/closure"
+        },
+        {
+            "name": "overtrue/socialite",
+            "version": "1.3.0",
+            "version_normalized": "1.3.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/overtrue/socialite.git",
+                "reference": "fda55f0acef43a144799b1957a8f93d9f5deffce"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/overtrue/socialite/zipball/fda55f0acef43a144799b1957a8f93d9f5deffce",
+                "reference": "fda55f0acef43a144799b1957a8f93d9f5deffce",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "guzzlehttp/guzzle": "~5.0|~6.0",
+                "php": ">=5.4.0",
+                "symfony/http-foundation": "~2.6|~2.7|~2.8|~3.0"
+            },
+            "require-dev": {
+                "mockery/mockery": "~0.9",
+                "phpunit/phpunit": "~4.0"
+            },
+            "time": "2017-08-04T06:28:22+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Overtrue\\Socialite\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "overtrue",
+                    "email": "anzhengchao@gmail.com"
+                }
+            ],
+            "description": "A collection of OAuth 2 packages that extracts from laravel/socialite.",
+            "keywords": [
+                "login",
+                "oauth",
+                "qq",
+                "social",
+                "wechat",
+                "weibo"
+            ],
+            "install-path": "../overtrue/socialite"
+        },
+        {
+            "name": "overtrue/wechat",
+            "version": "3.3.33",
+            "version_normalized": "3.3.33.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/overtrue/wechat.git",
+                "reference": "78e5476df330754040d1c400d0bca640d5b77cb7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/overtrue/wechat/zipball/78e5476df330754040d1c400d0bca640d5b77cb7",
+                "reference": "78e5476df330754040d1c400d0bca640d5b77cb7",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "doctrine/cache": "1.4.*",
+                "ext-openssl": "*",
+                "guzzlehttp/guzzle": "~6.2",
+                "monolog/monolog": "^1.17",
+                "overtrue/socialite": "^1.0.25",
+                "php": ">=5.5.0",
+                "pimple/pimple": "~3.0",
+                "symfony/http-foundation": "~2.6|~2.7|~2.8|~3.0",
+                "symfony/psr-http-message-bridge": "~0.3|^1.0"
+            },
+            "require-dev": {
+                "mockery/mockery": "^0.9.9",
+                "overtrue/phplint": "dev-master",
+                "phpunit/phpunit": "~4.0"
+            },
+            "time": "2018-10-17T12:27:27+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "EasyWeChat\\": "src/"
+                },
+                "files": [
+                    "src/Payment/helpers.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "overtrue",
+                    "email": "anzhengchao@gmail.com"
+                }
+            ],
+            "description": "微信SDK",
+            "keywords": [
+                "sdk",
+                "wechat",
+                "weixin",
+                "weixin-sdk"
+            ],
+            "install-path": "../overtrue/wechat"
+        },
+        {
+            "name": "paragonie/random_compat",
+            "version": "v9.99.99",
+            "version_normalized": "9.99.99.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/paragonie/random_compat.git",
+                "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95",
+                "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "4.*|5.*",
+                "vimeo/psalm": "^1"
+            },
+            "suggest": {
+                "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
+            },
+            "time": "2018-07-02T15:55:56+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Paragon Initiative Enterprises",
+                    "email": "security@paragonie.com",
+                    "homepage": "https://paragonie.com"
+                }
+            ],
+            "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
+            "keywords": [
+                "csprng",
+                "polyfill",
+                "pseudorandom",
+                "random"
+            ],
+            "install-path": "../paragonie/random_compat"
+        },
+        {
+            "name": "phpoffice/phpexcel",
+            "version": "1.8.2",
+            "version_normalized": "1.8.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/PHPOffice/PHPExcel.git",
+                "reference": "1441011fb7ecdd8cc689878f54f8b58a6805f870"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/PHPOffice/PHPExcel/zipball/1441011fb7ecdd8cc689878f54f8b58a6805f870",
+                "reference": "1441011fb7ecdd8cc689878f54f8b58a6805f870",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-mbstring": "*",
+                "ext-xml": "*",
+                "ext-xmlwriter": "*",
+                "php": "^5.2|^7.0"
+            },
+            "require-dev": {
+                "squizlabs/php_codesniffer": "2.*"
+            },
+            "time": "2018-11-22T23:07:24+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-0": {
+                    "PHPExcel": "Classes/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "LGPL-2.1"
+            ],
+            "authors": [
+                {
+                    "name": "Maarten Balliauw",
+                    "homepage": "http://blog.maartenballiauw.be"
+                },
+                {
+                    "name": "Erik Tilt"
+                },
+                {
+                    "name": "Franck Lefevre",
+                    "homepage": "http://rootslabs.net"
+                },
+                {
+                    "name": "Mark Baker",
+                    "homepage": "http://markbakeruk.net"
+                }
+            ],
+            "description": "PHPExcel - OpenXML - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine",
+            "homepage": "https://github.com/PHPOffice/PHPExcel",
+            "keywords": [
+                "OpenXML",
+                "excel",
+                "php",
+                "spreadsheet",
+                "xls",
+                "xlsx"
+            ],
+            "abandoned": "phpoffice/phpspreadsheet",
+            "install-path": "../phpoffice/phpexcel"
+        },
+        {
+            "name": "pimple/pimple",
+            "version": "v3.2.3",
+            "version_normalized": "3.2.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/silexphp/Pimple.git",
+                "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/silexphp/Pimple/zipball/9e403941ef9d65d20cba7d54e29fe906db42cf32",
+                "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3.0",
+                "psr/container": "^1.0"
+            },
+            "require-dev": {
+                "symfony/phpunit-bridge": "^3.2"
+            },
+            "time": "2018-01-21T07:42:36+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.2.x-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-0": {
+                    "Pimple": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Pimple, a simple Dependency Injection Container",
+            "homepage": "http://pimple.sensiolabs.org",
+            "keywords": [
+                "container",
+                "dependency injection"
+            ],
+            "install-path": "../pimple/pimple"
+        },
+        {
+            "name": "psr/cache",
+            "version": "1.0.1",
+            "version_normalized": "1.0.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/cache.git",
+                "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
+                "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "time": "2016-08-06T20:24:11+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Cache\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for caching libraries",
+            "keywords": [
+                "cache",
+                "psr",
+                "psr-6"
+            ],
+            "install-path": "../psr/cache"
+        },
+        {
+            "name": "psr/container",
+            "version": "1.0.0",
+            "version_normalized": "1.0.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/container.git",
+                "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+                "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "time": "2017-02-14T16:28:37+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Container\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common Container Interface (PHP FIG PSR-11)",
+            "homepage": "https://github.com/php-fig/container",
+            "keywords": [
+                "PSR-11",
+                "container",
+                "container-interface",
+                "container-interop",
+                "psr"
+            ],
+            "install-path": "../psr/container"
+        },
+        {
+            "name": "psr/http-message",
+            "version": "1.0.1",
+            "version_normalized": "1.0.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-message.git",
+                "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+                "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "time": "2016-08-06T14:39:51+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Http\\Message\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for HTTP messages",
+            "homepage": "https://github.com/php-fig/http-message",
+            "keywords": [
+                "http",
+                "http-message",
+                "psr",
+                "psr-7",
+                "request",
+                "response"
+            ],
+            "install-path": "../psr/http-message"
+        },
+        {
+            "name": "psr/log",
+            "version": "1.1.2",
+            "version_normalized": "1.1.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/log.git",
+                "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801",
+                "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "time": "2019-11-01T11:05:21+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1.x-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Log\\": "Psr/Log/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for logging libraries",
+            "homepage": "https://github.com/php-fig/log",
+            "keywords": [
+                "log",
+                "psr",
+                "psr-3"
+            ],
+            "install-path": "../psr/log"
+        },
+        {
+            "name": "psr/simple-cache",
+            "version": "1.0.1",
+            "version_normalized": "1.0.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/simple-cache.git",
+                "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+                "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "time": "2017-10-23T01:57:42+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Psr\\SimpleCache\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interfaces for simple caching",
+            "keywords": [
+                "cache",
+                "caching",
+                "psr",
+                "psr-16",
+                "simple-cache"
+            ],
+            "install-path": "../psr/simple-cache"
+        },
+        {
+            "name": "qcloud/cos-sdk-v5",
+            "version": "v1.3.3",
+            "version_normalized": "1.3.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/tencentyun/cos-php-sdk-v5.git",
+                "reference": "cd1b9cefa04521eaf125a82eb53552d9a87aae4d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/tencentyun/cos-php-sdk-v5/zipball/cd1b9cefa04521eaf125a82eb53552d9a87aae4d",
+                "reference": "cd1b9cefa04521eaf125a82eb53552d9a87aae4d",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "guzzle/guzzle": "~3.7",
+                "php": ">=5.3.0"
+            },
+            "time": "2019-08-07T10:15:47+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-0": {
+                    "Qcloud\\Cos\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "yaozongyou",
+                    "email": "yaozongyou@vip.qq.com"
+                },
+                {
+                    "name": "lewzylu",
+                    "email": "327874225@qq.com"
+                }
+            ],
+            "description": "PHP SDK for QCloud COS",
+            "keywords": [
+                "cos",
+                "php",
+                "qcloud"
+            ],
+            "install-path": "../qcloud/cos-sdk-v5"
+        },
+        {
+            "name": "qiniu/php-sdk",
+            "version": "v7.2.9",
+            "version_normalized": "7.2.9.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/qiniu/php-sdk.git",
+                "reference": "afe7d8715d8a688b1d8d8cdf031240d2363dad90"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/qiniu/php-sdk/zipball/afe7d8715d8a688b1d8d8cdf031240d2363dad90",
+                "reference": "afe7d8715d8a688b1d8d8cdf031240d2363dad90",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0",
+                "squizlabs/php_codesniffer": "~2.3"
+            },
+            "time": "2019-07-09T07:55:07+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Qiniu\\": "src/Qiniu"
+                },
+                "files": [
+                    "src/Qiniu/functions.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Qiniu",
+                    "email": "sdk@qiniu.com",
+                    "homepage": "http://www.qiniu.com"
+                }
+            ],
+            "description": "Qiniu Resource (Cloud) Storage SDK for PHP",
+            "homepage": "http://developer.qiniu.com/",
+            "keywords": [
+                "cloud",
+                "qiniu",
+                "sdk",
+                "storage"
+            ],
+            "install-path": "../qiniu/php-sdk"
+        },
+        {
+            "name": "ralouphie/getallheaders",
+            "version": "2.0.5",
+            "version_normalized": "2.0.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/ralouphie/getallheaders.git",
+                "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/5601c8a83fbba7ef674a7369456d12f1e0d0eafa",
+                "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~3.7.0",
+                "satooshi/php-coveralls": ">=1.0"
+            },
+            "time": "2016-02-11T07:05:27+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "files": [
+                    "src/getallheaders.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ralph Khattar",
+                    "email": "ralph.khattar@gmail.com"
+                }
+            ],
+            "description": "A polyfill for getallheaders.",
+            "install-path": "../ralouphie/getallheaders"
+        },
+        {
+            "name": "spatie/macroable",
+            "version": "1.0.0",
+            "version_normalized": "1.0.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/spatie/macroable.git",
+                "reference": "74b0d189ce75142f1706aad834d5a428dfc7c3c3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/spatie/macroable/zipball/74b0d189ce75142f1706aad834d5a428dfc7c3c3",
+                "reference": "74b0d189ce75142f1706aad834d5a428dfc7c3c3",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^6.3"
+            },
+            "time": "2017-09-18T09:51:20+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Spatie\\Macroable\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Freek Van der Herten",
+                    "email": "freek@spatie.be",
+                    "homepage": "https://spatie.be",
+                    "role": "Developer"
+                }
+            ],
+            "description": "A trait to dynamically add methods to a class",
+            "homepage": "https://github.com/spatie/macroable",
+            "keywords": [
+                "macroable",
+                "spatie"
+            ],
+            "install-path": "../spatie/macroable"
+        },
+        {
+            "name": "symfony/event-dispatcher",
+            "version": "v2.8.50",
+            "version_normalized": "2.8.50.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/event-dispatcher.git",
+                "reference": "a77e974a5fecb4398833b0709210e3d5e334ffb0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a77e974a5fecb4398833b0709210e3d5e334ffb0",
+                "reference": "a77e974a5fecb4398833b0709210e3d5e334ffb0",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3.9"
+            },
+            "require-dev": {
+                "psr/log": "~1.0",
+                "symfony/config": "^2.0.5|~3.0.0",
+                "symfony/dependency-injection": "~2.6|~3.0.0",
+                "symfony/expression-language": "~2.6|~3.0.0",
+                "symfony/stopwatch": "~2.3|~3.0.0"
+            },
+            "suggest": {
+                "symfony/dependency-injection": "",
+                "symfony/http-kernel": ""
+            },
+            "time": "2018-11-21T14:20:20+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\EventDispatcher\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony EventDispatcher Component",
+            "homepage": "https://symfony.com",
+            "install-path": "../symfony/event-dispatcher"
+        },
+        {
+            "name": "symfony/http-foundation",
+            "version": "v3.4.28",
+            "version_normalized": "3.4.28.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/http-foundation.git",
+                "reference": "677ae5e892b081e71a665bfa7dd90fe61800c00e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/677ae5e892b081e71a665bfa7dd90fe61800c00e",
+                "reference": "677ae5e892b081e71a665bfa7dd90fe61800c00e",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^5.5.9|>=7.0.8",
+                "symfony/polyfill-mbstring": "~1.1",
+                "symfony/polyfill-php70": "~1.6"
+            },
+            "require-dev": {
+                "symfony/expression-language": "~2.8|~3.0|~4.0"
+            },
+            "time": "2019-05-27T05:50:24+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.4-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\HttpFoundation\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony HttpFoundation Component",
+            "homepage": "https://symfony.com",
+            "install-path": "../symfony/http-foundation"
+        },
+        {
+            "name": "symfony/polyfill-mbstring",
+            "version": "v1.11.0",
+            "version_normalized": "1.11.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-mbstring.git",
+                "reference": "fe5e94c604826c35a32fa832f35bd036b6799609"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fe5e94c604826c35a32fa832f35bd036b6799609",
+                "reference": "fe5e94c604826c35a32fa832f35bd036b6799609",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "suggest": {
+                "ext-mbstring": "For best performance"
+            },
+            "time": "2019-02-06T07:57:58+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.11-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Mbstring\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for the Mbstring extension",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "mbstring",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "install-path": "../symfony/polyfill-mbstring"
+        },
+        {
+            "name": "symfony/polyfill-php70",
+            "version": "v1.11.0",
+            "version_normalized": "1.11.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php70.git",
+                "reference": "bc4858fb611bda58719124ca079baff854149c89"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/bc4858fb611bda58719124ca079baff854149c89",
+                "reference": "bc4858fb611bda58719124ca079baff854149c89",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "paragonie/random_compat": "~1.0|~2.0|~9.99",
+                "php": ">=5.3.3"
+            },
+            "time": "2019-02-06T07:57:58+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.11-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php70\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ],
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "install-path": "../symfony/polyfill-php70"
+        },
+        {
+            "name": "symfony/polyfill-php72",
+            "version": "v1.11.0",
+            "version_normalized": "1.11.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php72.git",
+                "reference": "ab50dcf166d5f577978419edd37aa2bb8eabce0c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/ab50dcf166d5f577978419edd37aa2bb8eabce0c",
+                "reference": "ab50dcf166d5f577978419edd37aa2bb8eabce0c",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "time": "2019-02-06T07:57:58+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.11-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php72\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "install-path": "../symfony/polyfill-php72"
+        },
+        {
+            "name": "symfony/process",
+            "version": "v4.3.2",
+            "version_normalized": "4.3.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/process.git",
+                "reference": "856d35814cf287480465bb7a6c413bb7f5f5e69c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/process/zipball/856d35814cf287480465bb7a6c413bb7f5f5e69c",
+                "reference": "856d35814cf287480465bb7a6c413bb7f5f5e69c",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.1.3"
+            },
+            "time": "2019-05-30T16:10:05+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.3-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Process\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Process Component",
+            "homepage": "https://symfony.com",
+            "install-path": "../symfony/process"
+        },
+        {
+            "name": "symfony/psr-http-message-bridge",
+            "version": "v1.2.0",
+            "version_normalized": "1.2.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/psr-http-message-bridge.git",
+                "reference": "9ab9d71f97d5c7d35a121a7fb69f74fee95cd0ad"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/9ab9d71f97d5c7d35a121a7fb69f74fee95cd0ad",
+                "reference": "9ab9d71f97d5c7d35a121a7fb69f74fee95cd0ad",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.1",
+                "psr/http-message": "^1.0",
+                "symfony/http-foundation": "^3.4 || ^4.0"
+            },
+            "require-dev": {
+                "nyholm/psr7": "^1.1",
+                "symfony/phpunit-bridge": "^3.4.20 || ^4.0",
+                "zendframework/zend-diactoros": "^1.4.1 || ^2.0"
+            },
+            "suggest": {
+                "nyholm/psr7": "For a super lightweight PSR-7/17 implementation"
+            },
+            "time": "2019-03-11T18:22:33+00:00",
+            "type": "symfony-bridge",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.2-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Bridge\\PsrHttpMessage\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                },
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "PSR HTTP message bridge",
+            "homepage": "http://symfony.com",
+            "keywords": [
+                "http",
+                "http-message",
+                "psr-17",
+                "psr-7"
+            ],
+            "install-path": "../symfony/psr-http-message-bridge"
+        },
+        {
+            "name": "symfony/translation",
+            "version": "v4.3.2",
+            "version_normalized": "4.3.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/translation.git",
+                "reference": "934ab1d18545149e012aa898cf02e9f23790f7a0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/translation/zipball/934ab1d18545149e012aa898cf02e9f23790f7a0",
+                "reference": "934ab1d18545149e012aa898cf02e9f23790f7a0",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.1.3",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/translation-contracts": "^1.1.2"
+            },
+            "conflict": {
+                "symfony/config": "<3.4",
+                "symfony/dependency-injection": "<3.4",
+                "symfony/yaml": "<3.4"
+            },
+            "provide": {
+                "symfony/translation-implementation": "1.0"
+            },
+            "require-dev": {
+                "psr/log": "~1.0",
+                "symfony/config": "~3.4|~4.0",
+                "symfony/console": "~3.4|~4.0",
+                "symfony/dependency-injection": "~3.4|~4.0",
+                "symfony/finder": "~2.8|~3.0|~4.0",
+                "symfony/http-kernel": "~3.4|~4.0",
+                "symfony/intl": "~3.4|~4.0",
+                "symfony/service-contracts": "^1.1.2",
+                "symfony/var-dumper": "~3.4|~4.0",
+                "symfony/yaml": "~3.4|~4.0"
+            },
+            "suggest": {
+                "psr/log-implementation": "To use logging capability in translator",
+                "symfony/config": "",
+                "symfony/yaml": ""
+            },
+            "time": "2019-06-13T11:03:18+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.3-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Translation\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Translation Component",
+            "homepage": "https://symfony.com",
+            "install-path": "../symfony/translation"
+        },
+        {
+            "name": "symfony/translation-contracts",
+            "version": "v1.1.5",
+            "version_normalized": "1.1.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/translation-contracts.git",
+                "reference": "cb4b18ad7b92a26e83b65dde940fab78339e6f3c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/cb4b18ad7b92a26e83b65dde940fab78339e6f3c",
+                "reference": "cb4b18ad7b92a26e83b65dde940fab78339e6f3c",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.1.3"
+            },
+            "suggest": {
+                "symfony/translation-implementation": ""
+            },
+            "time": "2019-06-13T11:15:36+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Contracts\\Translation\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Generic abstractions related to translation",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
+            ],
+            "install-path": "../symfony/translation-contracts"
+        },
+        {
+            "name": "symfony/var-dumper",
+            "version": "v4.3.1",
+            "version_normalized": "4.3.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/var-dumper.git",
+                "reference": "f974f448154928d2b5fb7c412bd23b81d063f34b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/f974f448154928d2b5fb7c412bd23b81d063f34b",
+                "reference": "f974f448154928d2b5fb7c412bd23b81d063f34b",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.1.3",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/polyfill-php72": "~1.5"
+            },
+            "conflict": {
+                "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
+                "symfony/console": "<3.4"
+            },
+            "require-dev": {
+                "ext-iconv": "*",
+                "symfony/console": "~3.4|~4.0",
+                "symfony/process": "~3.4|~4.0",
+                "twig/twig": "~1.34|~2.4"
+            },
+            "suggest": {
+                "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
+                "ext-intl": "To show region name in time zone dump",
+                "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script"
+            },
+            "time": "2019-06-05T02:08:12+00:00",
+            "bin": [
+                "Resources/bin/var-dump-server"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.3-dev"
                 }
-            ]
-        },
-        "require": {
-            "php": ">=5.3.9"
-        },
-        "require-dev": {
-            "psr/log": "~1.0",
-            "symfony/config": "^2.0.5|~3.0.0",
-            "symfony/dependency-injection": "~2.6|~3.0.0",
-            "symfony/expression-language": "~2.6|~3.0.0",
-            "symfony/stopwatch": "~2.3|~3.0.0"
-        },
-        "suggest": {
-            "symfony/dependency-injection": "",
-            "symfony/http-kernel": ""
-        },
-        "time": "2018-11-21T14:20:20+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "2.8-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Symfony\\Component\\EventDispatcher\\": ""
-            },
-            "exclude-from-classmap": [
-                "/Tests/"
-            ]
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Fabien Potencier",
-                "email": "fabien@symfony.com"
-            },
-            {
-                "name": "Symfony Community",
-                "homepage": "https://symfony.com/contributors"
-            }
-        ],
-        "description": "Symfony EventDispatcher Component",
-        "homepage": "https://symfony.com"
-    },
-    {
-        "name": "symfony/http-foundation",
-        "version": "v3.4.28",
-        "version_normalized": "3.4.28.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/symfony/http-foundation.git",
-            "reference": "677ae5e892b081e71a665bfa7dd90fe61800c00e"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/symfony/http-foundation/zipball/677ae5e892b081e71a665bfa7dd90fe61800c00e",
-            "reference": "677ae5e892b081e71a665bfa7dd90fe61800c00e",
-            "shasum": "",
-            "mirrors": [
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "files": [
+                    "Resources/functions/dump.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Component\\VarDumper\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
-        },
-        "require": {
-            "php": "^5.5.9|>=7.0.8",
-            "symfony/polyfill-mbstring": "~1.1",
-            "symfony/polyfill-php70": "~1.6"
-        },
-        "require-dev": {
-            "symfony/expression-language": "~2.8|~3.0|~4.0"
-        },
-        "time": "2019-05-27T05:50:24+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "3.4-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Symfony\\Component\\HttpFoundation\\": ""
-            },
-            "exclude-from-classmap": [
-                "/Tests/"
-            ]
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Fabien Potencier",
-                "email": "fabien@symfony.com"
-            },
-            {
-                "name": "Symfony Community",
-                "homepage": "https://symfony.com/contributors"
-            }
-        ],
-        "description": "Symfony HttpFoundation Component",
-        "homepage": "https://symfony.com"
-    },
-    {
-        "name": "symfony/polyfill-mbstring",
-        "version": "v1.11.0",
-        "version_normalized": "1.11.0.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/symfony/polyfill-mbstring.git",
-            "reference": "fe5e94c604826c35a32fa832f35bd036b6799609"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fe5e94c604826c35a32fa832f35bd036b6799609",
-            "reference": "fe5e94c604826c35a32fa832f35bd036b6799609",
-            "shasum": "",
-            "mirrors": [
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
                 }
-            ]
-        },
-        "require": {
-            "php": ">=5.3.3"
-        },
-        "suggest": {
-            "ext-mbstring": "For best performance"
-        },
-        "time": "2019-02-06T07:57:58+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.11-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Symfony\\Polyfill\\Mbstring\\": ""
-            },
-            "files": [
-                "bootstrap.php"
-            ]
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Nicolas Grekas",
-                "email": "p@tchwork.com"
-            },
-            {
-                "name": "Symfony Community",
-                "homepage": "https://symfony.com/contributors"
-            }
-        ],
-        "description": "Symfony polyfill for the Mbstring extension",
-        "homepage": "https://symfony.com",
-        "keywords": [
-            "compatibility",
-            "mbstring",
-            "polyfill",
-            "portable",
-            "shim"
-        ]
-    },
-    {
-        "name": "symfony/polyfill-php70",
-        "version": "v1.11.0",
-        "version_normalized": "1.11.0.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/symfony/polyfill-php70.git",
-            "reference": "bc4858fb611bda58719124ca079baff854149c89"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/bc4858fb611bda58719124ca079baff854149c89",
-            "reference": "bc4858fb611bda58719124ca079baff854149c89",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+            ],
+            "description": "Symfony mechanism for exploring and dumping PHP variables",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "debug",
+                "dump"
+            ],
+            "install-path": "../symfony/var-dumper"
+        },
+        {
+            "name": "topthink/framework",
+            "version": "v6.0.0",
+            "version_normalized": "6.0.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/top-think/framework.git",
+                "reference": "79c555aab0313d1a33ddcdb3c395f2c47f37f597"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/top-think/framework/zipball/79c555aab0313d1a33ddcdb3c395f2c47f37f597",
+                "reference": "79c555aab0313d1a33ddcdb3c395f2c47f37f597",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-json": "*",
+                "ext-mbstring": "*",
+                "league/flysystem": "^1.0",
+                "league/flysystem-cached-adapter": "^1.0",
+                "opis/closure": "^3.1",
+                "php": ">=7.1.0",
+                "psr/container": "~1.0",
+                "psr/log": "~1.0",
+                "psr/simple-cache": "^1.0",
+                "topthink/think-helper": "^3.1.1",
+                "topthink/think-orm": "^2.0"
+            },
+            "require-dev": {
+                "mikey179/vfsstream": "^1.6",
+                "mockery/mockery": "^1.2",
+                "phpunit/phpunit": "^7.0"
+            },
+            "time": "2019-10-23T23:28:43+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "files": [],
+                "psr-4": {
+                    "think\\": "src/think/"
                 }
-            ]
-        },
-        "require": {
-            "paragonie/random_compat": "~1.0|~2.0|~9.99",
-            "php": ">=5.3.3"
-        },
-        "time": "2019-02-06T07:57:58+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.11-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Symfony\\Polyfill\\Php70\\": ""
             },
-            "files": [
-                "bootstrap.php"
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
             ],
-            "classmap": [
-                "Resources/stubs"
-            ]
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Nicolas Grekas",
-                "email": "p@tchwork.com"
-            },
-            {
-                "name": "Symfony Community",
-                "homepage": "https://symfony.com/contributors"
-            }
-        ],
-        "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions",
-        "homepage": "https://symfony.com",
-        "keywords": [
-            "compatibility",
-            "polyfill",
-            "portable",
-            "shim"
-        ]
-    },
-    {
-        "name": "symfony/polyfill-php72",
-        "version": "v1.11.0",
-        "version_normalized": "1.11.0.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/symfony/polyfill-php72.git",
-            "reference": "ab50dcf166d5f577978419edd37aa2bb8eabce0c"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/ab50dcf166d5f577978419edd37aa2bb8eabce0c",
-            "reference": "ab50dcf166d5f577978419edd37aa2bb8eabce0c",
-            "shasum": "",
-            "mirrors": [
+            "authors": [
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
-                }
-            ]
-        },
-        "require": {
-            "php": ">=5.3.3"
-        },
-        "time": "2019-02-06T07:57:58+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.11-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Symfony\\Polyfill\\Php72\\": ""
-            },
-            "files": [
-                "bootstrap.php"
-            ]
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Nicolas Grekas",
-                "email": "p@tchwork.com"
-            },
-            {
-                "name": "Symfony Community",
-                "homepage": "https://symfony.com/contributors"
-            }
-        ],
-        "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
-        "homepage": "https://symfony.com",
-        "keywords": [
-            "compatibility",
-            "polyfill",
-            "portable",
-            "shim"
-        ]
-    },
-    {
-        "name": "symfony/process",
-        "version": "v4.3.2",
-        "version_normalized": "4.3.2.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/symfony/process.git",
-            "reference": "856d35814cf287480465bb7a6c413bb7f5f5e69c"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/symfony/process/zipball/856d35814cf287480465bb7a6c413bb7f5f5e69c",
-            "reference": "856d35814cf287480465bb7a6c413bb7f5f5e69c",
-            "shasum": "",
-            "mirrors": [
+                    "name": "liu21st",
+                    "email": "liu21st@gmail.com"
+                },
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+                    "name": "yunwuxin",
+                    "email": "448901948@qq.com"
                 }
-            ]
-        },
-        "require": {
-            "php": "^7.1.3"
-        },
-        "time": "2019-05-30T16:10:05+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "4.3-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Symfony\\Component\\Process\\": ""
-            },
-            "exclude-from-classmap": [
-                "/Tests/"
-            ]
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Fabien Potencier",
-                "email": "fabien@symfony.com"
-            },
-            {
-                "name": "Symfony Community",
-                "homepage": "https://symfony.com/contributors"
-            }
-        ],
-        "description": "Symfony Process Component",
-        "homepage": "https://symfony.com"
-    },
-    {
-        "name": "symfony/psr-http-message-bridge",
-        "version": "v1.2.0",
-        "version_normalized": "1.2.0.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/symfony/psr-http-message-bridge.git",
-            "reference": "9ab9d71f97d5c7d35a121a7fb69f74fee95cd0ad"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/9ab9d71f97d5c7d35a121a7fb69f74fee95cd0ad",
-            "reference": "9ab9d71f97d5c7d35a121a7fb69f74fee95cd0ad",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+            ],
+            "description": "The ThinkPHP Framework.",
+            "homepage": "http://thinkphp.cn/",
+            "keywords": [
+                "framework",
+                "orm",
+                "thinkphp"
+            ],
+            "install-path": "../topthink/framework"
+        },
+        {
+            "name": "topthink/think-captcha",
+            "version": "v3.0.1",
+            "version_normalized": "3.0.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/top-think/think-captcha.git",
+                "reference": "9fc0c627d773f6a54a8dd142ebf358f746557a48"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/top-think/think-captcha/zipball/9fc0c627d773f6a54a8dd142ebf358f746557a48",
+                "reference": "9fc0c627d773f6a54a8dd142ebf358f746557a48",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "topthink/framework": "^6.0.0"
+            },
+            "time": "2019-06-06T07:16:01+00:00",
+            "type": "library",
+            "extra": {
+                "think": {
+                    "services": [
+                        "think\\captcha\\CaptchaService"
+                    ]
                 }
-            ]
-        },
-        "require": {
-            "php": "^7.1",
-            "psr/http-message": "^1.0",
-            "symfony/http-foundation": "^3.4 || ^4.0"
-        },
-        "require-dev": {
-            "nyholm/psr7": "^1.1",
-            "symfony/phpunit-bridge": "^3.4.20 || ^4.0",
-            "zendframework/zend-diactoros": "^1.4.1 || ^2.0"
-        },
-        "suggest": {
-            "nyholm/psr7": "For a super lightweight PSR-7/17 implementation"
-        },
-        "time": "2019-03-11T18:22:33+00:00",
-        "type": "symfony-bridge",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.2-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Symfony\\Bridge\\PsrHttpMessage\\": ""
-            },
-            "exclude-from-classmap": [
-                "/Tests/"
-            ]
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Symfony Community",
-                "homepage": "http://symfony.com/contributors"
-            },
-            {
-                "name": "Fabien Potencier",
-                "email": "fabien@symfony.com"
-            }
-        ],
-        "description": "PSR HTTP message bridge",
-        "homepage": "http://symfony.com",
-        "keywords": [
-            "http",
-            "http-message",
-            "psr-17",
-            "psr-7"
-        ]
-    },
-    {
-        "name": "symfony/translation",
-        "version": "v4.3.2",
-        "version_normalized": "4.3.2.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/symfony/translation.git",
-            "reference": "934ab1d18545149e012aa898cf02e9f23790f7a0"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/symfony/translation/zipball/934ab1d18545149e012aa898cf02e9f23790f7a0",
-            "reference": "934ab1d18545149e012aa898cf02e9f23790f7a0",
-            "shasum": "",
-            "mirrors": [
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "think\\captcha\\": "src/"
+                },
+                "files": [
+                    "src/helper.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+                    "name": "yunwuxin",
+                    "email": "448901948@qq.com"
                 }
-            ]
-        },
-        "require": {
-            "php": "^7.1.3",
-            "symfony/polyfill-mbstring": "~1.0",
-            "symfony/translation-contracts": "^1.1.2"
-        },
-        "conflict": {
-            "symfony/config": "<3.4",
-            "symfony/dependency-injection": "<3.4",
-            "symfony/yaml": "<3.4"
-        },
-        "provide": {
-            "symfony/translation-implementation": "1.0"
-        },
-        "require-dev": {
-            "psr/log": "~1.0",
-            "symfony/config": "~3.4|~4.0",
-            "symfony/console": "~3.4|~4.0",
-            "symfony/dependency-injection": "~3.4|~4.0",
-            "symfony/finder": "~2.8|~3.0|~4.0",
-            "symfony/http-kernel": "~3.4|~4.0",
-            "symfony/intl": "~3.4|~4.0",
-            "symfony/service-contracts": "^1.1.2",
-            "symfony/var-dumper": "~3.4|~4.0",
-            "symfony/yaml": "~3.4|~4.0"
-        },
-        "suggest": {
-            "psr/log-implementation": "To use logging capability in translator",
-            "symfony/config": "",
-            "symfony/yaml": ""
-        },
-        "time": "2019-06-13T11:03:18+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "4.3-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Symfony\\Component\\Translation\\": ""
-            },
-            "exclude-from-classmap": [
-                "/Tests/"
-            ]
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Fabien Potencier",
-                "email": "fabien@symfony.com"
-            },
-            {
-                "name": "Symfony Community",
-                "homepage": "https://symfony.com/contributors"
-            }
-        ],
-        "description": "Symfony Translation Component",
-        "homepage": "https://symfony.com"
-    },
-    {
-        "name": "symfony/translation-contracts",
-        "version": "v1.1.5",
-        "version_normalized": "1.1.5.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/symfony/translation-contracts.git",
-            "reference": "cb4b18ad7b92a26e83b65dde940fab78339e6f3c"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/cb4b18ad7b92a26e83b65dde940fab78339e6f3c",
-            "reference": "cb4b18ad7b92a26e83b65dde940fab78339e6f3c",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+            ],
+            "description": "captcha package for thinkphp",
+            "install-path": "../topthink/think-captcha"
+        },
+        {
+            "name": "topthink/think-factory",
+            "version": "v1.0.1",
+            "version_normalized": "1.0.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/top-think/think-factory.git",
+                "reference": "b8080a6472aae1cff47ceb8c30feec3c2835364b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/top-think/think-factory/zipball/b8080a6472aae1cff47ceb8c30feec3c2835364b",
+                "reference": "b8080a6472aae1cff47ceb8c30feec3c2835364b",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "topthink/framework": "^6.0.0",
+                "topthink/think-helper": "^3.0.0"
+            },
+            "time": "2019-04-15T06:55:28+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "think\\": "src"
                 }
-            ]
-        },
-        "require": {
-            "php": "^7.1.3"
-        },
-        "suggest": {
-            "symfony/translation-implementation": ""
-        },
-        "time": "2019-06-13T11:15:36+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.1-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Symfony\\Contracts\\Translation\\": ""
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Nicolas Grekas",
-                "email": "p@tchwork.com"
-            },
-            {
-                "name": "Symfony Community",
-                "homepage": "https://symfony.com/contributors"
-            }
-        ],
-        "description": "Generic abstractions related to translation",
-        "homepage": "https://symfony.com",
-        "keywords": [
-            "abstractions",
-            "contracts",
-            "decoupling",
-            "interfaces",
-            "interoperability",
-            "standards"
-        ]
-    },
-    {
-        "name": "symfony/var-dumper",
-        "version": "v4.3.1",
-        "version_normalized": "4.3.1.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/symfony/var-dumper.git",
-            "reference": "f974f448154928d2b5fb7c412bd23b81d063f34b"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/symfony/var-dumper/zipball/f974f448154928d2b5fb7c412bd23b81d063f34b",
-            "reference": "f974f448154928d2b5fb7c412bd23b81d063f34b",
-            "shasum": "",
-            "mirrors": [
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+                    "name": "yunwuxin",
+                    "email": "448901948@qq.com"
                 }
-            ]
-        },
-        "require": {
-            "php": "^7.1.3",
-            "symfony/polyfill-mbstring": "~1.0",
-            "symfony/polyfill-php72": "~1.5"
-        },
-        "conflict": {
-            "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
-            "symfony/console": "<3.4"
-        },
-        "require-dev": {
-            "ext-iconv": "*",
-            "symfony/console": "~3.4|~4.0",
-            "symfony/process": "~3.4|~4.0",
-            "twig/twig": "~1.34|~2.4"
-        },
-        "suggest": {
-            "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
-            "ext-intl": "To show region name in time zone dump",
-            "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script"
-        },
-        "time": "2019-06-05T02:08:12+00:00",
-        "bin": [
-            "Resources/bin/var-dump-server"
-        ],
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "4.3-dev"
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "files": [
-                "Resources/functions/dump.php"
             ],
-            "psr-4": {
-                "Symfony\\Component\\VarDumper\\": ""
+            "install-path": "../topthink/think-factory"
+        },
+        {
+            "name": "topthink/think-helper",
+            "version": "v3.1.3",
+            "version_normalized": "3.1.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/top-think/think-helper.git",
+                "reference": "4d85dfd3778623bbb1de3648f1dcd0c82f4439f4"
             },
-            "exclude-from-classmap": [
-                "/Tests/"
-            ]
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Nicolas Grekas",
-                "email": "p@tchwork.com"
-            },
-            {
-                "name": "Symfony Community",
-                "homepage": "https://symfony.com/contributors"
-            }
-        ],
-        "description": "Symfony mechanism for exploring and dumping PHP variables",
-        "homepage": "https://symfony.com",
-        "keywords": [
-            "debug",
-            "dump"
-        ]
-    },
-    {
-        "name": "topthink/framework",
-        "version": "v6.0.0",
-        "version_normalized": "6.0.0.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/top-think/framework.git",
-            "reference": "79c555aab0313d1a33ddcdb3c395f2c47f37f597"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/top-think/framework/zipball/79c555aab0313d1a33ddcdb3c395f2c47f37f597",
-            "reference": "79c555aab0313d1a33ddcdb3c395f2c47f37f597",
-            "shasum": "",
-            "mirrors": [
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/top-think/think-helper/zipball/4d85dfd3778623bbb1de3648f1dcd0c82f4439f4",
+                "reference": "4d85dfd3778623bbb1de3648f1dcd0c82f4439f4",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1.0"
+            },
+            "time": "2019-09-30T02:36:48+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "think\\": "src"
+                },
+                "files": [
+                    "src/helper.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+                    "name": "yunwuxin",
+                    "email": "448901948@qq.com"
                 }
-            ]
-        },
-        "require": {
-            "ext-json": "*",
-            "ext-mbstring": "*",
-            "league/flysystem": "^1.0",
-            "league/flysystem-cached-adapter": "^1.0",
-            "opis/closure": "^3.1",
-            "php": ">=7.1.0",
-            "psr/container": "~1.0",
-            "psr/log": "~1.0",
-            "psr/simple-cache": "^1.0",
-            "topthink/think-helper": "^3.1.1",
-            "topthink/think-orm": "^2.0"
-        },
-        "require-dev": {
-            "mikey179/vfsstream": "^1.6",
-            "mockery/mockery": "^1.2",
-            "phpunit/phpunit": "^7.0"
-        },
-        "time": "2019-10-23T23:28:43+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "files": [],
-            "psr-4": {
-                "think\\": "src/think/"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "Apache-2.0"
-        ],
-        "authors": [
-            {
-                "name": "liu21st",
-                "email": "liu21st@gmail.com"
-            },
-            {
-                "name": "yunwuxin",
-                "email": "448901948@qq.com"
-            }
-        ],
-        "description": "The ThinkPHP Framework.",
-        "homepage": "http://thinkphp.cn/",
-        "keywords": [
-            "framework",
-            "orm",
-            "thinkphp"
-        ]
-    },
-    {
-        "name": "topthink/think-cache",
-        "version": "v2.0.6",
-        "version_normalized": "2.0.6.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/top-think/think-cache.git",
-            "reference": "75a56b24affc65b51688fd89ada48c102757fd74"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/top-think/think-cache/zipball/75a56b24affc65b51688fd89ada48c102757fd74",
-            "reference": "75a56b24affc65b51688fd89ada48c102757fd74",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+            ],
+            "description": "The ThinkPHP6 Helper Package",
+            "install-path": "../topthink/think-helper"
+        },
+        {
+            "name": "topthink/think-image",
+            "version": "v1.0.7",
+            "version_normalized": "1.0.7.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/top-think/think-image.git",
+                "reference": "8586cf47f117481c6d415b20f7dedf62e79d5512"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/top-think/think-image/zipball/8586cf47f117481c6d415b20f7dedf62e79d5512",
+                "reference": "8586cf47f117481c6d415b20f7dedf62e79d5512",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-gd": "*"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "4.8.*",
+                "topthink/framework": "^5.0"
+            },
+            "time": "2016-09-29T06:05:43+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "think\\": "src"
                 }
-            ]
-        },
-        "require": {
-            "opis/closure": "^3.1",
-            "php": ">=7.1.0",
-            "psr/cache": "~1.0",
-            "psr/simple-cache": "^1.0",
-            "topthink/think-container": "~2.0"
-        },
-        "time": "2019-07-07T14:34:35+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "think\\": "src"
-            },
-            "files": []
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "Apache-2.0"
-        ],
-        "authors": [
-            {
-                "name": "liu21st",
-                "email": "liu21st@gmail.com"
-            }
-        ],
-        "description": "Cache Manager"
-    },
-    {
-        "name": "topthink/think-captcha",
-        "version": "v3.0.1",
-        "version_normalized": "3.0.1.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/top-think/think-captcha.git",
-            "reference": "9fc0c627d773f6a54a8dd142ebf358f746557a48"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/top-think/think-captcha/zipball/9fc0c627d773f6a54a8dd142ebf358f746557a48",
-            "reference": "9fc0c627d773f6a54a8dd142ebf358f746557a48",
-            "shasum": "",
-            "mirrors": [
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+                    "name": "yunwuxin",
+                    "email": "448901948@qq.com"
                 }
-            ]
-        },
-        "require": {
-            "topthink/framework": "^6.0.0"
-        },
-        "time": "2019-06-06T07:16:01+00:00",
-        "type": "library",
-        "extra": {
-            "think": {
-                "services": [
-                    "think\\captcha\\CaptchaService"
-                ]
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "think\\captcha\\": "src/"
-            },
-            "files": [
-                "src/helper.php"
-            ]
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "Apache-2.0"
-        ],
-        "authors": [
-            {
-                "name": "yunwuxin",
-                "email": "448901948@qq.com"
-            }
-        ],
-        "description": "captcha package for thinkphp"
-    },
-    {
-        "name": "topthink/think-container",
-        "version": "v2.0.3",
-        "version_normalized": "2.0.3.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/top-think/think-container.git",
-            "reference": "8ae724dccc8f6241229db29ef757a22934b76800"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/top-think/think-container/zipball/8ae724dccc8f6241229db29ef757a22934b76800",
-            "reference": "8ae724dccc8f6241229db29ef757a22934b76800",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+            ],
+            "description": "The ThinkPHP5 Image Package",
+            "install-path": "../topthink/think-image"
+        },
+        {
+            "name": "topthink/think-multi-app",
+            "version": "v1.0.11",
+            "version_normalized": "1.0.11.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/top-think/think-multi-app.git",
+                "reference": "215f4a6bb88e53ad41b448c61957336eb55ce6f9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/top-think/think-multi-app/zipball/215f4a6bb88e53ad41b448c61957336eb55ce6f9",
+                "reference": "215f4a6bb88e53ad41b448c61957336eb55ce6f9",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1.0",
+                "topthink/framework": "^6.0.0"
+            },
+            "time": "2019-10-29T06:34:59+00:00",
+            "type": "library",
+            "extra": {
+                "think": {
+                    "services": [
+                        "think\\app\\Service"
+                    ]
                 }
-            ]
-        },
-        "require": {
-            "php": ">=7.1.0",
-            "psr/container": "~1.0",
-            "topthink/think-helper": "^3.1"
-        },
-        "require-dev": {
-            "phpunit/phpunit": "^7.0"
-        },
-        "time": "2019-07-10T09:09:11+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "think\\": "src"
-            },
-            "files": []
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "Apache-2.0"
-        ],
-        "authors": [
-            {
-                "name": "liu21st",
-                "email": "liu21st@gmail.com"
-            }
-        ],
-        "description": "PHP Container & Facade Manager"
-    },
-    {
-        "name": "topthink/think-factory",
-        "version": "v1.0.1",
-        "version_normalized": "1.0.1.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/top-think/think-factory.git",
-            "reference": "b8080a6472aae1cff47ceb8c30feec3c2835364b"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/top-think/think-factory/zipball/b8080a6472aae1cff47ceb8c30feec3c2835364b",
-            "reference": "b8080a6472aae1cff47ceb8c30feec3c2835364b",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "think\\app\\": "src"
                 }
-            ]
-        },
-        "require": {
-            "topthink/framework": "^6.0.0",
-            "topthink/think-helper": "^3.0.0"
-        },
-        "time": "2019-04-15T06:55:28+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "think\\": "src"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "Apache-2.0"
-        ],
-        "authors": [
-            {
-                "name": "yunwuxin",
-                "email": "448901948@qq.com"
-            }
-        ]
-    },
-    {
-        "name": "topthink/think-helper",
-        "version": "v3.1.3",
-        "version_normalized": "3.1.3.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/top-think/think-helper.git",
-            "reference": "4d85dfd3778623bbb1de3648f1dcd0c82f4439f4"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/top-think/think-helper/zipball/4d85dfd3778623bbb1de3648f1dcd0c82f4439f4",
-            "reference": "4d85dfd3778623bbb1de3648f1dcd0c82f4439f4",
-            "shasum": "",
-            "mirrors": [
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+                    "name": "liu21st",
+                    "email": "liu21st@gmail.com"
                 }
-            ]
-        },
-        "require": {
-            "php": ">=7.1.0"
-        },
-        "time": "2019-09-30T02:36:48+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "think\\": "src"
-            },
-            "files": [
-                "src/helper.php"
-            ]
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "Apache-2.0"
-        ],
-        "authors": [
-            {
-                "name": "yunwuxin",
-                "email": "448901948@qq.com"
-            }
-        ],
-        "description": "The ThinkPHP6 Helper Package"
-    },
-    {
-        "name": "topthink/think-image",
-        "version": "v1.0.7",
-        "version_normalized": "1.0.7.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/top-think/think-image.git",
-            "reference": "8586cf47f117481c6d415b20f7dedf62e79d5512"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/top-think/think-image/zipball/8586cf47f117481c6d415b20f7dedf62e79d5512",
-            "reference": "8586cf47f117481c6d415b20f7dedf62e79d5512",
-            "shasum": "",
-            "mirrors": [
+            ],
+            "description": "thinkphp6 multi app support",
+            "install-path": "../topthink/think-multi-app"
+        },
+        {
+            "name": "topthink/think-orm",
+            "version": "v2.0.27",
+            "version_normalized": "2.0.27.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/top-think/think-orm.git",
+                "reference": "02affaaccade2cdd8bbb2d2f5d15e46113e6eb50"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/top-think/think-orm/zipball/02affaaccade2cdd8bbb2d2f5d15e46113e6eb50",
+                "reference": "02affaaccade2cdd8bbb2d2f5d15e46113e6eb50",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-json": "*",
+                "php": ">=7.1.0",
+                "psr/log": "~1.0",
+                "psr/simple-cache": "^1.0",
+                "topthink/think-helper": "^3.1"
+            },
+            "time": "2019-10-23T02:16:50+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "think\\": "src"
+                },
+                "files": []
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+                    "name": "liu21st",
+                    "email": "liu21st@gmail.com"
                 }
-            ]
-        },
-        "require": {
-            "ext-gd": "*"
-        },
-        "require-dev": {
-            "phpunit/phpunit": "4.8.*",
-            "topthink/framework": "^5.0"
-        },
-        "time": "2016-09-29T06:05:43+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "think\\": "src"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "Apache-2.0"
-        ],
-        "authors": [
-            {
-                "name": "yunwuxin",
-                "email": "448901948@qq.com"
-            }
-        ],
-        "description": "The ThinkPHP5 Image Package"
-    },
-    {
-        "name": "topthink/think-log",
-        "version": "v2.0.1",
-        "version_normalized": "2.0.1.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/top-think/think-log.git",
-            "reference": "de0bf6644228b39f03239cdc03251040d34a7b07"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/top-think/think-log/zipball/de0bf6644228b39f03239cdc03251040d34a7b07",
-            "reference": "de0bf6644228b39f03239cdc03251040d34a7b07",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+            ],
+            "description": "think orm",
+            "keywords": [
+                "database",
+                "orm"
+            ],
+            "install-path": "../topthink/think-orm"
+        },
+        {
+            "name": "topthink/think-queue",
+            "version": "v3.0.2",
+            "version_normalized": "3.0.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/top-think/think-queue.git",
+                "reference": "c34b983abce9427fca7e30ac983b75041f436ad0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/top-think/think-queue/zipball/c34b983abce9427fca7e30ac983b75041f436ad0",
+                "reference": "c34b983abce9427fca7e30ac983b75041f436ad0",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "nesbot/carbon": "^2.16",
+                "symfony/process": "^4.2",
+                "topthink/framework": "^6.0.0",
+                "topthink/think-factory": "^1.0.0",
+                "topthink/think-helper": "^3.0.4"
+            },
+            "require-dev": {
+                "mockery/mockery": "^1.2",
+                "phpunit/phpunit": "^6.2",
+                "topthink/think-migration": "^3.0.0"
+            },
+            "time": "2019-06-06T10:41:07+00:00",
+            "type": "library",
+            "extra": {
+                "think": {
+                    "services": [
+                        "think\\queue\\Service"
+                    ],
+                    "config": {
+                        "queue": "src/config.php"
+                    }
                 }
-            ]
-        },
-        "require": {
-            "php": ">=7.1.0",
-            "psr/log": "~1.0",
-            "topthink/think-container": "^2.0"
-        },
-        "time": "2019-07-07T14:47:46+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "think\\": "src"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "Apache-2.0"
-        ],
-        "authors": [
-            {
-                "name": "liu21st",
-                "email": "liu21st@gmail.com"
-            }
-        ],
-        "description": "think log"
-    },
-    {
-        "name": "topthink/think-multi-app",
-        "version": "v1.0.11",
-        "version_normalized": "1.0.11.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/top-think/think-multi-app.git",
-            "reference": "215f4a6bb88e53ad41b448c61957336eb55ce6f9"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/top-think/think-multi-app/zipball/215f4a6bb88e53ad41b448c61957336eb55ce6f9",
-            "reference": "215f4a6bb88e53ad41b448c61957336eb55ce6f9",
-            "shasum": "",
-            "mirrors": [
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "think\\": "src"
+                },
+                "files": [
+                    "src/common.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+                    "name": "yunwuxin",
+                    "email": "448901948@qq.com"
                 }
-            ]
-        },
-        "require": {
-            "php": ">=7.1.0",
-            "topthink/framework": "^6.0.0"
-        },
-        "time": "2019-10-29T06:34:59+00:00",
-        "type": "library",
-        "extra": {
-            "think": {
-                "services": [
-                    "think\\app\\Service"
-                ]
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "think\\app\\": "src"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "Apache-2.0"
-        ],
-        "authors": [
-            {
-                "name": "liu21st",
-                "email": "liu21st@gmail.com"
-            }
-        ],
-        "description": "thinkphp6 multi app support"
-    },
-    {
-        "name": "topthink/think-orm",
-        "version": "v2.0.27",
-        "version_normalized": "2.0.27.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/top-think/think-orm.git",
-            "reference": "02affaaccade2cdd8bbb2d2f5d15e46113e6eb50"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/top-think/think-orm/zipball/02affaaccade2cdd8bbb2d2f5d15e46113e6eb50",
-            "reference": "02affaaccade2cdd8bbb2d2f5d15e46113e6eb50",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+            ],
+            "description": "The ThinkPHP5 Queue Package",
+            "install-path": "../topthink/think-queue"
+        },
+        {
+            "name": "topthink/think-template",
+            "version": "v2.0.7",
+            "version_normalized": "2.0.7.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/top-think/think-template.git",
+                "reference": "e98bdbb4a4c94b442f17dfceba81e0134d4fbd19"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/top-think/think-template/zipball/e98bdbb4a4c94b442f17dfceba81e0134d4fbd19",
+                "reference": "e98bdbb4a4c94b442f17dfceba81e0134d4fbd19",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1.0",
+                "psr/simple-cache": "^1.0"
+            },
+            "time": "2019-09-20T15:31:04+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "think\\": "src"
                 }
-            ]
-        },
-        "require": {
-            "ext-json": "*",
-            "php": ">=7.1.0",
-            "psr/log": "~1.0",
-            "psr/simple-cache": "^1.0",
-            "topthink/think-helper": "^3.1"
-        },
-        "time": "2019-10-23T02:16:50+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "think\\": "src"
-            },
-            "files": []
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "Apache-2.0"
-        ],
-        "authors": [
-            {
-                "name": "liu21st",
-                "email": "liu21st@gmail.com"
-            }
-        ],
-        "description": "think orm",
-        "keywords": [
-            "database",
-            "orm"
-        ]
-    },
-    {
-        "name": "topthink/think-queue",
-        "version": "v3.0.2",
-        "version_normalized": "3.0.2.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/top-think/think-queue.git",
-            "reference": "c34b983abce9427fca7e30ac983b75041f436ad0"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/top-think/think-queue/zipball/c34b983abce9427fca7e30ac983b75041f436ad0",
-            "reference": "c34b983abce9427fca7e30ac983b75041f436ad0",
-            "shasum": "",
-            "mirrors": [
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+                    "name": "liu21st",
+                    "email": "liu21st@gmail.com"
                 }
-            ]
-        },
-        "require": {
-            "nesbot/carbon": "^2.16",
-            "symfony/process": "^4.2",
-            "topthink/framework": "^6.0.0",
-            "topthink/think-factory": "^1.0.0",
-            "topthink/think-helper": "^3.0.4"
-        },
-        "require-dev": {
-            "mockery/mockery": "^1.2",
-            "phpunit/phpunit": "^6.2",
-            "topthink/think-migration": "^3.0.0"
-        },
-        "time": "2019-06-06T10:41:07+00:00",
-        "type": "library",
-        "extra": {
-            "think": {
-                "services": [
-                    "think\\queue\\Service"
-                ],
-                "config": {
-                    "queue": "src/config.php"
+            ],
+            "description": "the php template engine",
+            "install-path": "../topthink/think-template"
+        },
+        {
+            "name": "topthink/think-view",
+            "version": "v1.0.13",
+            "version_normalized": "1.0.13.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/top-think/think-view.git",
+                "reference": "90803b73f781db5d42619082c4597afc58b2d4c5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/top-think/think-view/zipball/90803b73f781db5d42619082c4597afc58b2d4c5",
+                "reference": "90803b73f781db5d42619082c4597afc58b2d4c5",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1.0",
+                "topthink/think-template": "^2.0"
+            },
+            "time": "2019-10-07T12:23:10+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "think\\view\\driver\\": "src"
                 }
-            }
-        },
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "think\\": "src"
-            },
-            "files": [
-                "src/common.php"
-            ]
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "Apache-2.0"
-        ],
-        "authors": [
-            {
-                "name": "yunwuxin",
-                "email": "448901948@qq.com"
-            }
-        ],
-        "description": "The ThinkPHP5 Queue Package"
-    },
-    {
-        "name": "topthink/think-template",
-        "version": "v2.0.7",
-        "version_normalized": "2.0.7.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/top-think/think-template.git",
-            "reference": "e98bdbb4a4c94b442f17dfceba81e0134d4fbd19"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/top-think/think-template/zipball/e98bdbb4a4c94b442f17dfceba81e0134d4fbd19",
-            "reference": "e98bdbb4a4c94b442f17dfceba81e0134d4fbd19",
-            "shasum": "",
-            "mirrors": [
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+                    "name": "liu21st",
+                    "email": "liu21st@gmail.com"
                 }
-            ]
-        },
-        "require": {
-            "php": ">=7.1.0",
-            "psr/simple-cache": "^1.0"
-        },
-        "time": "2019-09-20T15:31:04+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "think\\": "src"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "Apache-2.0"
-        ],
-        "authors": [
-            {
-                "name": "liu21st",
-                "email": "liu21st@gmail.com"
-            }
-        ],
-        "description": "the php template engine"
-    },
-    {
-        "name": "topthink/think-view",
-        "version": "v1.0.13",
-        "version_normalized": "1.0.13.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/top-think/think-view.git",
-            "reference": "90803b73f781db5d42619082c4597afc58b2d4c5"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/top-think/think-view/zipball/90803b73f781db5d42619082c4597afc58b2d4c5",
-            "reference": "90803b73f781db5d42619082c4597afc58b2d4c5",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+            ],
+            "description": "thinkphp template driver",
+            "install-path": "../topthink/think-view"
+        },
+        {
+            "name": "workerman/channel",
+            "version": "v1.0.5",
+            "version_normalized": "1.0.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/walkor/Channel.git",
+                "reference": "0836a9a413c6e8425ee36307d95e2e49cc380f50"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/walkor/Channel/zipball/0836a9a413c6e8425ee36307d95e2e49cc380f50",
+                "reference": "0836a9a413c6e8425ee36307d95e2e49cc380f50",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "workerman/workerman": ">=3.3.0"
+            },
+            "time": "2018-07-02T02:42:37+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Channel\\": "./src"
                 }
-            ]
-        },
-        "require": {
-            "php": ">=7.1.0",
-            "topthink/think-template": "^2.0"
-        },
-        "time": "2019-10-07T12:23:10+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "think\\view\\driver\\": "src"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "Apache-2.0"
-        ],
-        "authors": [
-            {
-                "name": "liu21st",
-                "email": "liu21st@gmail.com"
-            }
-        ],
-        "description": "thinkphp template driver"
-    },
-    {
-        "name": "workerman/channel",
-        "version": "v1.0.5",
-        "version_normalized": "1.0.5.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/walkor/Channel.git",
-            "reference": "0836a9a413c6e8425ee36307d95e2e49cc380f50"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/walkor/Channel/zipball/0836a9a413c6e8425ee36307d95e2e49cc380f50",
-            "reference": "0836a9a413c6e8425ee36307d95e2e49cc380f50",
-            "shasum": "",
-            "mirrors": [
-                {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "homepage": "http://www.workerman.net",
+            "install-path": "../workerman/channel"
+        },
+        {
+            "name": "workerman/workerman",
+            "version": "v3.5.19",
+            "version_normalized": "3.5.19.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/walkor/Workerman.git",
+                "reference": "4e5c24073b431fd950287efbfb5cc9b4c0fc7367"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/walkor/Workerman/zipball/4e5c24073b431fd950287efbfb5cc9b4c0fc7367",
+                "reference": "4e5c24073b431fd950287efbfb5cc9b4c0fc7367",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3"
+            },
+            "suggest": {
+                "ext-event": "For better performance. "
+            },
+            "time": "2019-04-05T10:35:31+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Workerman\\": "./"
                 }
-            ]
-        },
-        "require": {
-            "workerman/workerman": ">=3.3.0"
-        },
-        "time": "2018-07-02T02:42:37+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Channel\\": "./src"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "homepage": "http://www.workerman.net"
-    },
-    {
-        "name": "workerman/workerman",
-        "version": "v3.5.19",
-        "version_normalized": "3.5.19.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/walkor/Workerman.git",
-            "reference": "4e5c24073b431fd950287efbfb5cc9b4c0fc7367"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/walkor/Workerman/zipball/4e5c24073b431fd950287efbfb5cc9b4c0fc7367",
-            "reference": "4e5c24073b431fd950287efbfb5cc9b4c0fc7367",
-            "shasum": "",
-            "mirrors": [
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+                    "name": "walkor",
+                    "email": "walkor@workerman.net",
+                    "homepage": "http://www.workerman.net",
+                    "role": "Developer"
                 }
-            ]
-        },
-        "require": {
-            "php": ">=5.3"
-        },
-        "suggest": {
-            "ext-event": "For better performance. "
-        },
-        "time": "2019-04-05T10:35:31+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Workerman\\": "./"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "walkor",
-                "email": "walkor@workerman.net",
-                "homepage": "http://www.workerman.net",
-                "role": "Developer"
-            }
-        ],
-        "description": "An asynchronous event driven PHP framework for easily building fast, scalable network applications.",
-        "homepage": "http://www.workerman.net",
-        "keywords": [
-            "asynchronous",
-            "event-loop"
-        ]
-    },
-    {
-        "name": "xaboy/form-builder",
-        "version": "1.2.10",
-        "version_normalized": "1.2.10.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/xaboy/form-builder.git",
-            "reference": "198c5f066499eef8b005f5d504fcb6120fa3ac04"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/xaboy/form-builder/zipball/198c5f066499eef8b005f5d504fcb6120fa3ac04",
-            "reference": "198c5f066499eef8b005f5d504fcb6120fa3ac04",
-            "shasum": "",
-            "mirrors": [
+            ],
+            "description": "An asynchronous event driven PHP framework for easily building fast, scalable network applications.",
+            "homepage": "http://www.workerman.net",
+            "keywords": [
+                "asynchronous",
+                "event-loop"
+            ],
+            "install-path": "../workerman/workerman"
+        },
+        {
+            "name": "xaboy/form-builder",
+            "version": "1.2.10",
+            "version_normalized": "1.2.10.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/xaboy/form-builder.git",
+                "reference": "198c5f066499eef8b005f5d504fcb6120fa3ac04"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/xaboy/form-builder/zipball/198c5f066499eef8b005f5d504fcb6120fa3ac04",
+                "reference": "198c5f066499eef8b005f5d504fcb6120fa3ac04",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-json": "*",
+                "php": ">=5.4.0"
+            },
+            "time": "2019-08-26T09:34:17+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "FormBuilder\\": "./src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
                 {
-                    "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
-                    "preferred": true
+                    "name": "xaboy",
+                    "email": "xaboy2005@qq.com"
                 }
-            ]
-        },
-        "require": {
-            "ext-json": "*",
-            "php": ">=5.4.0"
-        },
-        "time": "2019-08-26T09:34:17+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "FormBuilder\\": "./src/"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "xaboy",
-                "email": "xaboy2005@qq.com"
-            }
-        ],
-        "description": "PHP表单生成器,快速生成现代化的form表单。包含复选框、单选框、输入框、下拉选择框等元素以及,省市区三级联动,时间选择,日期选择,颜色选择,文件/图片上传等功能。",
-        "homepage": "https://github.com/xaboy/form-builder"
-    }
-]
+            ],
+            "description": "PHP表单生成器,快速生成现代化的form表单。包含复选框、单选框、输入框、下拉选择框等元素以及,省市区三级联动,时间选择,日期选择,颜色选择,文件/图片上传等功能。",
+            "homepage": "https://github.com/xaboy/form-builder",
+            "install-path": "../xaboy/form-builder"
+        }
+    ],
+    "dev": true,
+    "dev-package-names": []
+}

+ 632 - 0
vendor/composer/installed.php

@@ -0,0 +1,632 @@
+<?php return array(
+    'root' => array(
+        'pretty_version' => 'dev-master',
+        'version' => 'dev-master',
+        'type' => 'project',
+        'install_path' => __DIR__ . '/../../',
+        'aliases' => array(),
+        'reference' => '1c8d660cef04cf2dd29a8dd4c424ab21a3f86b58',
+        'name' => 'topthink/think',
+        'dev' => true,
+    ),
+    'versions' => array(
+        'aliyuncs/oss-sdk-php' => array(
+            'pretty_version' => 'v2.3.0',
+            'version' => '2.3.0.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../aliyuncs/oss-sdk-php',
+            'aliases' => array(),
+            'reference' => 'e69f57916678458642ac9d2fd341ae78a56996c8',
+            'dev_requirement' => false,
+        ),
+        'dh2y/think-qrcode' => array(
+            'pretty_version' => '2.0',
+            'version' => '2.0.0.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../dh2y/think-qrcode',
+            'aliases' => array(),
+            'reference' => '977d032afa27b1852f5fc5441fad2497f6db7ff5',
+            'dev_requirement' => false,
+        ),
+        'doctrine/cache' => array(
+            'pretty_version' => 'v1.4.4',
+            'version' => '1.4.4.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../doctrine/cache',
+            'aliases' => array(),
+            'reference' => '6433826dd02c9e5be8a127320dc13e7e6625d020',
+            'dev_requirement' => false,
+        ),
+        'firebase/php-jwt' => array(
+            'pretty_version' => 'v5.0.0',
+            'version' => '5.0.0.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../firebase/php-jwt',
+            'aliases' => array(),
+            'reference' => '9984a4d3a32ae7673d6971ea00bae9d0a1abba0e',
+            'dev_requirement' => false,
+        ),
+        'guzzle/batch' => array(
+            'dev_requirement' => false,
+            'replaced' => array(
+                0 => 'v3.9.3',
+            ),
+        ),
+        'guzzle/cache' => array(
+            'dev_requirement' => false,
+            'replaced' => array(
+                0 => 'v3.9.3',
+            ),
+        ),
+        'guzzle/common' => array(
+            'dev_requirement' => false,
+            'replaced' => array(
+                0 => 'v3.9.3',
+            ),
+        ),
+        'guzzle/guzzle' => array(
+            'pretty_version' => 'v3.9.3',
+            'version' => '3.9.3.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../guzzle/guzzle',
+            'aliases' => array(),
+            'reference' => '0645b70d953bc1c067bbc8d5bc53194706b628d9',
+            'dev_requirement' => false,
+        ),
+        'guzzle/http' => array(
+            'dev_requirement' => false,
+            'replaced' => array(
+                0 => 'v3.9.3',
+            ),
+        ),
+        'guzzle/inflection' => array(
+            'dev_requirement' => false,
+            'replaced' => array(
+                0 => 'v3.9.3',
+            ),
+        ),
+        'guzzle/iterator' => array(
+            'dev_requirement' => false,
+            'replaced' => array(
+                0 => 'v3.9.3',
+            ),
+        ),
+        'guzzle/log' => array(
+            'dev_requirement' => false,
+            'replaced' => array(
+                0 => 'v3.9.3',
+            ),
+        ),
+        'guzzle/parser' => array(
+            'dev_requirement' => false,
+            'replaced' => array(
+                0 => 'v3.9.3',
+            ),
+        ),
+        'guzzle/plugin' => array(
+            'dev_requirement' => false,
+            'replaced' => array(
+                0 => 'v3.9.3',
+            ),
+        ),
+        'guzzle/plugin-async' => array(
+            'dev_requirement' => false,
+            'replaced' => array(
+                0 => 'v3.9.3',
+            ),
+        ),
+        'guzzle/plugin-backoff' => array(
+            'dev_requirement' => false,
+            'replaced' => array(
+                0 => 'v3.9.3',
+            ),
+        ),
+        'guzzle/plugin-cache' => array(
+            'dev_requirement' => false,
+            'replaced' => array(
+                0 => 'v3.9.3',
+            ),
+        ),
+        'guzzle/plugin-cookie' => array(
+            'dev_requirement' => false,
+            'replaced' => array(
+                0 => 'v3.9.3',
+            ),
+        ),
+        'guzzle/plugin-curlauth' => array(
+            'dev_requirement' => false,
+            'replaced' => array(
+                0 => 'v3.9.3',
+            ),
+        ),
+        'guzzle/plugin-error-response' => array(
+            'dev_requirement' => false,
+            'replaced' => array(
+                0 => 'v3.9.3',
+            ),
+        ),
+        'guzzle/plugin-history' => array(
+            'dev_requirement' => false,
+            'replaced' => array(
+                0 => 'v3.9.3',
+            ),
+        ),
+        'guzzle/plugin-log' => array(
+            'dev_requirement' => false,
+            'replaced' => array(
+                0 => 'v3.9.3',
+            ),
+        ),
+        'guzzle/plugin-md5' => array(
+            'dev_requirement' => false,
+            'replaced' => array(
+                0 => 'v3.9.3',
+            ),
+        ),
+        'guzzle/plugin-mock' => array(
+            'dev_requirement' => false,
+            'replaced' => array(
+                0 => 'v3.9.3',
+            ),
+        ),
+        'guzzle/plugin-oauth' => array(
+            'dev_requirement' => false,
+            'replaced' => array(
+                0 => 'v3.9.3',
+            ),
+        ),
+        'guzzle/service' => array(
+            'dev_requirement' => false,
+            'replaced' => array(
+                0 => 'v3.9.3',
+            ),
+        ),
+        'guzzle/stream' => array(
+            'dev_requirement' => false,
+            'replaced' => array(
+                0 => 'v3.9.3',
+            ),
+        ),
+        'guzzlehttp/guzzle' => array(
+            'pretty_version' => '6.3.3',
+            'version' => '6.3.3.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../guzzlehttp/guzzle',
+            'aliases' => array(),
+            'reference' => '407b0cb880ace85c9b63c5f9551db498cb2d50ba',
+            'dev_requirement' => false,
+        ),
+        'guzzlehttp/promises' => array(
+            'pretty_version' => 'v1.3.1',
+            'version' => '1.3.1.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../guzzlehttp/promises',
+            'aliases' => array(),
+            'reference' => 'a59da6cf61d80060647ff4d3eb2c03a2bc694646',
+            'dev_requirement' => false,
+        ),
+        'guzzlehttp/psr7' => array(
+            'pretty_version' => '1.5.2',
+            'version' => '1.5.2.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../guzzlehttp/psr7',
+            'aliases' => array(),
+            'reference' => '9f83dded91781a01c63574e387eaa769be769115',
+            'dev_requirement' => false,
+        ),
+        'jialeo/payment' => array(
+            'pretty_version' => '0.16',
+            'version' => '0.16.0.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../jialeo/payment',
+            'aliases' => array(),
+            'reference' => '28e5db40f8ab409f1b0f13c1588d29a004246d07',
+            'dev_requirement' => false,
+        ),
+        'league/flysystem' => array(
+            'pretty_version' => '1.0.57',
+            'version' => '1.0.57.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../league/flysystem',
+            'aliases' => array(),
+            'reference' => '0e9db7f0b96b9f12dcf6f65bc34b72b1a30ea55a',
+            'dev_requirement' => false,
+        ),
+        'league/flysystem-cached-adapter' => array(
+            'pretty_version' => '1.0.9',
+            'version' => '1.0.9.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../league/flysystem-cached-adapter',
+            'aliases' => array(),
+            'reference' => '08ef74e9be88100807a3b92cc9048a312bf01d6f',
+            'dev_requirement' => false,
+        ),
+        'monolog/monolog' => array(
+            'pretty_version' => '1.24.0',
+            'version' => '1.24.0.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../monolog/monolog',
+            'aliases' => array(),
+            'reference' => 'bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266',
+            'dev_requirement' => false,
+        ),
+        'nesbot/carbon' => array(
+            'pretty_version' => '2.20.0',
+            'version' => '2.20.0.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../nesbot/carbon',
+            'aliases' => array(),
+            'reference' => 'bc671b896c276795fad8426b0aa24e8ade0f2498',
+            'dev_requirement' => false,
+        ),
+        'opis/closure' => array(
+            'pretty_version' => '3.4.1',
+            'version' => '3.4.1.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../opis/closure',
+            'aliases' => array(),
+            'reference' => 'e79f851749c3caa836d7ccc01ede5828feb762c7',
+            'dev_requirement' => false,
+        ),
+        'overtrue/socialite' => array(
+            'pretty_version' => '1.3.0',
+            'version' => '1.3.0.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../overtrue/socialite',
+            'aliases' => array(),
+            'reference' => 'fda55f0acef43a144799b1957a8f93d9f5deffce',
+            'dev_requirement' => false,
+        ),
+        'overtrue/wechat' => array(
+            'pretty_version' => '3.3.33',
+            'version' => '3.3.33.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../overtrue/wechat',
+            'aliases' => array(),
+            'reference' => '78e5476df330754040d1c400d0bca640d5b77cb7',
+            'dev_requirement' => false,
+        ),
+        'paragonie/random_compat' => array(
+            'pretty_version' => 'v9.99.99',
+            'version' => '9.99.99.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../paragonie/random_compat',
+            'aliases' => array(),
+            'reference' => '84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95',
+            'dev_requirement' => false,
+        ),
+        'phpoffice/phpexcel' => array(
+            'pretty_version' => '1.8.2',
+            'version' => '1.8.2.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../phpoffice/phpexcel',
+            'aliases' => array(),
+            'reference' => '1441011fb7ecdd8cc689878f54f8b58a6805f870',
+            'dev_requirement' => false,
+        ),
+        'pimple/pimple' => array(
+            'pretty_version' => 'v3.2.3',
+            'version' => '3.2.3.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../pimple/pimple',
+            'aliases' => array(),
+            'reference' => '9e403941ef9d65d20cba7d54e29fe906db42cf32',
+            'dev_requirement' => false,
+        ),
+        'psr/cache' => array(
+            'pretty_version' => '1.0.1',
+            'version' => '1.0.1.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../psr/cache',
+            'aliases' => array(),
+            'reference' => 'd11b50ad223250cf17b86e38383413f5a6764bf8',
+            'dev_requirement' => false,
+        ),
+        'psr/container' => array(
+            'pretty_version' => '1.0.0',
+            'version' => '1.0.0.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../psr/container',
+            'aliases' => array(),
+            'reference' => 'b7ce3b176482dbbc1245ebf52b181af44c2cf55f',
+            'dev_requirement' => false,
+        ),
+        'psr/http-message' => array(
+            'pretty_version' => '1.0.1',
+            'version' => '1.0.1.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../psr/http-message',
+            'aliases' => array(),
+            'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363',
+            'dev_requirement' => false,
+        ),
+        'psr/http-message-implementation' => array(
+            'dev_requirement' => false,
+            'provided' => array(
+                0 => '1.0',
+            ),
+        ),
+        'psr/log' => array(
+            'pretty_version' => '1.1.2',
+            'version' => '1.1.2.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../psr/log',
+            'aliases' => array(),
+            'reference' => '446d54b4cb6bf489fc9d75f55843658e6f25d801',
+            'dev_requirement' => false,
+        ),
+        'psr/log-implementation' => array(
+            'dev_requirement' => false,
+            'provided' => array(
+                0 => '1.0.0',
+            ),
+        ),
+        'psr/simple-cache' => array(
+            'pretty_version' => '1.0.1',
+            'version' => '1.0.1.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../psr/simple-cache',
+            'aliases' => array(),
+            'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b',
+            'dev_requirement' => false,
+        ),
+        'qcloud/cos-sdk-v5' => array(
+            'pretty_version' => 'v1.3.3',
+            'version' => '1.3.3.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../qcloud/cos-sdk-v5',
+            'aliases' => array(),
+            'reference' => 'cd1b9cefa04521eaf125a82eb53552d9a87aae4d',
+            'dev_requirement' => false,
+        ),
+        'qiniu/php-sdk' => array(
+            'pretty_version' => 'v7.2.9',
+            'version' => '7.2.9.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../qiniu/php-sdk',
+            'aliases' => array(),
+            'reference' => 'afe7d8715d8a688b1d8d8cdf031240d2363dad90',
+            'dev_requirement' => false,
+        ),
+        'ralouphie/getallheaders' => array(
+            'pretty_version' => '2.0.5',
+            'version' => '2.0.5.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../ralouphie/getallheaders',
+            'aliases' => array(),
+            'reference' => '5601c8a83fbba7ef674a7369456d12f1e0d0eafa',
+            'dev_requirement' => false,
+        ),
+        'spatie/macroable' => array(
+            'pretty_version' => '1.0.0',
+            'version' => '1.0.0.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../spatie/macroable',
+            'aliases' => array(),
+            'reference' => '74b0d189ce75142f1706aad834d5a428dfc7c3c3',
+            'dev_requirement' => false,
+        ),
+        'symfony/event-dispatcher' => array(
+            'pretty_version' => 'v2.8.50',
+            'version' => '2.8.50.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../symfony/event-dispatcher',
+            'aliases' => array(),
+            'reference' => 'a77e974a5fecb4398833b0709210e3d5e334ffb0',
+            'dev_requirement' => false,
+        ),
+        'symfony/http-foundation' => array(
+            'pretty_version' => 'v3.4.28',
+            'version' => '3.4.28.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../symfony/http-foundation',
+            'aliases' => array(),
+            'reference' => '677ae5e892b081e71a665bfa7dd90fe61800c00e',
+            'dev_requirement' => false,
+        ),
+        'symfony/polyfill-mbstring' => array(
+            'pretty_version' => 'v1.11.0',
+            'version' => '1.11.0.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../symfony/polyfill-mbstring',
+            'aliases' => array(),
+            'reference' => 'fe5e94c604826c35a32fa832f35bd036b6799609',
+            'dev_requirement' => false,
+        ),
+        'symfony/polyfill-php70' => array(
+            'pretty_version' => 'v1.11.0',
+            'version' => '1.11.0.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../symfony/polyfill-php70',
+            'aliases' => array(),
+            'reference' => 'bc4858fb611bda58719124ca079baff854149c89',
+            'dev_requirement' => false,
+        ),
+        'symfony/polyfill-php72' => array(
+            'pretty_version' => 'v1.11.0',
+            'version' => '1.11.0.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../symfony/polyfill-php72',
+            'aliases' => array(),
+            'reference' => 'ab50dcf166d5f577978419edd37aa2bb8eabce0c',
+            'dev_requirement' => false,
+        ),
+        'symfony/process' => array(
+            'pretty_version' => 'v4.3.2',
+            'version' => '4.3.2.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../symfony/process',
+            'aliases' => array(),
+            'reference' => '856d35814cf287480465bb7a6c413bb7f5f5e69c',
+            'dev_requirement' => false,
+        ),
+        'symfony/psr-http-message-bridge' => array(
+            'pretty_version' => 'v1.2.0',
+            'version' => '1.2.0.0',
+            'type' => 'symfony-bridge',
+            'install_path' => __DIR__ . '/../symfony/psr-http-message-bridge',
+            'aliases' => array(),
+            'reference' => '9ab9d71f97d5c7d35a121a7fb69f74fee95cd0ad',
+            'dev_requirement' => false,
+        ),
+        'symfony/translation' => array(
+            'pretty_version' => 'v4.3.2',
+            'version' => '4.3.2.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../symfony/translation',
+            'aliases' => array(),
+            'reference' => '934ab1d18545149e012aa898cf02e9f23790f7a0',
+            'dev_requirement' => false,
+        ),
+        'symfony/translation-contracts' => array(
+            'pretty_version' => 'v1.1.5',
+            'version' => '1.1.5.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../symfony/translation-contracts',
+            'aliases' => array(),
+            'reference' => 'cb4b18ad7b92a26e83b65dde940fab78339e6f3c',
+            'dev_requirement' => false,
+        ),
+        'symfony/translation-implementation' => array(
+            'dev_requirement' => false,
+            'provided' => array(
+                0 => '1.0',
+            ),
+        ),
+        'symfony/var-dumper' => array(
+            'pretty_version' => 'v4.3.1',
+            'version' => '4.3.1.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../symfony/var-dumper',
+            'aliases' => array(),
+            'reference' => 'f974f448154928d2b5fb7c412bd23b81d063f34b',
+            'dev_requirement' => false,
+        ),
+        'topthink/framework' => array(
+            'pretty_version' => 'v6.0.0',
+            'version' => '6.0.0.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../topthink/framework',
+            'aliases' => array(),
+            'reference' => '79c555aab0313d1a33ddcdb3c395f2c47f37f597',
+            'dev_requirement' => false,
+        ),
+        'topthink/think' => array(
+            'pretty_version' => 'dev-master',
+            'version' => 'dev-master',
+            'type' => 'project',
+            'install_path' => __DIR__ . '/../../',
+            'aliases' => array(),
+            'reference' => '1c8d660cef04cf2dd29a8dd4c424ab21a3f86b58',
+            'dev_requirement' => false,
+        ),
+        'topthink/think-captcha' => array(
+            'pretty_version' => 'v3.0.1',
+            'version' => '3.0.1.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../topthink/think-captcha',
+            'aliases' => array(),
+            'reference' => '9fc0c627d773f6a54a8dd142ebf358f746557a48',
+            'dev_requirement' => false,
+        ),
+        'topthink/think-factory' => array(
+            'pretty_version' => 'v1.0.1',
+            'version' => '1.0.1.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../topthink/think-factory',
+            'aliases' => array(),
+            'reference' => 'b8080a6472aae1cff47ceb8c30feec3c2835364b',
+            'dev_requirement' => false,
+        ),
+        'topthink/think-helper' => array(
+            'pretty_version' => 'v3.1.3',
+            'version' => '3.1.3.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../topthink/think-helper',
+            'aliases' => array(),
+            'reference' => '4d85dfd3778623bbb1de3648f1dcd0c82f4439f4',
+            'dev_requirement' => false,
+        ),
+        'topthink/think-image' => array(
+            'pretty_version' => 'v1.0.7',
+            'version' => '1.0.7.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../topthink/think-image',
+            'aliases' => array(),
+            'reference' => '8586cf47f117481c6d415b20f7dedf62e79d5512',
+            'dev_requirement' => false,
+        ),
+        'topthink/think-multi-app' => array(
+            'pretty_version' => 'v1.0.11',
+            'version' => '1.0.11.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../topthink/think-multi-app',
+            'aliases' => array(),
+            'reference' => '215f4a6bb88e53ad41b448c61957336eb55ce6f9',
+            'dev_requirement' => false,
+        ),
+        'topthink/think-orm' => array(
+            'pretty_version' => 'v2.0.27',
+            'version' => '2.0.27.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../topthink/think-orm',
+            'aliases' => array(),
+            'reference' => '02affaaccade2cdd8bbb2d2f5d15e46113e6eb50',
+            'dev_requirement' => false,
+        ),
+        'topthink/think-queue' => array(
+            'pretty_version' => 'v3.0.2',
+            'version' => '3.0.2.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../topthink/think-queue',
+            'aliases' => array(),
+            'reference' => 'c34b983abce9427fca7e30ac983b75041f436ad0',
+            'dev_requirement' => false,
+        ),
+        'topthink/think-template' => array(
+            'pretty_version' => 'v2.0.7',
+            'version' => '2.0.7.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../topthink/think-template',
+            'aliases' => array(),
+            'reference' => 'e98bdbb4a4c94b442f17dfceba81e0134d4fbd19',
+            'dev_requirement' => false,
+        ),
+        'topthink/think-view' => array(
+            'pretty_version' => 'v1.0.13',
+            'version' => '1.0.13.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../topthink/think-view',
+            'aliases' => array(),
+            'reference' => '90803b73f781db5d42619082c4597afc58b2d4c5',
+            'dev_requirement' => false,
+        ),
+        'workerman/channel' => array(
+            'pretty_version' => 'v1.0.5',
+            'version' => '1.0.5.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../workerman/channel',
+            'aliases' => array(),
+            'reference' => '0836a9a413c6e8425ee36307d95e2e49cc380f50',
+            'dev_requirement' => false,
+        ),
+        'workerman/workerman' => array(
+            'pretty_version' => 'v3.5.19',
+            'version' => '3.5.19.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../workerman/workerman',
+            'aliases' => array(),
+            'reference' => '4e5c24073b431fd950287efbfb5cc9b4c0fc7367',
+            'dev_requirement' => false,
+        ),
+        'xaboy/form-builder' => array(
+            'pretty_version' => '1.2.10',
+            'version' => '1.2.10.0',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../xaboy/form-builder',
+            'aliases' => array(),
+            'reference' => '198c5f066499eef8b005f5d504fcb6120fa3ac04',
+            'dev_requirement' => false,
+        ),
+    ),
+);

+ 26 - 0
vendor/composer/platform_check.php

@@ -0,0 +1,26 @@
+<?php
+
+// platform_check.php @generated by Composer
+
+$issues = array();
+
+if (!(PHP_VERSION_ID >= 70108)) {
+    $issues[] = 'Your Composer dependencies require a PHP version ">= 7.1.8". You are running ' . PHP_VERSION . '.';
+}
+
+if ($issues) {
+    if (!headers_sent()) {
+        header('HTTP/1.1 500 Internal Server Error');
+    }
+    if (!ini_get('display_errors')) {
+        if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
+            fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);
+        } elseif (!headers_sent()) {
+            echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
+        }
+    }
+    trigger_error(
+        'Composer detected issues in your platform: ' . implode(' ', $issues),
+        E_USER_ERROR
+    );
+}

+ 2 - 0
vendor/jialeo/payment/.gitignore

@@ -0,0 +1,2 @@
+.idea
+.DS_Store

+ 69 - 0
vendor/jialeo/payment/README.md

@@ -0,0 +1,69 @@
+## 环境要求
+
+* PHP >= 5.6
+
+## 当前支持的接口
+
+### 支付宝接口
+
+* 即时到账(wap,web,app)
+* 交易退款接口
+* 单笔转账到支付宝
+
+### 微信接口
+
+* 公众号支付
+* APP支付
+* H5支付
+* 扫码支付
+* 企业付款到零钱
+* 企业付款到银行卡
+* 交易退款接口
+* 公众号现金红包
+
+### 银联
+
+* 即时到账(wap,web,app)
+* 交易退款接口
+
+### Paypal
+
+* APP,网关支付
+* 退款
+* MassPay(多人转账)
+
+### 苹果
+
+* 内购支付
+
+
+## 文档
+
+*  [支付宝](doc/Alipay.md)
+*  [微信支付](doc/Wechatpay.md)
+*  [苹果支付](doc/Applepay.md)
+*  银联支付  (拖延症中...等待够100star再写)
+*  Paypal	  (拖延症中...等待够100star再写)
+
+## 安装使用
+
+* 通过composer(推荐)
+
+	```
+	composer require "jialeo/payment"
+	```
+    
+* composer.json
+
+	```
+	"require": {
+        "jialeo/payment": "0.*"
+    }
+	```
+    
+	然后运行
+
+	```
+	composer update jialeo/payment
+	```
+

+ 20 - 0
vendor/jialeo/payment/composer.json

@@ -0,0 +1,20 @@
+{
+    "name": "jialeo/payment",
+    "description": "Alipay,Unicompay",
+    "keywords": ["Alipay", "Unicompay"],
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Liang",
+            "email": "chenjialiang@han-zi.cn"
+        }
+    ],
+    "require": {
+        "php": ">=5.6.4"
+    },
+    "autoload": {
+        "psr-4": {
+            "JiaLeo\\Payment\\": "src/"
+        }
+    }
+}

+ 143 - 0
vendor/jialeo/payment/doc/Alipay.md

@@ -0,0 +1,143 @@
+# Alipay 支付宝
+
+## 配置
+
+```php
+
+$config = array(
+	 //支付宝分配给开发者的应用ID
+	'app_id' => '',
+	
+	//签名方式,现在只支持RSA2
+	'sign_type' => 'RSA2',
+	
+	//支付宝公钥(证书路径或key,请填写绝对路径)
+	'ali_public_key' => '/your/path/cert/alipay/alipay_rsa_public_key.pem',
+	
+	//用户应用私钥(证书路径或key,请填写绝对路径)
+	'rsa_private_key' => '/your/path/cert/alipay/alipay_rsa_private_key.pem',
+
+  //应用公钥证书(使用公钥证书的时候需要填写,填写绝对路径)
+  'app_cert_path' => '/your/path/cert/alipay/alipay_app_public_key.cert',
+
+  //支付宝根证书(使用公钥证书的时候需要填写,填写绝对路径)
+  'alipay_root_cert_path' => '/your/path/cert/alipay/alipay_root_cert.cert'
+
+);
+
+```
+
+
+## 即时到账接口
+
+1. 判断设备选择实例化
+
+	Web网页
+	
+	```php
+	$alipay = new \JiaLeo\Payment\Alipay\WebPay($config);
+	```
+	
+	Wap(手机网页)
+	
+	```php
+	$alipay = new \JiaLeo\Payment\Alipay\WapPay($config);
+	```
+	
+	App
+	
+	```php
+	$alipay = new \JiaLeo\Payment\Alipay\AppPay($config);
+	```
+
+2. 设置支付参数
+
+	代码示例:
+	
+	```php
+	$pay_data = array(
+	    'body' => $data['body'], //内容
+	    'subject' => $data['subject'], //标题
+	    'out_trade_no' => $out_trade_no, //商户订单号
+	    'timeout_express' => '30m', //取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天
+	    'total_amount' => $data['amount'], //支付价格(单位:分)
+	    'passback_params' => $alipay->setPassbackParams($return_params), //额外字段,回调时
+	    'notify_url' => 'http://domain/api/alipay/notifies', //后台回调地址
+	    'return_url' => 'http://domain/api/alipay/success' //支付成功后跳转的地址
+	);
+	
+	```
+
+3. 调用执行函数
+
+	代码示例:
+	
+	```php
+	$url = $alipay->handle($pay_data);
+	
+	if ($data['device'] == 'app') {
+	    return $url;
+	} else {
+	    return redirect($url);
+	}
+	```
+
+4. 处理支付宝回调
+
+	```php
+	$alipay = new \JiaLeo\Payment\Alipay\Notify($config);
+	
+	try {
+	    //验签
+	    $data = $alipay->handle();
+	}
+	catch (\Exception $e) {
+	    $error_msg = $e->getMessage();
+	    $alipay->returnFailure();
+	}
+	```
+
+#### 退款
+
+示例代码:
+
+```php
+try{
+$refund_data = [
+'out_request_no' => $out_refund_no, //退款订单号
+'refund_amount' => $refund_amount, //退款金额,(单位:分)
+'out_trade_no' => $out_trade_no, //订单号
+];
+$res = $alipay_refund->handle($refund_data);
+
+} catch (\Exception $e) {
+throw new ApiException($e->getMessage());
+}
+```
+
+#### 转账到支付宝余额
+
+示例代码:
+
+```php
+$alipay = new \JiaLeo\Payment\Alipay\Transfer($config);
+
+$out_biz_no = date('YmdHis') . rand(10000, 99999);
+
+$payData = [
+	'out_biz_no' => $out_biz_no, //订单支付时传入的商户订单号,不能和 trade_no同时为空。
+	//'out_trade_no' => '149629776262420', //支付宝交易号,和商户订单号不能同时为空
+	'amount' => $res->amount, //退款金额,单位:分
+	'payee_account' => $res->alipay_account, //标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传。
+	'remark' => '用户提现'
+];
+
+try {
+	$body = $alipay->handle($payData);
+} catch (\Exception $e) {
+	$error_msg = $e->getMessage();
+	throw new ApiException($error_msg);
+}
+
+
+```

+ 26 - 0
vendor/jialeo/payment/doc/Applepay.md

@@ -0,0 +1,26 @@
+# Applypay 苹果支付
+
+
+## IAP 内购支付验证
+
+
+1. 实例化
+
+
+```
+$apple_pay = new \JiaLeo\Payment\Applepay\IAP();
+```
+
+```
+$receipt = $_POST['receipt'];		//支付凭证
+$sanbox = true;		//是否沙盒模式
+
+//验签
+$data = $apple_pay->checkPay($receipt, sanbox);
+
+if ($data['status'] != 0) {
+    throw new Exception('购买状态错误!');
+}
+
+var_dump($data);
+```

+ 263 - 0
vendor/jialeo/payment/doc/Wechatpay.md

@@ -0,0 +1,263 @@
+# Wechatpay 微信支付
+
+## 配置
+
+```php
+$config = array(
+    'appid' => '',			//填写高级调用功能的app id
+    'appsecret' => '', 		//填写高级调用功能的app secret
+    'mchid' => '',			//商户id
+    'key' => '', 			//填写你设定的key
+    'sslcert_path' => '/your/path/cert/wechatpay/apiclient_cert.pem'
+    'sslkey_path' => '/your/path/cert/wechatpay/apiclient_key.pem',
+    'transfer_rsa_public_path' => '/your/path/cert/wechatpay/rsa_public.pem',	//企业转账到银行卡rsa公钥证书文件路径
+);
+```
+
+## 即时到账接口
+
+
+1. 判断设备选择实例化的
+
+公众号
+
+```php
+$wechatpay = new \JiaLeo\Payment\Wechatpay\MpPay($config);  
+```
+
+App
+
+```php
+$wechatpay = new \JiaLeo\Payment\ Wechatpay\AppPay($config);
+```
+
+H5
+
+```php
+$wechatpay = new \JiaLeo\Payment\ Wechatpay\H5Pay($config);
+```
+
+Native
+
+```
+$wechatpay = new \JiaLeo\Payment\ Wechatpay\NativePay($config);
+```
+
+
+
+示例代码:
+
+```php
+if ($data['device'] == 'mp') {
+	$wechatpay = new \JiaLeo\Payment\Wechatpay\MpPay($config);
+} elseif ($data['device'] == 'app') {
+	$wechatpay = new \JiaLeo\Payment\Wechatpay\AppPay($config);
+}
+elseif($data['device'] == 'h5'){
+	$wechatpay = new \JiaLeo\Payment\Wechatpay\H5Pay($config);
+}
+elseif ($data['device'] == 'native') {
+    $wechatpay = new \JiaLeo\Payment\Wechatpay\NativePay($config);
+}
+
+$out_trade_no = date('YmdHis') . rand(10000, 99999);
+
+$pay_data = [
+	'body' => $data['body'], //内容
+	'attach' => $wechatpay->setPassbackParams($return_params), //商家数据包
+	'out_trade_no' => $out_trade_no, //商户订单号
+	'total_fee' => $data['amount'], //支付价格(单位:分)
+	'openid' => $openid,
+	'notify_url' => 'http://domain/api/wechatpay/notifies/' . $data['device'] //后台回调地址
+];
+
+$url = $wechatpay->handle($pay_data);
+```
+
+MpPay和AppPay返回的url为微信的签名,只要直接给到客户端给可以了。
+
+
+H5Pay为微信返回的url,需要额外重定向和指定支付完成后的跳转地址:
+
+NativePay返回的是一个微信支付url,使用第三方库直接转换成二维码即可
+
+### 支付回调处理
+
+示例代码:
+
+```php
+$wechatpay = new \JiaLeo\Payment\Wechatpay\Notify($config);
+
+try {
+	//验签
+	$data = $wechatpay->handle();
+
+	$wechatpay->returnSuccess();
+	$result = true;
+} catch (\Exception $e) {
+	$error_msg = $e->getMessage();
+	$wechatpay->returnFailure($error_msg);
+}
+```
+
+### 退款
+
+示例代码:
+
+```php
+
+$wechatpay_refund = new \JiaLeo\Payment\Wechatpay\Refund($config);
+$out_refund_no = date('YmdHis').rand(10000, 99999);
+
+try {
+    //原路退款
+    $refund_data = [
+        'out_refund_no' => $out_refund_no,//退款商户单号
+        'total_fee' => $amount, //原订单金额(单位分)
+        'refund_fee' => $refund_amount, //退款金额(单位分)
+        'out_trade_no' => $out_trade_no, //原订单商户单号
+        'refund_account' => 'REFUND_SOURCE_UNSETTLED_FUNDS' //退款资金来源-未结算资金退款
+        'notify_url' => 'http://domain/api/wechatpay/notifies/' . $data['device'] //后台回调地址
+    ];
+
+    try {
+        $wechatpay_refund->handle($refund_data);
+    } catch(\Exception $e) {
+        $refund_data['refund_account']='REFUND_SOURCE_RECHARGE_FUNDS';  //退款资金来源-可用余额退款
+        $wechatpay_refund->handle($refund_data);
+    }
+}
+```
+
+### 退款回调处理
+
+示例代码:
+
+```php
+$wechatpay = new \JiaLeo\Payment\Wechatpay\RefundNotify($config);
+
+try {
+	//验签
+	$data = $wechatpay->handle();
+
+	$wechatpay->returnSuccess();
+	$result = true;
+} catch (\Exception $e) {
+	$error_msg = $e->getMessage();
+	$wechatpay->returnFailure($error_msg);
+}
+```
+
+### 企业付款
+
+* 企业付款到零钱
+
+示例代码:
+
+```php
+$config = config('payment.wechatpay.mp');
+$payment = new \JiaLeo\Payment\Wechatpay\Transfer($config);
+$params = array(
+	'partner_trade_no' => time() . rand(10000, 99999), //转账订单号
+	'openid' => 'oErxPsxn6XTQQyFzauQW9qZYtI_k', //openid
+	'amount' => 100, //转账金额(单位:分)
+	'desc' => '测试转账', //备注
+	//'check_name' => true //是否验证实名
+);
+$res = $payment->handle($params);
+if (!$res) {
+	var_dump($payment->errorCode, $payment->errorCodeDes);
+}
+var_dump($res);
+```
+
+* 企业付款到银行卡
+
+	1. 调用获取RSA公钥API获取RSA公钥,落地成本地文件,假设为rsa_public.pem
+	
+		```php
+		$config = config('payment.wechatpay.che');
+		$wechatpay = new \JiaLeo\Payment\Wechatpay\Tools($config);
+		$url = $wechatpay->getPublicKey();
+		var_dump($url['pub_key']);
+		```
+		
+	2. PKCS#1 转 PKCS#8 (微信获取的是PKCS#1的格式,php必须读取PKCS#8)
+
+		```
+		openssl rsa -RSAPublicKey_in -in <filename> -pubout
+		```
+		
+		替换原证书内容
+		
+	3. 执行
+	
+		```php
+		$config = config('payment.wechatpay.che');
+		$wechatpay = new \JiaLeo\Payment\Wechatpay\Transfer($config);
+		
+		$data = array(
+			'partner_trade_no' => time(),
+			'amount' => 100,
+			'bank_no' => '62148312XXXXXX',
+			'true_name' => 'XXX',
+			'bank_code' => '1001',
+			'desc' => 'test',
+		);
+		
+		
+		var_dump($wechatpay->handleToBank($data));
+		```
+
+
+## 红包
+
+普通红包:
+
+```php
+$config = config('payment.wechatpay.mp');
+$payment = new \JiaLeo\Payment\Wechatpay\RedPack($config);
+
+$params = array(
+	'mch_billno' => time() . rand(10000, 99999),
+	'send_name' => '汉子科技',
+	'openid' => 'oErxPsxn6XTQQyFzauQW9qZYtI_k',
+	'wishing' => '汉子科技恭喜发财',
+	'act_name' => '汉子科技哈哈',
+	'remark' => '备注',
+	'total_amount' => 300
+);
+$res = $payment->sendRedPack($params);
+
+if (!$res) {
+	dump($payment->errorCode, $payment->errorCodeDes);
+}
+
+dump($res);
+```
+
+裂变红包:
+
+```php
+$config = config('payment.wechatpay.mp');
+$payment = new \JiaLeo\Payment\Wechatpay\RedPack($config);
+
+$params = array(
+	'mch_billno' => time() . rand(10000, 99999),
+	'send_name' => '汉子科技',
+	'openid' => 'oErxPsxn6XTQQyFzauQW9qZYtI_k',
+	'wishing' => '汉子科技恭喜发财',
+	'act_name' => '汉子科技哈哈',
+	'remark' => '备注',
+	'total_amount' => 300,
+	'total_num' => 3
+);
+$res = $payment->sendGroupRedPack($params);
+
+if (!$res) {
+	dump($payment->errorCode, $payment->errorCodeDes);
+}
+
+dump($res);
+```
+

+ 29 - 0
vendor/jialeo/payment/src/Alipay/AppPay.php

@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * PC场景下单并支付
+ */
+
+namespace JiaLeo\Payment\Alipay;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+
+class AppPay extends BasePay
+{
+    public $method = 'alipay.trade.app.pay';
+    public $productCode = 'QUICK_MSECURITY_PAY';
+
+    /**
+     * 重载handle方法
+     * @param $params
+     * @throws PaymentException
+     */
+    public function handle($params, $is_app = true, $is_qrcode = false)
+    {
+        $url = parent::handle($params, $is_app, $is_qrcode);
+
+        return $url;
+    }
+
+}

+ 244 - 0
vendor/jialeo/payment/src/Alipay/BaseAlipay.php

@@ -0,0 +1,244 @@
+<?php
+
+namespace JiaLeo\Payment\Alipay;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+class BaseAlipay
+{
+
+    public $config = array();
+
+    protected $gateway = 'https://openapi.alipay.com/gateway.do';    //支付网关
+    public $refundReturnData;  //退款返回的原始数据
+
+    public function __construct($config)
+    {
+        if (empty($config['app_id'])) {
+            throw new PaymentException('缺少配置app_id');
+        }
+
+        if (empty($config['ali_public_key'])) {
+            throw new PaymentException('缺少配置ali_public_key');
+        }
+
+        if (empty($config['rsa_private_key'])) {
+            throw new PaymentException('缺少配置rsa_private_key');
+        }
+
+        $this->config = $config;
+    }
+
+    /**
+     * 检查支付宝数据 签名是否被篡改
+     * @param array $data
+     * @return boolean
+     * @author helei
+     */
+    public function verifySign(array $data)
+    {
+        $sign = $data['sign'];
+
+        // 1. 剔除sign与sign_type参数
+        unset($data['sign'], $data['sign_type']);
+        //  2. 移除数组中的空值
+        $data = $this->paraFilter($data);
+        // 3. 对待签名参数数组排序
+        $data = $this->arraySort($data);
+        // 4. 将排序后的参数与其对应值,组合成“参数=参数值”的格式,用&字符连接起来
+        $preStr = $this->createLinkstring($data);
+
+        //提取私钥,公钥
+        $ali_public_key = $this->getRsaKeyValue($this->config['ali_public_key'], 'public');
+
+        $rsa = new Utils\Rsa2Encrypt($ali_public_key);
+        return $rsa->rsaVerify($preStr, $sign);
+    }
+
+    /**
+     * 生成biz_content内容
+     * @param array $data
+     * @return string
+     */
+    public function createbizContent(array $data)
+    {
+        return json_encode($data, JSON_UNESCAPED_UNICODE);
+    }
+
+    /**
+     * 获取rsa密钥内容
+     * @param string $key 传入的密钥信息, 可能是文件或者字符串
+     * @param string $type
+     *
+     * @return string
+     */
+    public function getRsaKeyValue($key, $type = 'private')
+    {
+        if (is_file($key)) {// 是文件
+            $rsaKey = @file_get_contents($key);
+            //$res = openssl_get_publickey($keyStr);
+        } else {
+            $keyStr = $key;
+
+            $keyStr = str_replace(PHP_EOL, '', $keyStr);
+
+            // 为了解决用户传入的密钥格式,这里进行统一处理
+            if ($type === 'private') {
+                $beginStr = ['-----BEGIN RSA PRIVATE KEY-----', '-----BEGIN PRIVATE KEY-----'];
+                $endStr = ['-----END RSA PRIVATE KEY-----', '-----END PRIVATE KEY-----'];
+            } else {
+                $beginStr = ['-----BEGIN PUBLIC KEY-----', ''];
+                $endStr = ['-----END PUBLIC KEY-----', ''];
+            }
+            $keyStr = str_replace($beginStr, ['', ''], $keyStr);
+            $keyStr = str_replace($endStr, ['', ''], $keyStr);
+
+            $rsaKey = $beginStr[0] . PHP_EOL . wordwrap($keyStr, 64, PHP_EOL, true) . PHP_EOL . $endStr[0];
+        }
+
+        return $rsaKey;
+    }
+
+    /**
+     * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
+     * @param array $para 需要拼接的数组
+     * @return string
+     * @throws \Exception
+     */
+    public function createLinkstring($para)
+    {
+        if (!is_array($para)) {
+            throw new \Exception('必须传入数组参数');
+        }
+
+        reset($para);
+        $arg = '';
+        foreach ($para as $key => $val) {
+            if (is_array($val)) {
+                continue;
+            }
+
+            $arg .= $key . '=' . $val . '&';
+        }
+
+        //去掉最后一个&字符
+        $arg && $arg = substr($arg, 0, -1);
+
+        //如果存在转义字符,那么去掉转义
+        if (get_magic_quotes_gpc()) {
+            $arg = stripslashes($arg);
+        }
+
+        return $arg;
+    }
+
+    /**
+     * 对输入的数组进行字典排序
+     * @param array $param 需要排序的数组
+     * @return array
+     */
+    public function arraySort(array $data)
+    {
+        ksort($data);
+        reset($data);
+
+        return $data;
+    }
+
+    /**
+     * 移除空值的key
+     * @param $para
+     * @return array
+     */
+    public function paraFilter($para)
+    {
+        $paraFilter = [];
+        foreach ($para as $key => $val) {
+            if ($val === '' || $val === null) {
+                continue;
+            } else {
+                if (!is_array($para[$key])) {
+                    $para[$key] = is_bool($para[$key]) ? $para[$key] : trim($para[$key]);
+                }
+
+                $paraFilter[$key] = $para[$key];
+            }
+        }
+
+        return $paraFilter;
+    }
+
+    /**
+     * 设置自定义字段
+     * @param array $data
+     * @return string
+     */
+    public function setPassbackParams(array $data)
+    {
+        $str = urlencode(serialize($data));
+        return $str;
+    }
+
+    /**
+     * 获取自定义字段
+     * @param $str
+     * @return array
+     */
+    public function getPassbackParams($str)
+    {
+        $data = unserialize(urldecode($str));
+        return $data;
+    }
+
+    /**
+     * 从证书中提取序列号
+     * @param $cert
+     * @return string
+     */
+    public function getCertSN($certPath)
+    {
+        $cert = file_get_contents($certPath);
+        $ssl = openssl_x509_parse($cert);
+        $SN = md5($this->array2string(array_reverse($ssl['issuer'])) . $ssl['serialNumber']);
+        return $SN;
+    }
+
+    /**
+     * 提取根证书序列号
+     * @param $cert  根证书
+     * @return string|null
+     */
+    public function getRootCertSN($certPath)
+    {
+        $cert = file_get_contents($certPath);
+        $this->alipayRootCertContent = $cert;
+        $array = explode("-----END CERTIFICATE-----", $cert);
+        $SN = null;
+        for ($i = 0; $i < count($array) - 1; $i++) {
+            $ssl[$i] = openssl_x509_parse($array[$i] . "-----END CERTIFICATE-----");
+            if (strpos($ssl[$i]['serialNumber'], '0x') === 0) {
+                $ssl[$i]['serialNumber'] = hexdec($ssl[$i]['serialNumber']);
+            }
+            if ($ssl[$i]['signatureTypeLN'] == "sha1WithRSAEncryption" || $ssl[$i]['signatureTypeLN'] == "sha256WithRSAEncryption") {
+                if ($SN == null) {
+                    $SN = md5($this->array2string(array_reverse($ssl[$i]['issuer'])) . $ssl[$i]['serialNumber']);
+                } else {
+
+                    $SN = $SN . "_" . md5($this->array2string(array_reverse($ssl[$i]['issuer'])) . $ssl[$i]['serialNumber']);
+                }
+            }
+        }
+        return $SN;
+    }
+
+    public function array2string($array)
+    {
+        $string = [];
+        if ($array && is_array($array)) {
+            foreach ($array as $key => $value) {
+                $string[] = $key . '=' . $value;
+            }
+        }
+        return implode(',', $string);
+    }
+}

+ 129 - 0
vendor/jialeo/payment/src/Alipay/BasePay.php

@@ -0,0 +1,129 @@
+<?php
+namespace JiaLeo\Payment\Alipay;
+
+use App\Exceptions\ApiException;
+use JiaLeo\Payment\Common\PaymentException;
+use JiaLeo\Payment\Common\Curl;
+
+class BasePay extends BaseAlipay
+{
+    protected $method;
+    protected $productCode;
+
+    /**
+     * 即时到账接口
+     */
+    public function handle($params, $is_app = false, $is_qrcode = false)
+    {
+
+        // 检查订单号是否合法
+        if (empty($params['out_trade_no']) || mb_strlen($params['out_trade_no']) > 64) {
+            throw new PaymentException('订单号不能为空,并且长度不能超过64位');
+        }
+
+        // 检查金额不能低于0.01
+        if (bccomp($params['total_amount'] / 100, '0.01', 2) === -1) {
+            throw new PaymentException('支付金额不能低于 0.01 元');
+        }
+
+        // 检查 商品名称 与 商品描述
+        if (empty($params['subject'])) {
+            throw new PaymentException('必须提供 商品的标题/交易标题/订单标题/订单关键字 等');
+        }
+
+        // 检查商品类型
+        if (empty($params['goods_type'])) {// 默认为实物类商品
+            $params['goods_type'] = 1;
+        } elseif (!in_array($params['goods_type'], [0, 1])) {
+            throw new PaymentException('商品类型可取值为:0-虚拟类商品  1-实物类商品');
+        }
+
+        if (!$is_qrcode) {
+            if (empty($params['product_code'])) {
+                $params['product_code'] = $this->productCode;
+            }
+        }
+
+        // 返回参数进行urlencode编码
+        if (!empty($params['passback_params']) && !is_string($params['passback_params'])) {
+            throw new PaymentException('回传参数必须是字符串');
+        }
+
+        $params['total_amount'] = (string)($params['total_amount'] / 100);
+
+        //定义公共参数
+        $publicParams = array(
+            'app_id' => $this->config['app_id'],
+            'method' => $this->method,
+            'format' => 'JSON',
+            'charset' => 'utf-8',
+            'sign_type' => 'RSA2',
+            'timestamp' => date('Y-m-d H:i:s'),
+            'version' => '1.0',
+        );
+
+        if (!empty($this->config['app_cert_path']) && !empty($this->config['alipay_root_cert_path'])) {
+
+            //
+            if (!file_exists($this->config['app_cert_path'])) {
+                throw new PaymentException('应用证书不存在!');
+            }
+
+            if (!file_exists($this->config['alipay_root_cert_path'])) {
+                throw new ApiException('支付宝根证书不存在!');
+            }
+
+            $publicParams['app_cert_sn'] = $this->getCertSN($this->config['app_cert_path']);
+            $publicParams['alipay_root_cert_sn'] = $this->getRootCertSN($this->config['alipay_root_cert_path']);
+        }
+
+        if (!empty($params['notify_url'])) {
+            $publicParams['notify_url'] = $params['notify_url'];
+        }
+
+        if (!empty($params['return_url'])) {
+            $publicParams['return_url'] = $params['return_url'];
+        }
+
+        unset($params['notify_url']);
+        unset($params['return_url']);
+
+        //生成biz_content参数
+        $biz_content = $params;
+        $biz_content = $this->createbizContent($biz_content);
+        $publicParams['biz_content'] = $biz_content;
+
+        //需要签名的参数
+        $sign_params = $publicParams;
+
+        //参数重新排序
+        $sign_params = $this->arraySort($sign_params);
+
+        //生成待签名字符串
+        $str = $this->createLinkstring($sign_params);
+
+        //提取私钥
+        $rsa_private_key = $this->getRsaKeyValue($this->config['rsa_private_key']);
+
+        //加密字符串
+        $rsa = new Utils\Rsa2Encrypt($rsa_private_key);
+        $sign = $rsa->encrypt($str);
+
+        $sign_params['sign'] = $sign;
+
+        if ($is_app) {
+            return http_build_query($sign_params);
+        }
+
+        if ($is_qrcode) {
+            //请求接口获取二维码地址
+            $res = Curl::get($this->gateway . '?' . http_build_query($sign_params));//用get方法商品名称不会乱码
+
+            return $res;
+        } else {
+            return $this->gateway . '?' . http_build_query($sign_params);
+        }
+    }
+}
+
+

+ 57 - 0
vendor/jialeo/payment/src/Alipay/Notify.php

@@ -0,0 +1,57 @@
+<?php
+
+namespace JiaLeo\Payment\Alipay;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+class Notify extends BaseAlipay
+{
+    public $rawData = array();
+
+    /**
+     * 回调
+     * @return array
+     * @throws PaymentException
+     */
+    public function handle()
+    {
+
+        //获取回调信息
+        $data = empty($_POST) ? $_GET : $_POST;
+        if (empty($data) || !is_array($data)) {
+            throw new PaymentException('获取参数失败!');
+        }
+
+        $this->rawData = $data;
+
+        //判断交易状态
+        if (empty($data['trade_status']) || !in_array($data['trade_status'], ['TRADE_SUCCESS', 'TRADE_FINISHED'])) {
+            throw new PaymentException('交易失败!');
+        }
+
+        // 检查签名
+        $flag = $this->verifySign($data);
+        if (!$flag) {
+            throw new PaymentException('验证签名失败!');
+        }
+
+        return $data;
+    }
+
+    /**
+     *  回复成功
+     */
+    public function returnSuccess()
+    {
+        echo 'success';
+    }
+
+    /**
+     *  回复失败
+     */
+    public function returnFailure()
+    {
+        echo 'failure';
+    }
+
+}

+ 26 - 0
vendor/jialeo/payment/src/Alipay/QrcodePay.php

@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * 二维码场景下单并支付
+ */
+
+namespace JiaLeo\Payment\Alipay;
+use JiaLeo\Payment\Common\PaymentException;
+
+
+class QrcodePay extends BasePay
+{
+    public $method = 'alipay.trade.precreate';
+
+    /**
+     * 重载handle方法
+     * @param $params
+     * @throws PaymentException
+     */
+    public function handle($params, $is_app = false, $is_qrcode = false)
+    {
+        $url = parent::handle($params, false, true);
+
+        return $url;
+    }
+}

+ 116 - 0
vendor/jialeo/payment/src/Alipay/Refund.php

@@ -0,0 +1,116 @@
+<?php
+namespace JiaLeo\Payment\Alipay;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+class Refund extends BaseAlipay
+{
+    /**
+     * 统一收单交易退款接口
+     * @return mixed
+     * @throws PaymentException
+     */
+    public function handle($params)
+    {
+        if (empty($params['out_trade_no']) && empty($params['trade_no'])) {
+            throw new PaymentException('订单号和支付宝交易号不能同时为空');
+        }
+
+        // 检查订单号是否合法
+        if (!empty($params['out_trade_no']) && mb_strlen($params['out_trade_no']) > 64) {
+            throw new PaymentException('订单号长度不能超过64位');
+        }
+
+        // 检查订单号是否合法
+        if (!empty($params['trade_no']) && mb_strlen($params['trade_no']) > 64) {
+            throw new PaymentException('支付宝交易号长度不能超过64位');
+        }
+
+        // 检查退款请求号是否合法
+        if (!empty($params['out_request_no']) && mb_strlen($params['out_request_no']) > 64) {
+            throw new PaymentException('退款请求号长度不能超过64位');
+        }
+
+        // 需要退款的金额不能低于0.01
+        if (bccomp($params['refund_amount'] / 100, '0.01', 2) === -1) {
+            throw new PaymentException('需要退款的金额不能低于 0.01 元');
+        }
+
+        // 检查退款的原因说明是否合法
+        if (!empty($params['refund_reason']) && mb_strlen($params['refund_reason']) > 256) {
+            throw new PaymentException('退款的原因说明长度不能超过256位');
+        }
+        $params['refund_amount'] = $params['refund_amount'] / 100;
+
+        //定义公共参数
+        $publicParams = array(
+            'app_id' => $this->config['app_id'],
+            'method' => 'alipay.trade.refund',
+            'format' => 'JSON',
+            'charset' => 'utf-8',
+            'sign_type' => 'RSA2',
+            'timestamp' => date('Y-m-d H:i:s'),
+            'version' => '1.0',
+        );
+
+        //生成biz_content参数
+        $biz_content = $params;
+        $biz_content = $this->createbizContent($biz_content);
+        $publicParams['biz_content'] = $biz_content;
+
+        //需要签名的参数
+        $sign_params = array_merge($params, $publicParams);
+
+        //参数重新排序
+        $sign_params = $this->arraySort($sign_params);
+
+        //生成待签名字符串
+        $str = $this->createLinkstring($sign_params);
+
+        //提取私钥
+        $rsa_private_key = $this->getRsaKeyValue($this->config['rsa_private_key']);
+
+        //加密字符串
+        $rsa = new Utils\Rsa2Encrypt($rsa_private_key);
+        $sign = $rsa->encrypt($str);
+
+        $sign_params['sign'] = $sign;
+        $url = $this->gateway . '?' . http_build_query($sign_params);
+
+        // 发起网络请求
+        $curl = new \JiaLeo\Payment\Common\Curl();
+        $responseTxt = $curl->get($url);
+
+        if (!$responseTxt ) {
+            throw new PaymentException('网络发生错误');
+        }
+
+        $this->refundReturnData = $responseTxt;
+
+        $body = json_decode($responseTxt, true);
+
+        if (!$body) {
+            throw new PaymentException('返回数据有误!');
+        }
+
+        if (empty($body['alipay_trade_refund_response']['code'])) {
+            throw new PaymentException('返回数据有误!');
+        }
+
+        if ($body['alipay_trade_refund_response']['code'] != 10000) {
+            throw new PaymentException($body['alipay_trade_refund_response']['sub_msg']);
+        }
+
+        // 验证签名,检查支付宝返回的数据
+        $preStr = json_encode($body['alipay_trade_refund_response']);
+
+        $ali_public_key = $this->getRsaKeyValue($this->config['ali_public_key'], 'public');
+        $rsa = new Utils\Rsa2Encrypt($ali_public_key);
+        $flag = $rsa->rsaVerify($preStr, $body['sign']);
+        if (!$flag) {
+            throw new PaymentException('支付宝返回数据被篡改。请检查网络是否安全!');
+        }
+
+        return $body;
+    }
+}

+ 105 - 0
vendor/jialeo/payment/src/Alipay/Transfer.php

@@ -0,0 +1,105 @@
+<?php
+namespace JiaLeo\Payment\Alipay;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+class Transfer extends BaseAlipay
+{
+    /**
+     * 单笔转账到支付宝账户
+     * @return mixed
+     * @throws PaymentException
+     */
+    public function handle($params)
+    {
+        //检查订单号是否合法
+        if (empty($params['out_biz_no']) || mb_strlen($params['out_biz_no']) > 64) {
+            throw new PaymentException('商户转账唯一订单号不能为空,长度不能超过64位');
+        }
+
+        // 检查收款方账户是否合法
+        if (empty($params['payee_account']) || mb_strlen($params['payee_account']) > 100) {
+            throw new PaymentException('收款方账户不能为空,长度不能超过100位');
+        }
+
+        // 需要转账金额不能低于0.01
+        if (empty($params['amount']) || bccomp($params['amount'] / 100, '0.1', 2) === -1) {
+            throw new PaymentException('转账金额不能为空,且不能低于 0.1 元');
+        }
+
+        $params['amount'] = (string) ($params['amount'] / 100);
+        $params['payee_type'] = 'ALIPAY_LOGONID';
+
+
+        //定义公共参数
+        $publicParams = array(
+            'app_id' => $this->config['app_id'],
+            'method' => 'alipay.fund.trans.toaccount.transfer',
+            'format' => 'JSON',
+            'charset' => 'utf-8',
+            'sign_type' => 'RSA2',
+            'timestamp' => date('Y-m-d H:i:s'),
+            'version' => '1.0',
+        );
+
+        //生成biz_content参数
+        $biz_content = $params;
+        $biz_content = $this->createbizContent($biz_content);
+        $publicParams['biz_content'] = $biz_content;
+
+        //需要签名的参数
+        $sign_params = array_merge($params, $publicParams);
+
+        //参数重新排序
+        $sign_params = $this->arraySort($sign_params);
+
+        //生成待签名字符串
+        $str = $this->createLinkstring($sign_params);
+
+        //提取私钥
+        $rsa_private_key = $this->getRsaKeyValue($this->config['rsa_private_key']);
+
+        //加密字符串
+        $rsa = new Utils\Rsa2Encrypt($rsa_private_key);
+        $sign = $rsa->encrypt($str);
+
+        $sign_params['sign'] = $sign;
+        $url = $this->gateway . '?' . http_build_query($sign_params);
+
+        // 发起网络请求
+        $curl = new \JiaLeo\Payment\Common\Curl();
+        $responseTxt = $curl->get($url);
+
+        if (!$responseTxt ) {
+            throw new PaymentException('网络发生错误');
+        }
+
+        $this->refundReturnData = $responseTxt;
+
+        $body = json_decode($responseTxt, true);
+
+        if (!$body) {
+            throw new PaymentException('返回数据有误!');
+        }
+
+        if (empty($body['alipay_fund_trans_toaccount_transfer_response']['code'])) {
+            throw new PaymentException('返回数据有误!');
+        }
+
+        if ($body['alipay_fund_trans_toaccount_transfer_response']['code'] != 10000) {
+            throw new PaymentException($body['alipay_fund_trans_toaccount_transfer_response']['sub_msg']);
+        }
+
+        // 验证签名,检查支付宝返回的数据
+        $preStr = json_encode($body['alipay_fund_trans_toaccount_transfer_response']);
+
+        $ali_public_key = $this->getRsaKeyValue($this->config['ali_public_key'], 'public');
+        $rsa = new Utils\Rsa2Encrypt($ali_public_key);
+        $flag = $rsa->rsaVerify($preStr, $body['sign']);
+        if (!$flag) {
+            throw new PaymentException('支付宝返回数据被篡改。请检查网络是否安全!');
+        }
+
+        return $body;
+    }
+}

+ 102 - 0
vendor/jialeo/payment/src/Alipay/Utils/Rsa2Encrypt.php

@@ -0,0 +1,102 @@
+<?php
+namespace JiaLeo\Payment\Alipay\Utils;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+class Rsa2Encrypt
+{
+    protected $key;
+
+    public function __construct($key)
+    {
+        $this->key = $key;
+    }
+
+    /**
+     * 设置key
+     * @param $key
+     */
+    public function setKey($key)
+    {
+        $this->key = $key;
+    }
+
+    /**
+     * RSA2签名, 此处秘钥是私有秘钥
+     * @param string $data 签名的数组
+     * @throws \Exception
+     * @return string
+     */
+    public function encrypt($data)
+    {
+        if ($this->key === false) {
+            return '';
+        }
+
+        $res = openssl_get_privatekey($this->key);
+        if (empty($res)) {
+            throw new PaymentException('您使用的私钥格式错误,请检查RSA私钥配置');
+        }
+
+        openssl_sign($data, $sign, $res, OPENSSL_ALGO_SHA256);
+        openssl_free_key($res);
+
+        //base64编码
+        $sign = base64_encode($sign);
+        return $sign;
+    }
+
+    /**
+     * RSA2解密 此处秘钥是用户私有秘钥
+     * @param string $content 需要解密的内容,密文
+     * @throws \Exception
+     * @return string
+     */
+    public function decrypt($content)
+    {
+        if ($this->key === false) {
+            return '';
+        }
+
+        $res = openssl_get_privatekey($this->key);
+        if (empty($res)) {
+            throw new PaymentException('您使用的私钥格式错误,请检查RSA私钥配置');
+        }
+
+        //用base64将内容还原成二进制
+        $decodes = base64_decode($content);
+
+        $str = '';
+        $dcyCont = '';
+        foreach ($decodes as $n => $decode) {
+            if (!openssl_private_decrypt($decode, $dcyCont, $res)) {
+                echo "<br/>" . openssl_error_string() . "<br/>";
+            }
+            $str .= $dcyCont;
+        }
+
+        openssl_free_key($res);
+        return $str;
+    }
+
+    /**
+     * RSA2验签 ,此处的秘钥,是第三方公钥
+     * @param string $data 待签名数据
+     * @param string $sign 要校对的的签名结果
+     * @throws \Exception
+     * @return bool
+     */
+    public function rsaVerify($data, $sign)
+    {
+
+        // 初始时,使用公钥key
+        $res = openssl_get_publickey($this->key);
+        if (empty($res)) {
+            throw new PaymentException('支付宝RSA公钥错误。请检查公钥文件格式是否正确');
+        }
+
+        $result = (bool)openssl_verify($data, base64_decode($sign), $res, OPENSSL_ALGO_SHA256);
+        openssl_free_key($res);
+        return $result;
+    }
+}

+ 15 - 0
vendor/jialeo/payment/src/Alipay/WapPay.php

@@ -0,0 +1,15 @@
+<?php
+
+/**
+ * 手机网站支付场景下单并支付
+ */
+
+namespace JiaLeo\Payment\Alipay;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+class WapPay extends BasePay
+{
+    public $method = 'alipay.trade.wap.pay';
+    public $productCode = 'QUICK_WAP_WAY';
+}

+ 16 - 0
vendor/jialeo/payment/src/Alipay/WebPay.php

@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * PC场景下单并支付
+ */
+
+namespace JiaLeo\Payment\Alipay;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+
+class WebPay extends BasePay
+{
+    public $method = 'alipay.trade.page.pay';
+    public $productCode = 'FAST_INSTANT_TRADE_PAY';
+}

+ 83 - 0
vendor/jialeo/payment/src/Applepay/IAP.php

@@ -0,0 +1,83 @@
+<?php
+
+namespace JiaLeo\Payment\Applepay;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+/**
+ * 苹果内购
+ * Class IAP
+ * @package JiaLeo\Payment\Applepay
+ */
+class IAP
+{
+
+    /**
+     * @param $receipt
+     * @param bool $sanbox
+     * @return mixed
+     * @throws PaymentException
+     */
+    public function checkPay($receipt, $sanbox = false)
+    {
+
+        if (strlen($receipt) < 20) {
+            throw new PaymentException('非法参数');
+        }
+
+        $post_data = json_encode(
+            array('receipt-data' => $receipt)
+        );
+
+        $response = $this->postData($post_data, $sanbox);
+
+        return $response;
+    }
+
+    /**
+     * 发送数据
+     * @param $post_data
+     * @param bool $sanbox
+     * @return mixed
+     * @throws PaymentException
+     */
+    public function postData($post_data, $sanbox = false)
+    {
+        //如果是沙盒模式,请求苹果测试服务器,反之,请求苹果正式的服务器
+        if ($sanbox) {
+            $endpoint = 'https://sandbox.itunes.apple.com/verifyReceipt';
+        } else {
+            $endpoint = 'https://buy.itunes.apple.com/verifyReceipt';
+        }
+
+        $ch = curl_init($endpoint);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+        curl_setopt($ch, CURLOPT_POST, true);
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
+        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);  //这两行一定要加,不加会报SSL 错误
+        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
+        $response = curl_exec($ch);
+        $errno = curl_errno($ch);
+        $errmsg = curl_error($ch);
+        curl_close($ch);
+
+        $data = json_decode($response, true);
+
+        //判断时候出错,抛出异常
+        if ($errno != 0) {
+            throw new PaymentException('出现异常');
+        }
+
+        //判断返回的数据是否是对象
+        if (!is_array($data)) {
+            throw new PaymentException('响应数据异常');
+        }
+
+        //沙盒模式的,重新请求一下
+        if ($data['status'] == 21007) {
+            return $this->postData($post_data, true);
+        }
+
+        return $data;
+    }
+}

+ 81 - 0
vendor/jialeo/payment/src/Common/Curl.php

@@ -0,0 +1,81 @@
+<?php
+
+
+namespace JiaLeo\Payment\Common;
+
+class Curl
+{
+    /**
+     * @param $url
+     * @param $param
+     * @param bool $post_file
+     * @param int $tiemout
+     * @return bool|mixed
+     */
+    public static function post($url, $param, $post_file = false, $tiemout = 2)
+    {
+        $oCurl = curl_init();
+        if (stripos($url, "https://") !== FALSE) {
+            curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
+            curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);
+        }
+        if (is_string($param) || $post_file) {
+            $strPOST = $param;
+        } else {
+            $aPOST = array();
+            foreach ($param as $key => $val) {
+                $aPOST[] = $key . "=" . urlencode($val);
+            }
+            $strPOST = join("&", $aPOST);
+        }
+        curl_setopt($oCurl, CURLOPT_URL, $url);
+        curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1);
+        curl_setopt($oCurl, CURLOPT_POST, true);
+        curl_setopt($oCurl, CURLOPT_POSTFIELDS, $strPOST);
+        curl_setopt($oCurl, CURLOPT_TIMEOUT, $tiemout);  //超时时间
+
+        $header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
+        $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
+        $header[] = "Cache-Control: max-age=0";
+        $header[] = "Connection: keep-alive";
+        $header[] = "Keep-Alive: 300";
+        $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
+        $header[] = "Accept-Language: en-us,en;q=0.5";
+        $header[] = "Pragma: "; // browsers keep this blank.
+
+        curl_setopt($oCurl, CURLOPT_HTTPHEADER, $header);
+        $sContent = curl_exec($oCurl);
+        $aStatus = curl_getinfo($oCurl);
+        curl_close($oCurl);
+
+        if (intval($aStatus["http_code"]) == 200) {
+            return $sContent;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * @param $url
+     * @return bool|mixed
+     */
+    public static function get($url)
+    {
+        $oCurl = curl_init();
+        if (stripos($url, "https://") !== FALSE) {
+            curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
+            curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE);
+            curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
+        }
+        curl_setopt($oCurl, CURLOPT_URL, $url);
+        curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1);
+        $sContent = curl_exec($oCurl);
+        $aStatus = curl_getinfo($oCurl);
+        curl_close($oCurl);
+        if (intval($aStatus["http_code"]) == 200) {
+            return $sContent;
+        } else {
+            return false;
+        }
+    }
+}

+ 17 - 0
vendor/jialeo/payment/src/Common/PaymentException.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace JiaLeo\Payment\Common;
+
+
+class PaymentException extends \Exception
+{
+    /**
+     * 获取异常错误信息
+     * @return string
+     * @author helei
+     */
+    public function errorMessage()
+    {
+        return $this->getMessage();
+    }
+}

+ 26 - 0
vendor/jialeo/payment/src/Paypal/AppPay.php

@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * APP场景下单并支付
+ */
+
+namespace JiaLeo\Payment\Paypal;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+
+class AppPay extends BasePay
+{
+    /**
+     * 重载handle方法
+     * @param $params
+     * @throws PaymentException
+     */
+    public function handle($params, $is_app = true)
+    {
+        $url = parent::handle($params, true);
+
+        return $url;
+    }
+
+}

+ 69 - 0
vendor/jialeo/payment/src/Paypal/BasePay.php

@@ -0,0 +1,69 @@
+<?php
+namespace JiaLeo\Payment\Paypal;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+class BasePay extends BasePaypalPay
+{
+    /**
+     * 统一下单接口
+     */
+    public function handle($params, $is_app = false)
+    {
+        //检查参数
+        $this->checkParams($params);
+
+        $params['business'] = $this->config['account'];// 告诉paypal,我的(商城的商户)Paypal账号,就是这钱是付给谁的
+        $params['cmd'] = '_xclick'; // 告诉Paypal,我的网站是用的我自己的购物车系统
+        $params['currency_code'] = isset($params['currency_code']) ? $params['currency_code'] : 'USD'; // //告诉Paypal,我要用什么货币。这里需要注意的是,由于汇率问题,如果网站提供了更改货币的功能,那么上面的amount也要做适当更改,paypal是不会智能的根据汇率更改总额的
+        $params['charset'] = 'utf-8';
+        $params['no_note'] = '1';
+        $params['rm'] = '2';
+        $paypal_payment_url = $this->gateway . '?' . http_build_query($params);
+
+        if ($is_app) {
+            return $params;
+        } else {
+            return $paypal_payment_url;
+        }
+    }
+
+    /**
+     * 检查参数
+     * @param $params
+     * @throws PaymentException
+     */
+    public function checkParams($params)
+    {
+        //检测必填参数
+        if (!isset($params['item_name'])) {
+            throw new PaymentException("缺少统一支付接口必填参数item_name");
+        }
+
+        if (!isset($params['invoice']) && is_numeric($params['invoice'])) {
+            throw new PaymentException("缺少统一支付接口必填参数invoice,并且一定为数字!");
+        }
+
+        if (!isset($params['amount']) || mb_strlen($params['amount']) > 88) {
+            throw new PaymentException("缺少统一支付接口必填参数amount,并且长度不能超过88位!");
+        }
+
+        if (!isset($params['return'])) {
+            throw new PaymentException("缺少统一支付接口必填参数return");
+        }
+
+        if (!isset($params['cancel_return'])) {
+            throw new PaymentException("缺少统一支付接口必填参数cancel_return");
+        }
+
+        if (!isset($params['notify_url'])) {
+            throw new PaymentException("缺少统一支付接口必填参数notify_url");
+        }
+
+        if (!isset($params['custom'])) {
+            throw new PaymentException("缺少统一支付接口必填参数custom");
+        }
+    }
+
+
+}

+ 215 - 0
vendor/jialeo/payment/src/Paypal/BasePaypalPay.php

@@ -0,0 +1,215 @@
+<?php
+
+namespace JiaLeo\Payment\Paypal;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+class BasePaypalPay
+{
+
+    public $config = array();
+
+    protected $gateway;    //支付网关
+    protected $nvp_api;    //nvp MassPay接口
+    protected $end_point;    //EndPoint接口
+    public $refundReturnData;  //退款返回的原始数据
+
+    public function __construct($config)
+    {
+        $this->config = $config;
+        if ($config['mode'] == 'sandbox') {
+            $this->gateway = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
+            $this->nvp_api = 'https://api-3t.sandbox.paypal.com/nvp';
+            $this->end_point = 'https://api.sandbox.paypal.com';
+        } else {
+            $this->gateway = 'https://www.paypal.com/cgi-bin/webscr';
+            $this->nvp_api = 'https://api-3t.paypal.com/nvp';
+            $this->end_point = 'https://api.paypal.com';
+        }
+    }
+
+    /**
+     * Nvp API Http 请求
+     *
+     * @param string API 方法名
+     * @param string nvp 字符串
+     * @return array Parsed HTTP Response body
+     */
+    public function nvpHttpPost($method_name, $nvp_str)
+    {
+        $api_username = urlencode($this->config['username']);
+        $api_password = urlencode($this->config['password']);
+        $api_signature = urlencode($this->config['signature']);
+
+        //api 版本
+        $version = urlencode('90');
+
+        // 设置crul参数.
+        $ch = curl_init();
+        curl_setopt($ch, CURLOPT_URL, $this->nvp_api);
+        curl_setopt($ch, CURLOPT_VERBOSE, 1);
+
+        // 关闭服务器SSL验证。
+        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
+        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+        curl_setopt($ch, CURLOPT_POST, 1);
+
+        // 设置API操作,版本,和请求的API签名。
+        $nvpreq = "METHOD=$method_name&VERSION=$version&PWD=$api_password&USER=$api_username&SIGNATURE=$api_signature$nvp_str";
+
+        // 设置POST请求参数
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $nvpreq . "&" . $nvp_str);
+
+        // 获取请求响应体
+        $http_response = curl_exec($ch);
+
+        if (!$http_response) {
+            throw new PaymentException($method_name . ' 失败: ' . curl_error($ch) . '(' . curl_errno($ch) . ')', 'HTTP_REQ_ERROR');
+        }
+
+        // 提取响应细节
+        $http_response_ar = explode("&", $http_response);
+
+        $http_parsed_response_ar = array();
+        foreach ($http_response_ar as $i => $value) {
+            $tmpAr = explode("=", $value);
+            if (sizeof($tmpAr) > 1) {
+                $http_parsed_response_ar[$tmpAr[0]] = $tmpAr[1];
+            }
+        }
+
+        return $http_parsed_response_ar;
+    }
+
+    /**
+     * 设置Nvp请求字段
+     * @param array $data
+     * @return string
+     */
+    public function setNvpParams(array $data)
+    {
+        $nvp_str = '';
+        //遍历数组拼装nvp请求字符串
+        foreach ($data as $i => $receiver_data) {
+            $receiver_email = urlencode($receiver_data['receiver_email']);
+            $amount = urlencode($receiver_data['amount']);
+            $unique_id = urlencode($receiver_data['unique_id']);
+            $note = urlencode($receiver_data['note']);
+            $nvp_str .= "&L_EMAIL$i=$receiver_email&L_Amt$i=$amount&L_UNIQUEID$i=$unique_id&L_NOTE$i=$note";
+        }
+        return $nvp_str;
+    }
+
+    /**
+     * 设置自定义字段
+     * @param array $data
+     * @return string
+     */
+    public function setPassbackParams(array $data)
+    {
+        $str_arr = array();
+        foreach ($data as $key => $v) {
+            $str_arr[] = $key . '--' . $v;
+        }
+
+        $str = implode('---', $str_arr);
+        return $str;
+    }
+
+    /**
+     * 获取自定义字段
+     * @param $str
+     * @return array
+     */
+    public function getPassbackParams($str)
+    {
+        $str_arr = explode('---', $str);
+        $data = array();
+        foreach ($str_arr as $v) {
+            $temp = explode('--', $v);
+            $data[$temp[0]] = $temp[1];
+        }
+        return $data;
+    }
+
+    /**
+     * 获取发起退款的Access token
+     * @return array                [description]
+     */
+    public function getAccessToken()
+    {
+        $client_id = $this->config['client_id'];
+        $secret = $this->config['client_secret'];
+
+        $ch = curl_init();
+        curl_setopt($ch, CURLOPT_URL, $this->end_point . "/v1/oauth2/token");
+        curl_setopt($ch, CURLOPT_HEADER, false);
+        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+        curl_setopt($ch, CURLOPT_POST, true);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+        curl_setopt($ch, CURLOPT_USERPWD, $client_id . ":" . $secret);
+        curl_setopt($ch, CURLOPT_POSTFIELDS, "grant_type=client_credentials");
+
+        $result = curl_exec($ch);
+        curl_close($ch);
+        if (empty($result)) return false;
+        else {
+            $json = json_decode($result, true);
+
+            return $json['access_token'];
+        }
+    }
+
+    public function httpPostPaypal($url, $post_data, $header = array())
+    {
+
+        $ch = curl_init($url);
+        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 获取数据返回
+        curl_setopt($ch, CURLOPT_HTTPHEADER, $header); // 在启用 CURLOPT_RETURNTRANSFER 时候将获取数据返回array('Expect:')
+        $output = curl_exec($ch);
+
+        if (curl_errno($ch)) {
+            return false;
+        }
+
+        return $output;
+    }
+
+    /**
+     * IPN验证
+     * @param string $url
+     * @param string $post_data
+     * @return array
+     */
+    public function notifyValidate($data)
+    {
+        $receiver_email = $this->config['account'];
+
+        // 拼凑 post 请求数据
+        $req = 'cmd=_notify-validate'; // 验证请求
+        foreach ($data as $k => $v) {
+            $v = urlencode(stripslashes($v));
+            $req .= "&{$k}={$v}";
+        }
+
+        $ch = curl_init();
+        curl_setopt($ch, CURLOPT_URL, $this->gateway);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+        curl_setopt($ch, CURLOPT_POST, 1);
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
+        $res = curl_exec($ch);
+        if (!$res) {
+            $res = curl_exec($ch);
+        }
+        curl_close($ch);
+
+        if ($res && strcmp($res, 'VERIFIED') == 0 && $data['receiver_email'] == $receiver_email) {
+            return $data;
+        } else {
+            throw new PaymentException('Paypal回调验证错误!');
+        }
+    }
+}

+ 69 - 0
vendor/jialeo/payment/src/Paypal/MassPay.php

@@ -0,0 +1,69 @@
+<?php
+
+namespace JiaLeo\Payment\Paypal;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+class MassPay extends BasePaypalPay
+{
+    /**
+     * MassPay 多人转账
+     * @param array $receivers //接收者二维数组
+     * @throws PaymentException
+     */
+    public function handle($receivers, $params)
+    {
+        //检查参数
+        $this->checkParams($receivers, $params);
+
+        //确定使用Paypal email账号为目标转账
+        $email_subject = urlencode($params['email_subject']);
+        $receiver_type = 'EmailAddress';
+        $currency = urlencode($params['currency_code']); // 其他币种 ('GBP', 'EUR', 'JPY', 'CAD', 'AUD')
+
+        // 拼装请求字段
+        $nvp_str = "&EMAILSUBJECT=$email_subject&RECEIVERTYPE=$receiver_type&CURRENCYCODE=$currency";
+
+        $receivers_array = array();
+
+        //循环重构数组
+        for ($i = 0; $i < count($receivers); $i++) {
+            $receivers_array[$i] = $receivers[$i];
+            $receivers_array[$i]['unique_id'] = 'id_' . $i;
+        }
+
+        //设置Nvp请求字段
+        $nvp_str = $this->setNvpParams($receivers_array);
+
+        // 执行Paypal Nvp API操作
+        $result = $this->nvpHttpPost('MassPay', $nvp_str);
+
+        if ("SUCCESS" == strtoupper($result["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($result["ACK"])) {
+            return true;
+        } else {
+            throw new PaymentException(urldecode($result['L_LONGMESSAGE0']));
+        }
+    }
+
+    /**
+     * 检查参数
+     * @param $params
+     * @throws PaymentException
+     */
+    public function checkParams($receivers, $params)
+    {
+        //检测必填参数
+        if (!isset($params['email_subject'])) {
+            throw new PaymentException("缺少MassPay接口必填参数email_subject");
+        }
+
+        if (!isset($params['currency_code'])) {
+            throw new PaymentException("缺少MassPay接口必填参数currency_code");
+        }
+
+        //判断数据
+        if (count($receivers) < 1) {
+            throw new PaymentException("参数错误", 'PARAMS_ERROR');
+        }
+    }
+}

+ 52 - 0
vendor/jialeo/payment/src/Paypal/Notify.php

@@ -0,0 +1,52 @@
+<?php
+
+namespace JiaLeo\Payment\Paypal;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+class Notify extends BasePaypalPay
+{
+    public $rawData = array();
+
+    /**
+     * 回调
+     * @return array
+     * @throws PaymentException
+     */
+    public function handle()
+    {
+
+        //获取回调信息
+        $data = empty($_POST) ? $_GET : $_POST;
+        if (empty($data) || !is_array($data)) {
+            throw new PaymentException('获取参数失败!');
+        }
+
+        $this->rawData = $data;
+
+        //IPN验证
+        $flag = $this->notifyValidate($data);
+        if (!$flag) {
+            throw new PaymentException('IPN验证失败!');
+        }
+
+        return $data;
+    }
+
+    /**
+     *  回复成功
+     */
+    public function returnSuccess()
+    {
+        echo 'success';
+    }
+
+    /**
+     *  回复失败
+     */
+    public function returnFailure()
+    {
+        echo 'failure';
+    }
+
+}

+ 46 - 0
vendor/jialeo/payment/src/Paypal/Refund.php

@@ -0,0 +1,46 @@
+<?php
+namespace JiaLeo\Payment\Paypal;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+class Refund extends BasePaypalPay
+{
+    /**
+     * PayPal退款
+     * @param string $txn_id //交易流水ID
+     * @return array                [description]
+     */
+    public function handle($txn_id)
+    {
+        $url = $this->end_point . "/v1/payments/sale/$txn_id/refund";
+        $access_token = $this->getAccessToken();
+        if (!$access_token) {
+            return false;
+        }
+
+        $header = array(
+            "Content-Type: application/json",
+            "Authorization: Bearer $access_token"
+        );
+        $output = $this->httpPostPaypal($url, '{}', $header);
+
+        if (false === $output || false === $access_token) {
+            //网络异常,请您稍后重试
+            throw new PaymentException("网络异常,请您稍后重试");
+        }
+
+        $output = json_decode($output, TRUE);
+        var_dump($output);
+        exit;
+        if ("TRANSACTION_REFUSED" == $output['name']) {
+            //退款已提交,请勿重复
+            throw new PaymentException("退款已提交,请勿重复");
+        }
+
+        if ($txn_id == $output['sale_id'] && "completed" == $output['completed']) {
+            //退款已提交,改变订单状态等
+            return $output;
+        }
+        return false;
+    }
+}

+ 13 - 0
vendor/jialeo/payment/src/Paypal/WebPay.php

@@ -0,0 +1,13 @@
+<?php
+
+/**
+ * PC场景下单并支付
+ */
+
+namespace JiaLeo\Payment\Paypal;
+
+
+class WebPay extends BasePay
+{
+
+}

+ 57 - 0
vendor/jialeo/payment/src/Unionpay/AppPay.php

@@ -0,0 +1,57 @@
+<?php
+
+/**
+ * APP场景下单并支付
+ */
+
+namespace JiaLeo\Payment\Unionpay;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+
+class AppPay extends BasePay
+{
+    /**
+     * WebPay constructor.
+     */
+    public function __construct($config)
+    {
+        parent::__construct($config);
+
+        //判断是否测试环境
+        if($config['is_test']){
+            $this->transUrl = 'https://gateway.test.95516.com/gateway/api/appTransReq.do';
+        }
+        else{
+            $this->transUrl = 'https://gateway.95516.com/gateway/api/appTransReq.do';
+        }
+    }
+
+    /**
+     * 执行
+     * @param $params
+     * @return array
+     * @throws PaymentException
+     */
+    public function handle($params)
+    {
+        $test = $this->consume($params,true);
+
+        $res = \JiaLeo\Payment\Common\Curl::post($test['url'],$test['params']);
+        if(!$res){
+            throw new PaymentException('请求银联接口错误!');
+        }
+
+        parse_str($res,$res_array);
+
+        if( ! (is_array($res_array) && isset($res_array['respCode']))){
+            throw new PaymentException('请求银联接口错误!');
+        }
+
+        return $res_array;
+    }
+
+
+
+
+}

+ 75 - 0
vendor/jialeo/payment/src/Unionpay/BasePay.php

@@ -0,0 +1,75 @@
+<?php
+namespace JiaLeo\Payment\Unionpay;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+class BasePay extends BaseUnionpay
+{
+
+    protected $transUrl;     //交易请求地址
+
+
+    //支付基本参数
+    public $baseConsumeParams = array(
+
+        //以下信息非特殊情况不需要改动
+        'version' => '5.0.0',                 //版本号
+        'encoding' => 'utf-8',                  //编码方式
+        'txnType' => '01',                      //交易类型
+        'txnSubType' => '01',                  //交易子类
+        'bizType' => '000201',                  //业务类型
+        'signMethod' => '01',                  //签名方法
+        'channelType' => '08',                  //渠道类型,07-PC,08-手机
+        'accessType' => '0',                  //接入类型
+        'currencyCode' => '156',              //交易币种,境内商户固定156
+    );
+
+    /**
+     * 消费
+     */
+    public function consume(array $get_params, $is_app = false)
+    {
+        //验证商户订单号参数
+        if (empty($get_params['orderId'])) {
+            throw new PaymentException('缺少商户订单号');
+        }
+
+        //验证缺少交易金额参数
+        if (empty($get_params['txnAmt']) || intval($get_params['txnAmt']) < 0) {
+            throw new PaymentException('缺少交易金额');
+        }
+
+        //订单发送时间,格式为YYYYMMDDhhmmss,取北京时间
+        $get_params['txnTime'] = date('YmdHis');
+
+        //商户号ID
+        $get_params['merId'] = $this->config['mer_id'];
+
+        //合并参数
+        $params = array_merge($this->baseConsumeParams, $get_params);
+
+        $cert_path = $this->config['private_key_path'];
+        $cert_pwd = $this->config['private_key_pwd'];
+
+        //获取证书key
+        $certId = Utils\Rsa::getCertId($cert_path, $cert_pwd);
+        $params['certId'] = $certId;
+
+        //签名
+        $params['signature'] = Utils\Rsa::getParamsSignatureWithRSA($params, $cert_path, $cert_pwd);
+        //dd($params);
+
+        if ($is_app) {
+            return [
+                'params' => $params,
+                'url' => $this->transUrl,
+            ];
+        } else {
+            //抛出表单---前台回调
+            $html_form = Utils\Rsa::createAutoFormHtml($params, $this->transUrl);
+            return $html_form;
+            //dump( $html_form);
+            //exit;
+        }
+    }
+}

+ 67 - 0
vendor/jialeo/payment/src/Unionpay/BaseUnionpay.php

@@ -0,0 +1,67 @@
+<?php
+
+namespace JiaLeo\Payment\Unionpay;
+use JiaLeo\Payment\Common\PaymentException;
+
+class BaseUnionpay
+{
+
+    public $config = array();
+
+    protected $gateway ;    //支付网关
+    public $refundReturnData;  //退款返回的原始数据
+
+    public function __construct($config)
+    {
+        if (empty($config['mer_id'])) {
+            throw new PaymentException('缺少配置mer_id');
+        }
+
+        if (empty($config['private_key_path'])) {
+            throw new PaymentException('缺少配置private_key_path');
+        }
+
+        if (empty($config['private_key_pwd'])) {
+            throw new PaymentException('缺少配置private_key_pwd');
+        }
+
+        if (empty($config['cert_dir'])) {
+            throw new PaymentException('缺少配置cert_dir');
+        }
+
+        $this->config = $config;
+    }
+
+    /**
+     * 设置自定义字段
+     * @param array $data
+     * @return string
+     */
+    public function setPassbackParams(array $data)
+    {
+        $str_arr = array();
+        foreach ($data as $key => $v) {
+            $str_arr[] = $key . '--' . $v;
+        }
+
+        $str = implode('---', $str_arr);
+        return $str;
+    }
+
+    /**
+     * 获取自定义字段
+     * @param $str
+     * @return array
+     */
+    public function getPassbackParams($str)
+    {
+        $str_arr = explode('---', $str);
+        $data = array();
+        foreach ($str_arr as $v) {
+            $temp = explode('--', $v);
+            $data[$temp[0]] = $temp[1];
+        }
+        return $data;
+    }
+
+}

+ 55 - 0
vendor/jialeo/payment/src/Unionpay/Notify.php

@@ -0,0 +1,55 @@
+<?php
+
+namespace JiaLeo\Payment\Unionpay;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+class Notify extends BaseUnionpay
+{
+    public $rawData = array();
+
+    /**
+     * 回调
+     * @return mixed
+     * @throws PaymentException
+     */
+    public function handle()
+    {
+
+        if (empty($_POST) && empty($_GET)) {
+            return false;
+        }
+        $data = $_POST ?  : $_GET;
+
+        $this->rawData = $data;
+
+        $res =  \JiaLeo\Payment\Unionpay\Utils\Rsa::verify($data,$this->config['cert_dir']);
+        if(!$res){
+            throw new PaymentException('验证失败!');
+        }
+
+        //判断交易状态   判断respCode=00或A6即可认为交易成功
+        if (empty($data['respCode']) || !in_array($data['respCode'], ['00', 'A6'])) {
+            throw new PaymentException('交易失败!');
+        }
+
+        return $data;
+    }
+
+    /**
+     *  回复成功
+     */
+    public function returnSuccess()
+    {
+        echo 'success';
+    }
+
+    /**
+     *  回复失败
+     */
+    public function returnFailure()
+    {
+        //echo 'failure';
+        throw new PaymentException('failure');
+    }
+}

+ 111 - 0
vendor/jialeo/payment/src/Unionpay/Refund.php

@@ -0,0 +1,111 @@
+<?php
+
+namespace JiaLeo\Payment\Unionpay;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+class Refund extends BaseUnionpay
+{
+
+    public $transUrl;
+
+    /**
+     * WebPay constructor.
+     */
+    public function __construct($config)
+    {
+        parent::__construct($config);
+
+        //判断是否测试环境
+        if ($config['is_test']) {
+            $this->transUrl = 'https://gateway.test.95516.com/gateway/api/backTransReq.do';
+        } else {
+            $this->transUrl = 'https://gateway.95516.com/gateway/api/backTransReq.do';
+        }
+    }
+
+    /**
+     * 退款
+     * @return mixed
+     * @throws PaymentException
+     */
+    public function handle($get_params)
+    {
+        //参数配置
+        $params = [
+            'version' => '5.0.0',                 //版本号
+            'encoding' => 'utf-8',                  //编码方式
+            'txnType' => '04',                      //交易类型
+            'txnSubType' => '00',                  //交易子类
+            'bizType' => '000201',                  //业务类型
+            'signMethod' => '01',                  //签名方法
+            'channelType' => '08',                  //渠道类型,07-PC,08-手机
+            'accessType' => '0',                  //接入类型
+            'currencyCode' => '156',              //交易币种,境内商户固定156
+        ];
+
+
+        $params['merId'] = $this->config['mer_id'];
+        $params['txnTime'] = date('YmdHis');
+
+        $params = array_merge($params, $get_params);
+
+        //签名
+        $cert_path = $this->config['private_key_path'];
+        $cert_pwd = $this->config['private_key_pwd'];
+
+        //获取证书key
+        $certId = Utils\Rsa::getCertId($cert_path, $cert_pwd);
+        $params['certId'] = $certId;
+
+        //签名
+        $params['signature'] = Utils\Rsa::getParamsSignatureWithRSA($params, $cert_path, $cert_pwd);;
+
+        //异步提交---后台通知地址
+        $result = \JiaLeo\Payment\Common\Curl::post($this->transUrl, $params);
+
+        //返回示例
+        //accessType=0&bizType=000201&encoding=utf-8&merId=777290058143059
+        //&orderId=149648615778501&origQryId=201706031828290366408&queryId=201706031835570406088
+        //&respCode=00&respMsg=成功[0000000]&signMethod=01&txnAmt=1&txnSubType=00
+        //&txnTime=20170603183557&txnType=04&version=5.0.0&certId=68759585097
+        //&signature=C6m1JFv59rNmB/tiS4Q1YIAcg3Vv+U4odNUkzqlt3+D+AASmtWS4bg1jfJ3EidXxPTF+kMuk1Iy2gGzkgvfbn9BWEqEeYCV8sktusaTfOO6o2Obbz8HLRpu4zkLfWbVBA6aQ7nSrdpRl7RHO9ToFBcDdUcM07vWzGQ79cAELmrgxuvnp966/eNuQFu5jPHj2hFndduWAKM0+EIbIy/n1vcIk6kiGJGsXVcBeNoqsgjPMMMQWF2j3jTAmvQvnx7SWmwgtWE/LYSmNonehvJQv1CFa/fKkiiMIdd8XsMvJv6zbDQumzJz3lQ67mWMRq+YDBEyH+onzwSjO4IWXeJz9ig==
+
+        if (!$result) {
+            throw new PaymentException('请求银联接口错误!');
+        }
+
+        $res_array=$this->strToArray($result);
+
+        if (!(is_array($res_array) && isset($res_array['respCode']))) {
+            throw new PaymentException('请求银联接口错误!');
+        }
+
+        if ($res_array['respCode'] != '00') {
+            throw new PaymentException('退款失败!原因:' . $res_array['respMsg']);
+        }
+
+        //验签
+        $res =  \JiaLeo\Payment\Unionpay\Utils\Rsa::verify($res_array,$this->config['cert_dir']);
+        if(!$res){
+            throw new PaymentException('签名验证失败!');
+        }
+
+        return $res_array;
+    }
+
+
+    public function strToArray($data)
+    {
+        $temp = array();
+        $arr = explode('&',$data);
+
+        foreach($arr as $key => $v){
+            $str = explode('=',$v);
+            $temp[$str[0]] = $str[1];
+        }
+
+        return $temp;
+
+    }
+}

+ 172 - 0
vendor/jialeo/payment/src/Unionpay/Utils/Rsa.php

@@ -0,0 +1,172 @@
+<?php
+
+namespace JiaLeo\Payment\Unionpay\Utils;
+
+class Rsa
+{
+    //获取证书ID
+    public static function getCertId($certPath, $password)
+    {
+        $data = file_get_contents($certPath);
+        openssl_pkcs12_read($data, $certs, $password);
+        $x509data = $certs ['cert'];
+        openssl_x509_read($x509data);
+        $certData = openssl_x509_parse($x509data);
+
+        return $certData['serialNumber'];
+    }
+
+    //RSA签名
+    public static function getParamsSignatureWithRSA($params, $certPath, $password)
+    {
+
+        $privateKey = self::getPrivateKey($certPath, $password);
+        $query = self::getStringToSign($params);
+
+        $params_sha1x16 = sha1($query, false);
+
+        openssl_sign($params_sha1x16, $signature, $privateKey, OPENSSL_ALGO_SHA1);
+
+        return base64_encode($signature);
+    }
+
+    //MD5签名
+    public static function getParamsSignatureWithMD5($params, $secret)
+    {
+        $query = self::getStringToSign($params);
+
+        $signature = md5($query . '&' . md5($secret));
+
+        return $signature;
+    }
+
+    //获取私钥
+    protected static function getPrivateKey($certPath, $password)
+    {
+        $data = file_get_contents($certPath);
+        openssl_pkcs12_read($data, $certs, $password);
+
+        return $certs['pkey'];
+    }
+
+
+    //验签
+    public static function verify($params, $certDir)
+    {
+        $publicKey = self::getPublicKeyByCertId($params['certId'], $certDir);
+        $requestSignature = $params ['signature'];
+        unset($params['signature']);
+
+        ksort($params);
+        $query = http_build_query($params);
+        $query = urldecode($query);
+
+        $signature = base64_decode($requestSignature);
+        $paramsSha1x16 = sha1($query, false);
+        $isSuccess = openssl_verify($paramsSha1x16, $signature, $publicKey, OPENSSL_ALGO_SHA1);
+
+        return (bool)$isSuccess;
+    }
+
+    //通过证书ID获取公钥
+    public static function getPublicKeyByCertId($certId, $certDir)
+    {
+        $handle = opendir($certDir);
+        if ($handle) {
+            while ($file = readdir($handle)) {
+                //clearstatcache();
+                $filePath = rtrim($certDir, '/\\') . '/' . $file;
+                if (is_file($filePath) && self::endsWith($filePath, '.cer')) {
+                    if (self::getCertIdByCerPath($filePath) == $certId) {
+                        closedir($handle);
+
+                        return file_get_contents($filePath);
+                    }
+                }
+            }
+            throw new \Exception(sprintf('Can not find certId in certDir %s', $certDir));
+        } else {
+            throw new \Exception('certDir is not exists');
+        }
+
+    }
+
+    //文件判断
+    public static function endsWith($haystack, $needles)
+    {
+        foreach ((array)$needles as $needle) {
+            if ((string)$needle === substr($haystack, -strlen($needle))) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    //通过证书路径获取证书ID
+    protected static function getCertIdByCerPath($certPath)
+    {
+        $x509data = file_get_contents($certPath);
+        openssl_x509_read($x509data);
+        $certData = openssl_x509_parse($x509data);
+
+        return $certData ['serialNumber'];
+    }
+
+    //过滤无效的参数
+    public static function filterData($data)
+    {
+        $data = array_filter(
+            $data,
+            function ($v) {
+                return $v !== '';
+            }
+        );
+
+        return $data;
+    }
+
+
+    /**
+     * 参数排列
+     */
+    public static function getStringToSign($params)
+    {
+        ksort($params);
+        $query = http_build_query($params);
+        $query = urldecode($query);
+
+        return $query;
+    }
+
+    /**
+     * wap 跳转支付
+     * @param $params
+     * @param $reqUrl
+     * @return string
+     */
+    public static function createAutoFormHtml($params, $reqUrl)
+    {
+        $encodeType = isset ($params ['encoding']) ? $params ['encoding'] : 'UTF-8';
+        $html = <<<eot
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset={$encodeType}" />
+</head>
+<body onload="javascript:document.pay_form.submit();">
+    <form id="pay_form" name="pay_form" action="{$reqUrl}" method="post">
+	
+eot;
+        foreach ($params as $key => $value) {
+            $html .= "<input type=\"hidden\" name=\"{$key}\" id=\"{$key}\" value=\"{$value}\" />\n";
+        }
+        $html .= <<<eot
+    </form>
+</body>
+</html>
+eot;
+
+        return $html;
+    }
+
+}

+ 43 - 0
vendor/jialeo/payment/src/Unionpay/WebPay.php

@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * PC场景下单并支付
+ */
+
+namespace JiaLeo\Payment\Unionpay;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+
+class WebPay extends BasePay
+{
+
+    /**
+     * WebPay constructor.
+     */
+    public function __construct($config)
+    {
+        parent::__construct($config);
+
+        //判断是否测试环境
+        if($config['is_test']){
+            $this->transUrl = 'https://gateway.test.95516.com/gateway/api/frontTransReq.do';
+        }
+        else{
+            $this->transUrl = 'https://gateway.95516.com/gateway/api/frontTransReq.do';
+        }
+    }
+
+    /**
+     * 执行
+     * @param $params
+     * @return array
+     * @throws PaymentException
+     */
+    public function handle($params)
+    {
+        return $this->consume($params);
+    }
+
+
+}

+ 45 - 0
vendor/jialeo/payment/src/Wechatpay/AppPay.php

@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * APP场景下单并支付
+ */
+
+namespace JiaLeo\Payment\Wechatpay;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+
+class AppPay extends BasePay
+{
+
+    public $tradeType = 'APP';
+    public $device = 'WEB';
+
+
+    /**
+     * 下单处理
+     * @param $params
+     * @return string
+     * @throws PaymentException
+     */
+    public function handle($params)
+    {
+        $pay_info = $this->pay($params);
+        $time = time();
+
+        $pay_sigin_data = array(
+            'appid' => $this->config['appid'],
+            'timestamp' => "$time",
+            'noncestr' => $this->getNonceStr(),
+            'package' => 'Sign=WXPay',
+            'partnerid' => $this->config['mchid'],
+            'prepayid' => $pay_info['prepay_id']
+        );
+
+        //签名
+        $pay_sigin_data['sign'] = $this->makeSign($pay_sigin_data);
+
+        return $pay_sigin_data;
+    }
+
+}

+ 128 - 0
vendor/jialeo/payment/src/Wechatpay/BasePay.php

@@ -0,0 +1,128 @@
+<?php
+namespace JiaLeo\Payment\Wechatpay;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+class BasePay extends BaseWechatpay
+{
+    protected $tradeType = 'JSAPI';
+    protected $payUrl = '/pay/unifiedorder';
+    protected $device;
+
+    /**
+     * 统一下单接口
+     */
+    protected function pay($params)
+    {
+
+        $this->checkParams($params);
+
+
+        $nonce_str = $this->getNonceStr();
+
+        if (!isset($params['create_ip'])) {
+            $ip_address = !empty($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
+            //兼容处理
+            $ip_address_arr = explode(',', $ip_address);
+            $ip_address = $ip_address_arr[0];
+
+        } else {
+            $ip_address = $params['create_ip'];
+        }
+
+        //必传参数
+        $data = array(
+            'appid' => $this->config['appid'],
+            'mch_id' => $this->config['mchid'],
+            'device_info' => $this->device,
+            'trade_type' => $this->tradeType,
+            'nonce_str' => $nonce_str,
+
+            'spbill_create_ip' => $ip_address,
+            'out_trade_no' => $params['out_trade_no'],
+            'body' => $params['body'],
+            'total_fee' => $params['total_fee'],
+            'attach' => $params['attach'],
+            'notify_url' => $params['notify_url']
+        );
+
+        //用户标识
+        if (isset($params['openid'])) {
+            $data['openid'] = $params['openid'];
+        }
+
+        //订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。
+        if (isset($params['time_start'])) {
+            $data['time_start'] = $params['time_start'];
+        }
+
+        //订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。
+        //注意:最短失效时间间隔必须大于5分钟
+        if (isset($params['time_expire'])) {
+            $data['time_expire'] = $params['time_expire'];
+        }
+
+        //dump($data);
+
+        //进行签名
+        $data['sign'] = $this->makeSign($data);
+
+        //转换成xml
+        $xml = $this->toXml($data);
+        $result = $this->postXmlCurl($this->gateway . $this->payUrl, $xml);
+        $get_result = $this->fromXml($result);
+
+
+        if (!isset($get_result['return_code']) || $get_result['return_code'] != 'SUCCESS') {
+            throw new PaymentException('调起支付失败!错误信息:' . isset($get_result['return_msg']) ? $get_result['return_msg'] : $get_result);
+        }
+
+        //验证签名
+        $check_sigin = $this->makeSign($get_result);
+        if ($check_sigin != $get_result['sign']) {
+            throw new PaymentException('调起支付失败!错误信息:返回数据验证数据失败!');
+        }
+
+        //验证交易是否成功
+        if (empty($get_result['result_code']) || $get_result['result_code'] !== 'SUCCESS') {
+            throw new PaymentException('生成微信单号失败,' . $get_result['return_msg']);
+        };
+
+        //验证返回参数
+        if (!array_key_exists("appid", $get_result) || $get_result['appid'] != $this->config['appid'] || !array_key_exists("prepay_id", $get_result) || $get_result['prepay_id'] == "") {
+            throw new PaymentException("返回数据参数错误");
+        }
+
+        return $get_result;
+    }
+
+    /**
+     * 检查参数
+     * @param $params
+     * @throws PaymentException
+     */
+    public function checkParams($params)
+    {
+        //检测必填参数
+        if (!isset($params['out_trade_no']) || mb_strlen($params['out_trade_no']) > 32) {
+            throw new PaymentException("缺少统一支付接口必填参数out_trade_no,并且长度不能超过32位!");
+        }
+
+        if (!isset($params['body']) || mb_strlen($params['body']) > 128) {
+            throw new PaymentException("缺少统一支付接口必填参数body,并且长度不能超过128位!");
+        }
+
+        if (!isset($params['total_fee']) || mb_strlen($params['total_fee']) > 88) {
+            throw new PaymentException("缺少统一支付接口必填参数total_fee,并且长度不能超过88位!");
+        }
+
+        if (!in_array($this->tradeType, ['JSAPI', 'NATIVE', 'APP', 'MWEB'])) {
+            throw new PaymentException("trade_type参数错误!");
+        }
+
+        //关联参数
+        if ($this->tradeType == "JSAPI" && !isset($params['openid'])) {
+            throw new PaymentException("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!");
+        }
+    }
+}

+ 210 - 0
vendor/jialeo/payment/src/Wechatpay/BaseWechatpay.php

@@ -0,0 +1,210 @@
+<?php
+
+namespace JiaLeo\Payment\Wechatpay;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+class BaseWechatpay
+{
+
+    public $config = array();
+
+    protected $gateway = 'https://api.mch.weixin.qq.com';    //支付网关
+
+    public function __construct($config)
+    {
+        /*if (empty($config['app_id'])) {
+            throw new PaymentException('缺少配置app_id');
+        }
+
+        if (empty($config['ali_public_key'])) {
+            throw new PaymentException('缺少配置ali_public_key');
+        }
+
+        if (empty($config['rsa_private_key'])) {
+            throw new PaymentException('缺少配置rsa_private_key');
+        }*/
+
+        $this->config = $config;
+    }
+
+    /**
+     * 生成签名
+     * @return string 签名
+     */
+    public function makeSign($params)
+    {
+        //签名步骤一:按字典序排序参数
+        ksort($params);
+        $string = $this->toUrlParams($params);
+        //签名步骤二:在string后加入KEY
+        $string = $string . "&key=" . $this->config['key'];
+        //签名步骤三:MD5加密
+        $string = md5($string);
+        //签名步骤四:所有字符转为大写
+        $result = strtoupper($string);
+        return $result;
+    }
+
+    /**
+     * 格式化参数格式化成url参数
+     */
+    public function toUrlParams($params)
+    {
+        $buff = "";
+        foreach ($params as $k => $v) {
+            if ($k != "sign" && $v != "" && !is_array($v)) {
+                $buff .= $k . "=" . $v . "&";
+            }
+        }
+
+        $buff = trim($buff, "&");
+        return $buff;
+    }
+
+    /**
+     * 产生随机字符串,不长于32位
+     * @param int $length
+     * @return string 产生的随机字符串
+     */
+    public static function getNonceStr($length = 32)
+    {
+        $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
+        $str = "";
+        for ($i = 0; $i < $length; $i++) {
+            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
+        }
+        return $str;
+    }
+
+    /**
+     * 输出xml字符
+     * @throws PaymentException
+     **/
+    public function toXml($params)
+    {
+        if (!is_array($params)
+            || count($params) <= 0
+        ) {
+            throw new PaymentException("数组数据异常!");
+        }
+
+        $xml = "<xml>";
+        foreach ($params as $key => $val) {
+            if (is_numeric($val)) {
+                $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
+            } else {
+                $xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";
+            }
+        }
+        $xml .= "</xml>";
+        return $xml;
+    }
+
+    /**
+     * 将xml转为array
+     * @param string $xml
+     * @throws PaymentException
+     */
+    public function fromXml($xml)
+    {
+        if (!$xml) {
+            throw new PaymentException("xml数据异常!");
+        }
+        //将XML转为array
+        //禁止引用外部xml实体
+        $bPreviousValue = libxml_disable_entity_loader(true);
+        $params = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
+        libxml_disable_entity_loader($bPreviousValue);
+
+        return $params;
+    }
+
+    /**
+     * 以post方式提交xml到对应的接口url
+     *
+     * @param string $xml 需要post的xml数据
+     * @param string $url url
+     * @param string $sslcert_path cert路径,默认不需要
+     * @param string $sslkey_path 是否需要证书,默认不需要
+     * @param int $second url执行超时时间,默认30s
+     * @throws PaymentException
+     */
+    protected function postXmlCurl($url, $xml, $sslcert_path = '', $sslkey_path = '', $second = 30)
+    {
+        $ch = curl_init();
+        //设置超时
+        curl_setopt($ch, CURLOPT_TIMEOUT, $second);
+
+        //如果有配置代理这里就设置代理
+        /*curl_setopt($ch,CURLOPT_PROXY, "0.0.0.0");
+        curl_setopt($ch,CURLOPT_PROXYPORT, 8080);*/
+
+        curl_setopt($ch, CURLOPT_URL, $url);
+        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
+        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);//严格校验
+        //设置header
+        curl_setopt($ch, CURLOPT_HEADER, FALSE);
+        //要求结果为字符串且输出到屏幕上
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
+
+        if (!empty($sslcert_path) && !empty($sslkey_path)) {
+            //设置证书
+            //使用证书:cert 与 key 分别属于两个.pem文件
+            curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');
+            curl_setopt($ch, CURLOPT_SSLCERT, $sslcert_path);
+            curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');
+            curl_setopt($ch, CURLOPT_SSLKEY, $sslkey_path);
+        }
+
+        //post提交方式
+        curl_setopt($ch, CURLOPT_POST, TRUE);
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
+
+        //运行curl
+        $data = curl_exec($ch);
+
+        //返回结果
+        if ($data) {
+            curl_close($ch);
+            return $data;
+        } else {
+            $error = curl_errno($ch);
+            curl_close($ch);
+            throw new PaymentException("curl出错,错误码:$error");
+        }
+    }
+
+    /**
+     * 设置自定义字段
+     * @param array $data
+     * @return string
+     */
+    public function setPassbackParams(array $data)
+    {
+        $str_arr = array();
+        foreach ($data as $key => $v) {
+            $str_arr[] = $key . '--' . $v;
+        }
+
+        $str = implode('---', $str_arr);
+        return $str;
+    }
+
+    /**
+     * 获取自定义字段
+     * @param $str
+     * @return array
+     */
+    public function getPassbackParams($str)
+    {
+        $str_arr = explode('---', $str);
+        $data = array();
+        foreach ($str_arr as $v) {
+            $temp = explode('--', $v);
+            $data[$temp[0]] = $temp[1];
+        }
+        return $data;
+    }
+
+}

+ 31 - 0
vendor/jialeo/payment/src/Wechatpay/H5Pay.php

@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * 公众号场景下单并支付
+ */
+
+namespace JiaLeo\Payment\Wechatpay;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+
+class H5Pay extends BasePay
+{
+
+    public $tradeType = 'MWEB';
+    public $device = 'WEB';
+
+
+    /**
+     * 下单处理
+     * @param $params
+     * @return string
+     * @throws PaymentException
+     */
+    public function handle($params)
+    {
+        $pay_info = $this->pay($params);
+        return $pay_info['mweb_url'];
+    }
+
+}

+ 44 - 0
vendor/jialeo/payment/src/Wechatpay/MpPay.php

@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * 公众号场景下单并支付
+ */
+
+namespace JiaLeo\Payment\Wechatpay;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+
+class MpPay extends BasePay
+{
+
+    public $tradeType = 'JSAPI';
+    public $device = 'MP';
+
+    /**
+     * 下单处理
+     * @param $params
+     * @return string
+     * @throws PaymentException
+     */
+    public function handle($params)
+    {
+        $pay_info = $this->pay($params);
+        $time = time();
+
+        $pay_sigin_data = array(
+            'appId' => $this->config['appid'],
+            'timeStamp' => "$time",
+            'nonceStr' => $this->getNonceStr(),
+            'signType' => 'MD5',
+            'package' => 'prepay_id=' . $pay_info['prepay_id'],
+        );
+
+        //签名
+        $pay_sigin_data['paySign'] = $this->makeSign($pay_sigin_data);
+
+        return $pay_sigin_data;
+    }
+
+
+}

+ 31 - 0
vendor/jialeo/payment/src/Wechatpay/NativePay.php

@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * 扫码场景下单并支付
+ */
+
+namespace JiaLeo\Payment\Wechatpay;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+
+class NativePay extends BasePay
+{
+
+    public $tradeType = 'NATIVE';
+    public $device = 'NATIVE';
+
+
+    /**
+     * 下单处理
+     * @param $params
+     * @return string
+     * @throws PaymentException
+     */
+    public function handle($params)
+    {
+        $pay_info = $this->pay($params);
+        return $pay_info['code_url'];
+    }
+
+}

+ 72 - 0
vendor/jialeo/payment/src/Wechatpay/Notify.php

@@ -0,0 +1,72 @@
+<?php
+
+namespace JiaLeo\Payment\Wechatpay;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+
+class Notify extends BaseWechatpay
+{
+    public $rawData = array();
+    public $errorMsg = '';
+
+    /**
+     * 回调
+     * @return array
+     * @throws PaymentException
+     */
+    public function handle()
+    {
+        $postdata = file_get_contents("php://input");
+        $get_notify = $this->fromXml($postdata);
+
+        $this->rawData = $get_notify;
+
+        try {
+
+            if (!isset($get_notify['return_code']) || $get_notify['return_code'] != 'SUCCESS') {
+                throw new PaymentException('支付返回失败');
+            }
+
+            if (!isset($get_notify['sign'])) {
+                throw new PaymentException('缺少sign字段');
+            }
+
+            //验证签名
+            if ($this->makeSign($get_notify) != $get_notify['sign']) {
+                throw new PaymentException('验证签名失败!');
+            }
+
+        } catch (PaymentException $e) {
+            $this->errorMsg = $e->getMessage();
+            return false;
+        }
+
+        return $get_notify;
+    }
+
+    /**
+     *  回复成功
+     */
+    public function returnSuccess()
+    {
+        $return = array(
+            'return_code' => 'SUCCESS',
+            'return_msg' => 'OK'
+        );
+        echo $this->toXml($return);
+    }
+
+    /**
+     *  回复失败
+     */
+    public function returnFailure($error_msg)
+    {
+        $return = array(
+            'return_code' => 'FAIL',
+            'return_msg' => $error_msg
+        );
+        echo $this->toXml($return);
+    }
+
+}

+ 173 - 0
vendor/jialeo/payment/src/Wechatpay/RedPack.php

@@ -0,0 +1,173 @@
+<?php
+/**
+ * 红包
+ */
+
+namespace JiaLeo\Payment\Wechatpay;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+class RedPack extends BaseWechatpay
+{
+    public $payUrl = '/mmpaymkttransfers/sendredpack';
+
+    public $errorCode;  //错误代码
+    public $errorCodeDes;   //错误描述
+
+
+    const SCENEID = [
+        'PRODUCT_1',    //商品促销
+        'PRODUCT_2',    //抽奖
+        'PRODUCT_3',    //虚拟物品兑奖
+        'PRODUCT_4',    //企业内部福利
+        'PRODUCT_5',    //渠道分润
+        'PRODUCT_6',    //保险回馈
+        'PRODUCT_7',    //彩票派奖
+        'PRODUCT_8',    //税务刮奖
+    ];
+
+    /**
+     * 发送裂变红包
+     * @param $params
+     * @return mixed
+     * @throws PaymentException
+     */
+    public function sendGroupRedPack($params)
+    {
+        $this->payUrl = '/mmpaymkttransfers/sendgroupredpack';
+        $params['amt_type'] = 'ALL_RAND';
+
+        return $this->handle($params);
+    }
+
+    /**
+     * 发送普通红包
+     * @param $params
+     * @return mixed
+     * @throws PaymentException
+     */
+    public function sendRedPack($params)
+    {
+        $this->payUrl = '/mmpaymkttransfers/sendredpack';
+
+        return $this->handle($params);
+    }
+
+    /**
+     * 发放红包
+     * @return mixed
+     * @throws PaymentException
+     */
+    public function handle($params)
+    {
+        //检查订单号是否合法
+        if (empty($params['mch_billno'])) {
+            throw new PaymentException('mch_billno商户订单号不能为空');
+        }
+
+        //检查订单号是否合法
+        if (empty($params['send_name'])) {
+            throw new PaymentException('send_name商户名称不能为空');
+        }
+
+        //检查openid
+        if (empty($params['openid'])) {
+            throw new PaymentException('openid不能为空');
+        }
+
+        //检查祝福语
+        if (empty($params['wishing'])) {
+            throw new PaymentException('wishing祝福语不能为空');
+        }
+
+        //检查活动名称
+        if (empty($params['act_name'])) {
+            throw new PaymentException('act_name活动名称不能为空');
+        }
+
+        //检查备注
+        if (empty($params['remark'])) {
+            throw new PaymentException('remark备注不能为空');
+        }
+
+        // 需要红包金额不能低于1
+        if (empty($params['total_amount']) || $params['total_amount'] < 100) {
+            throw new PaymentException('total_amount红包金额不能为空,且不能低于 1 元');
+        }
+
+        //红包金额大于200,需要传scene_id
+        if ($params['total_amount'] > 20000 && (empty($params['scene_id']) || !in_array($params['scene_id'], self::SCENEID))) {
+            throw new PaymentException('红包金额大于200元,scene_id不能为空或scene_id值错误!');
+        }
+
+        if (!isset($params['create_ip'])) {
+            $ip_address = !empty($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
+            //兼容处理
+            $ip_address_arr = explode(',', $ip_address);
+            $ip_address = $ip_address_arr[0];
+
+        } else {
+            $ip_address = $params['create_ip'];
+        }
+
+        $data = array(
+            'wxappid' => $this->config['appid'],
+            'mch_id' => $this->config['mchid'],
+            'nonce_str' => $this->getNonceStr(),
+            'mch_billno' => $params['mch_billno'],
+            'send_name' => $params['send_name'],
+            're_openid' => $params['openid'],
+            'total_amount' => $params['total_amount'],
+            'total_num' => empty($params['total_num']) ? 1 : $params['total_num'],
+            'wishing' => $params['wishing'],
+            'act_name' => $params['act_name'],
+            'remark' => $params['remark'],
+            'client_ip' => $ip_address,
+        );
+
+        //场景id
+        if (!empty($params['scene_id'])) {
+            $data['scene_id'] = $params['scene_id'];
+        }
+
+        //活动信息
+        if (!empty($params['risk_info'])) {
+            $data['risk_info'] = $params['risk_info'];
+        }
+
+        //资金授权商户号
+        if (!empty($params['consume_mch_id'])) {
+            $data['consume_mch_id'] = $params['consume_mch_id'];
+        }
+
+        //发放类型
+        if (!empty($params['amt_type'])) {
+            $data['amt_type'] = $params['amt_type'];
+        }
+
+        //签名
+        $data['sign'] = $this->makeSign($data);
+
+        //转换成xml
+        $xml = $this->toXml($data);
+        $result = $this->postXmlCurl($this->gateway . $this->payUrl, $xml, $this->config['sslcert_path'], $this->config['sslkey_path']);
+        $get_result = $this->fromXml($result);
+
+        try {
+            if (!isset($get_result['return_code']) || $get_result['return_code'] != 'SUCCESS') {
+                throw new PaymentException('调起支付失败!错误信息:' . isset($get_result['return_msg']) ? $get_result['return_msg'] : $get_result);
+            }
+
+            if ($get_result['result_code'] != 'SUCCESS') {
+                throw new PaymentException('调起支付失败!错误信息:' . isset($get_result['err_code_des']) ? $get_result['err_code_des'] : $get_result);
+            }
+        } catch (\Exception $e) {
+            $this->errorCode = $get_result['err_code'];
+            $this->errorCodeDes = $get_result['err_code_des'];
+
+            return false;
+        }
+
+        return $get_result;
+    }
+}

+ 132 - 0
vendor/jialeo/payment/src/Wechatpay/Refund.php

@@ -0,0 +1,132 @@
+<?php
+
+namespace JiaLeo\Payment\Wechatpay;
+
+use App\Exceptions\ApiException;
+use JiaLeo\Payment\Common\PaymentException;
+
+
+class Refund extends BaseWechatpay
+{
+    public $payUrl = '/secapi/pay/refund';
+    public $rawData = array();
+    public $refundReturnData;  //退款返回的原始数据
+    public $refundReturnCode;  //退款返回的状态码
+    public $refundResultCode;  //退款返回的业务结果
+
+    /**
+     * 回调
+     * @return array
+     * @throws PaymentException
+     */
+    public function handle($params)
+    {
+
+        $this->checkParams($params);
+        $data = array(
+            'appid' => $this->config['appid'],
+            'mch_id' => $this->config['mchid'],
+            'nonce_str' => $this->getNonceStr(),
+            'out_refund_no' => $params['out_refund_no'],
+            'total_fee' => $params['total_fee'],
+            'refund_fee' => $params['refund_fee'],
+        );
+
+        if (isset($params['out_trade_no'])) {
+            $data['out_trade_no'] = $params['out_trade_no'];
+        } else {
+            $data['transaction_id'] = $params['transaction_id'];
+        }
+
+        if (isset($params['refund_account'])) {
+            $data['refund_account'] = $params['refund_account'];
+        }
+
+        if (isset($params['notify_url'])) {
+            $data['notify_url'] = $params['notify_url'];
+        }
+
+        if (isset($params['refund_desc'])) {
+            $data['refund_desc'] = $params['refund_desc'];
+        }
+        
+        //签名
+        $data['sign'] = $this->makeSign($data);
+        $this->rawData = $data;
+        $xml = $this->toXml($data);
+        $url = $this->gateway . $this->payUrl;
+
+        $res = $this->postXmlCurl($url, $xml, $this->config['sslcert_path'], $this->config['sslkey_path']);
+        $get_result = $this->fromXml($res);
+
+        if (!$get_result) {
+            throw new PaymentException('退款接口数据返回解析失败!');
+        }
+
+        $this->refundReturnData = $get_result;
+        $this->refundReturnCode = $get_result['return_code'];
+        $this->refundResultCode = isset($get_result['result_code']) ? $get_result['result_code'] : '';
+
+        if (!isset($get_result['return_code']) || $get_result['return_code'] != 'SUCCESS') {
+            throw new PaymentException('退款失败!接口返回错误信息:' . (isset($get_result['return_msg']) ? $get_result['return_msg'] : ''));
+        }
+
+        if (!isset($get_result['result_code']) || $get_result['result_code'] != 'SUCCESS') {
+            throw new PaymentException('退款失败!接口返回错误信息:' . (isset($get_result['err_code_des']) ? $get_result['err_code_des'] : ''));
+        }
+
+        //验证签名
+        $result_sign = $this->makeSign($get_result);
+        if ($result_sign != $get_result['sign']) {
+            throw new PaymentException('返回数据签名失败!');
+        }
+
+        return $get_result;
+    }
+
+    /**
+     * 验证参数
+     * @param $params
+     * @return bool
+     * @throws PaymentException
+     */
+    public function checkParams($params)
+    {
+        //验证
+        if (empty($params['out_trade_no']) && empty($params['transaction_id'])) {
+            throw new PaymentException('out_trade_no字段或transaction_id字段中的一个不能为空!');
+        }
+
+        if (isset($params['out_trade_no']) && mb_strlen($params['out_trade_no']) > 32) {
+            throw new PaymentException('out_trade_no字段不能大于32位!');
+        }
+
+        if (isset($params['transaction_id']) && mb_strlen($params['transaction_id']) > 28) {
+            throw new PaymentException('微信订单号,transaction_id字段不能大于28位!');
+        }
+
+        if (empty($params['out_refund_no']) || mb_strlen($params['out_refund_no']) > 64) {
+            throw new PaymentException('商户退款单号(out_refund_no)不能为空,且不能大于64位!');
+        }
+
+        if (empty($params['total_fee']) || mb_strlen($params['total_fee']) > 100) {
+            throw new PaymentException('订单金额(total_fee)不能为空,且不能大于100位!');
+        }
+
+        if (empty($params['refund_fee']) || mb_strlen($params['refund_fee']) > 100) {
+            throw new PaymentException('退款金额(refund_fee)不能为空,且不能大于100位!');
+        }
+
+        if (isset($params['refund_desc']) && mb_strlen($params['refund_desc']) > 80) {
+            throw new PaymentException('退款原因(refund_desc)能大于80位!');
+        }
+
+        if (isset($params['refund_account']) && !in_array($params['refund_account'], ['REFUND_SOURCE_RECHARGE_FUNDS', 'REFUND_SOURCE_UNSETTLED_FUNDS'])) {
+            throw new PaymentException('退款资金来源(refund_account)的值只能为REFUND_SOURCE_RECHARGE_FUNDS或REFUND_SOURCE_UNSETTLED_FUNDS!');
+        }
+
+        return true;
+    }
+
+
+}

+ 88 - 0
vendor/jialeo/payment/src/Wechatpay/RefundNotify.php

@@ -0,0 +1,88 @@
+<?php
+
+namespace JiaLeo\Payment\Wechatpay;
+
+use App\Exceptions\ApiException;
+use JiaLeo\Payment\Common\PaymentException;
+
+
+/**
+ * 退款回调
+ * Class RefundNotify
+ * @package JiaLeo\Payment\Wechatpay
+ */
+class RefundNotify extends BaseWechatpay
+{
+    public $rawData = array();
+    public $errorMsg = '';
+
+    /**
+     * 回调
+     * @return array
+     * @throws PaymentException
+     */
+    public function handle()
+    {
+        $postdata = file_get_contents("php://input");
+        $get_notify = $this->fromXml($postdata);
+        if (!$get_notify) {
+            return false;
+        }
+
+        $this->rawData = $get_notify;
+
+        try {
+
+            if (!isset($get_notify['return_code']) || $get_notify['return_code'] != 'SUCCESS') {
+                throw new PaymentException('退款返回失败');
+            }
+
+            if (!isset($get_notify['req_info'])) {
+                throw new PaymentException('缺少req_info字段');
+            }
+
+            //解密数据
+            $req_info = base64_decode($get_notify['req_info']);
+            $md5_key = md5($this->config['key']);
+            $decrypted = openssl_decrypt($req_info, 'AES-256-ECB', $md5_key, OPENSSL_RAW_DATA);
+            if (!$decrypted) {
+                throw new PaymentException('解密数据失败!');
+            }
+
+            $decrypted_arr = $this->fromXml($decrypted);
+
+            $get_notify = array_merge($get_notify, $decrypted_arr);
+
+        } catch (PaymentException $e) {
+            $this->errorMsg = $e->getMessage();
+            return false;
+        }
+
+        return $get_notify;
+    }
+
+    /**
+     *  回复成功
+     */
+    public function returnSuccess()
+    {
+        $return = array(
+            'return_code' => 'SUCCESS',
+            'return_msg' => 'OK'
+        );
+        echo $this->toXml($return);
+    }
+
+    /**
+     *  回复失败
+     */
+    public function returnFailure($error_msg)
+    {
+        $return = array(
+            'return_code' => 'FAIL',
+            'return_msg' => $error_msg
+        );
+        echo $this->toXml($return);
+    }
+
+}

+ 59 - 0
vendor/jialeo/payment/src/Wechatpay/Tools.php

@@ -0,0 +1,59 @@
+<?php
+namespace JiaLeo\Payment\Wechatpay;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+class Tools extends BaseWechatpay
+{
+
+
+    public $errorCode;  //错误代码
+    public $errorCodeDes;   //错误描述
+
+    /**
+     * 获取RSA公钥
+     * @return bool|mixed
+     * @throws PaymentException
+     */
+    public function getPublicKey()
+    {
+        $url = 'https://fraud.mch.weixin.qq.com/risk/getpublickey';
+
+        $data = array(
+            'mch_id' => $this->config['mchid'],
+            'nonce_str' => $this->getNonceStr(),
+            'sign_type' => 'MD5'
+        );
+
+        //签名
+        $data['sign'] = $this->makeSign($data);
+
+        //转换成xml
+        $xml = $this->toXml($data);
+        $result = $this->postXmlCurl($url, $xml, $this->config['sslcert_path'], $this->config['sslkey_path']);
+        $get_result = $this->fromXml($result);
+
+        try {
+            if (!isset($get_result['return_code']) || $get_result['return_code'] != 'SUCCESS') {
+                throw new PaymentException('调起获取RSA公钥接口失败!错误信息:' . isset($get_result['return_msg']) ? $get_result['return_msg'] : $get_result);
+            }
+
+            if ($get_result['result_code'] != 'SUCCESS') {
+                throw new PaymentException('调起获取RSA公钥接口失败!错误信息:' . isset($get_result['err_code_des']) ? $get_result['err_code_des'] : $get_result);
+            }
+
+            if (empty($get_result['pub_key'])) {
+                throw new PaymentException('获取pub_key字段错误!');
+            }
+        } catch (\Exception $e) {
+            $this->errorCode = $get_result['err_code'];
+            $this->errorCodeDes = $get_result['err_code_des'];
+
+            return false;
+        }
+
+        return $get_result;
+    }
+
+
+}

+ 256 - 0
vendor/jialeo/payment/src/Wechatpay/Transfer.php

@@ -0,0 +1,256 @@
+<?php
+namespace JiaLeo\Payment\Wechatpay;
+
+use JiaLeo\Payment\Common\PaymentException;
+
+class Transfer extends BaseWechatpay
+{
+    public $payUrl = '/mmpaymkttransfers/promotion/transfers';
+
+    public $errorCode;  //错误代码
+    public $errorCodeDes;   //错误描述
+
+    /**
+     * 银行编码
+     * @var array
+     */
+    public $bankCode = array(
+        '1002' => '工商银行',
+        '1005' => '农业银行',
+        '1026' => '中国银行',
+        '1003' => '建设银行',
+        '1001' => '招商银行',
+        '1066' => '邮储银行',
+        '1020' => '交通银行',
+        '1004' => '浦发银行',
+        '1006' => '民生银行',
+        '1009' => '兴业银行',
+        '1010' => '平安银行',
+        '1021' => '中信银行',
+        '1025' => '华夏银行',
+        '1027' => '广发银行',
+        '1022' => '光大银行',
+        '1032' => '北京银行',
+        '1056' => '宁波银行',
+    );
+
+    /**
+     * 企业付款到零钱
+     * @return mixed
+     * @throws PaymentException
+     */
+    public function handle($params)
+    {
+        //检查订单号是否合法
+        if (empty($params['partner_trade_no'])) {
+            throw new PaymentException('商户订单号不能为空');
+        }
+
+        // 需要转账金额不能低于1
+        if (empty($params['amount']) || $params['amount'] < 100) {
+            throw new PaymentException('转账金额不能为空,且不能低于 1 元');
+        }
+
+        if (empty($params['openid'])) {
+            throw new PaymentException('openid不能为空');
+        }
+
+        $is_check_name = !empty($params['check_name']) ? true : false;
+        if (empty($params['re_user_name']) && $is_check_name) {
+            throw new PaymentException('校验用户姓名选项为验证时,收款用户姓名(re_user_name)不能为空');
+        }
+
+        if (!isset($params['create_ip'])) {
+            $ip_address = !empty($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
+            //兼容处理
+            $ip_address_arr = explode(',', $ip_address);
+            $ip_address = $ip_address_arr[0];
+
+        } else {
+            $ip_address = $params['create_ip'];
+        }
+
+        $data = array(
+            'mch_appid' => $this->config['appid'],
+            'mchid' => $this->config['mchid'],
+            'nonce_str' => $this->getNonceStr(),
+            'partner_trade_no' => $params['partner_trade_no'],
+            'amount' => $params['amount'],
+            'openid' => $params['openid'],
+            'check_name' => !$is_check_name ? 'NO_CHECK' : 'FORCE_CHECK',
+            'spbill_create_ip' => $ip_address,
+        );
+
+        if ($is_check_name) {
+            $data['re_user_name'] = $params['re_user_name'];
+        }
+
+        if (!empty($params['desc'])) {
+            $data['desc'] = $params['desc'];
+        }
+
+        //签名
+        $data['sign'] = $this->makeSign($data);
+
+        //转换成xml
+        $xml = $this->toXml($data);
+        $result = $this->postXmlCurl($this->gateway . $this->payUrl, $xml, $this->config['sslcert_path'], $this->config['sslkey_path']);
+        $get_result = $this->fromXml($result);
+
+        try {
+            if (!isset($get_result['return_code']) || $get_result['return_code'] != 'SUCCESS') {
+                throw new PaymentException('调起转账失败!错误信息:' . isset($get_result['return_msg']) ? $get_result['return_msg'] : $get_result);
+            }
+
+            if ($get_result['result_code'] != 'SUCCESS') {
+                throw new PaymentException('调起转账失败!错误信息:' . isset($get_result['err_code_des']) ? $get_result['err_code_des'] : $get_result);
+            }
+        } catch (\Exception $e) {
+            $this->errorCode = $get_result['err_code'];
+            $this->errorCodeDes = $get_result['err_code_des'];
+
+            return false;
+        }
+
+
+        return $get_result;
+    }
+
+    /**
+     * 转账到银行卡
+     * @param $params
+     * @return bool
+     * @throws PaymentException
+     */
+    public function handleToBank($params)
+    {
+        $this->payUrl = '/mmpaysptrans/pay_bank';
+
+        //检查订单号是否合法
+        if (empty($params['partner_trade_no'])) {
+            throw new PaymentException('商户订单号不能为空');
+        }
+
+        // 需要转账金额不能低于1
+        if (empty($params['amount']) || $params['amount'] < 100) {
+            throw new PaymentException('转账金额不能为空,且不能低于 1 元');
+        }
+
+        if (empty($params['bank_no'])) {
+            throw new PaymentException('bank_no不能为空');
+        }
+
+        if (empty($params['true_name'])) {
+            throw new PaymentException('true_name不能为空');
+        }
+
+        if (empty($params['bank_code']) || !isset($this->bankCode[$params['bank_code']])) {
+            throw new PaymentException('bank_code不能为空或银行编号错误!');
+        }
+
+        $data = array(
+            'mch_id' => $this->config['mchid'],
+            'nonce_str' => $this->getNonceStr(),
+            'partner_trade_no' => $params['partner_trade_no'],
+            'amount' => $params['amount'],
+            'enc_bank_no' => $this->rsaPublicEncrypt($params['bank_no']),
+            'enc_true_name' => $this->rsaPublicEncrypt($params['true_name']),
+            'bank_code' => $params['bank_code'],
+
+        );
+
+        !isset($params['desc']) ?: $data['desc'] = $params['desc'];
+
+        //签名
+        $data['sign'] = $this->makeSign($data);
+
+        //转换成xml
+        $xml = $this->toXml($data);
+        $result = $this->postXmlCurl($this->gateway . $this->payUrl, $xml, $this->config['sslcert_path'], $this->config['sslkey_path']);
+        $get_result = $this->fromXml($result);
+
+        try {
+            if (!isset($get_result['return_code']) || $get_result['return_code'] != 'SUCCESS') {
+                throw new PaymentException('调起转账失败!错误信息:' . isset($get_result['return_msg']) ? $get_result['return_msg'] : $get_result);
+            }
+
+            if ($get_result['result_code'] != 'SUCCESS') {
+                throw new PaymentException('调起转账失败!错误信息:' . isset($get_result['err_code_des']) ? $get_result['err_code_des'] : $get_result);
+            }
+        } catch (\Exception $e) {
+            $this->errorCode = $get_result['err_code'];
+            $this->errorCodeDes = $get_result['err_code_des'];
+
+            return false;
+        }
+
+        return $get_result;
+    }
+
+    /**
+     * 查询企业打款信息
+     * @param $params
+     *        $params[partner_trade_no] int 商户订单号
+     *        $params[nonce_str] string 随机字符串,长度小于32位
+     * @return bool|mixed
+     * @throws PaymentException
+     */
+    public function queryBankOrder($params)
+    {
+        $this->payUrl = '/mmpaysptrans/query_bank';
+
+        $param = [
+            'mch_id' => $this->config['mchid'],
+            'partner_trade_no' => $params['partner_trade_no'],
+            'nonce_str' => $params['nonce_str'],
+        ];
+
+        // 签名
+        $sign = $this->makeSign($param);
+        $param['sign'] = $sign;
+
+        //转换成xml
+        $xml = $this->toXml($param);
+        $result = $this->postXmlCurl($this->gateway . $this->payUrl, $xml, $this->config['sslcert_path'], $this->config['sslkey_path']);
+        $get_result = $this->fromXml($result);
+
+        try {
+            if (!isset($get_result['return_code']) || $get_result['return_code'] != 'SUCCESS') {
+                throw new PaymentException('查询企业打款到银行卡信息!错误信息:' . isset($get_result['return_msg']) ? $get_result['return_msg'] : $get_result);
+            }
+
+            if ($get_result['result_code'] != 'SUCCESS') {
+                throw new PaymentException('查询企业打款到银行卡信息!错误信息:' . isset($get_result['err_code_des']) ? $get_result['err_code_des'] : $get_result);
+            }
+        } catch (\Exception $e) {
+            $this->errorCode = $get_result['err_code'];
+            $this->errorCodeDes = $get_result['err_code_des'];
+
+            return false;
+        }
+
+        return $get_result;
+    }
+
+    /**
+     * RSA公钥加密
+     * @param $str
+     * @return string
+     * @throws PaymentException
+     */
+    public function rsaPublicEncrypt($str)
+    {
+        $publicstr = file_get_contents($this->config['transfer_rsa_public_path']);
+        $publickey = openssl_pkey_get_public($publicstr); // 读取公钥
+        if (!$publickey) {
+            throw new PaymentException('读取公钥错误!');
+        }
+
+        $r = openssl_public_encrypt($str, $encrypted, $publickey, OPENSSL_PKCS1_OAEP_PADDING);
+
+        if (!$r) {
+            throw new PaymentException('公钥加密失败错误!');
+        }
+        return base64_encode($encrypted);
+    }
+}

+ 4 - 4
vendor/services.php

@@ -1,8 +1,8 @@
 <?php 
-// This file is automatically generated at:2019-11-07 11:51:44
+// This file is automatically generated at:2022-03-10 18:53:41
 declare (strict_types = 1);
 return array (
-  0 => 'think\\captcha\\CaptchaService',
-  1 => 'think\\app\\Service',
-  2 => 'think\\queue\\Service',
+    0 => 'think\\captcha\\CaptchaService',
+    1 => 'think\\app\\Service',
+    2 => 'think\\queue\\Service',
 );

+ 0 - 1
vendor/topthink/think-cache/.gitignore

@@ -1 +0,0 @@
-.idea

+ 0 - 201
vendor/topthink/think-cache/LICENSE

@@ -1,201 +0,0 @@
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "{}"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright {yyyy} {name of copyright owner}
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.

+ 0 - 75
vendor/topthink/think-cache/README.md

@@ -1,75 +0,0 @@
-# think-cache
-
-用于PHP缓存管理(PHP 7.1+),支持`PSR-6`及`PSR-16`缓存规范。
-
-## 安装
-~~~
-composer require topthink/think-cache
-~~~
-
-## 用法:
-~~~php
-use think\facade\Cache;
-
-// 缓存配置
-Cache::config([
-	'default'	=>	'file',
-	'stores'	=>	[
-		'file'	=>	[
-			'type'   => 'File',
-			// 缓存保存目录
-			'path'   => './cache/',
-			// 缓存前缀
-			'prefix' => '',
-			// 缓存有效期 0表示永久缓存
-			'expire' => 0,
-		],
-		'redis'	=>	[
-			'type'   => 'redis',
-			'host'   => '127.0.0.1',
-			'port'   => 6379,
-			'prefix' => '',
-			'expire' => 0,
-		],
-	],
-]);
-// 设置缓存
-Cache::set('val','value',600);
-// 判断缓存是否设置
-Cache::has('val');
-// 获取缓存
-Cache::get('val');
-// 删除缓存
-Cache::delete('val');
-// 清除缓存
-Cache::clear();
-// 读取并删除缓存
-Cache::pull('val');
-// 不存在则写入
-Cache::remember('val',10);
-
-// 对于数值类型的缓存数据可以使用
-// 缓存增+1
-Cache::inc('val');
-// 缓存增+5
-Cache::inc('val',5);
-// 缓存减1
-Cache::dec('val');
-// 缓存减5
-Cache::dec('val',5);
-
-// 使用缓存标签
-Cache::tag('tag_name')->set('val','value',600);
-// 删除某个标签下的缓存数据
-Cache::tag('tag_name')->clear();
-// 支持指定多个标签
-Cache::tag(['tag1','tag2'])->set('val2','value',600);
-// 删除多个标签下的缓存数据
-Cache::tag(['tag1','tag2'])->clear();
-
-// 使用多种缓存类型
-$redis = Cache::store('redis');
-
-$redis->set('var','value',600);
-$redis->get('var');
-~~~

+ 0 - 24
vendor/topthink/think-cache/composer.json

@@ -1,24 +0,0 @@
-{
-    "name": "topthink/think-cache",
-    "description": "Cache Manager",
-    "license": "Apache-2.0",
-    "authors": [
-        {
-            "name": "liu21st",
-            "email": "liu21st@gmail.com"
-        }
-    ],
-    "require": {
-        "php": ">=7.1.0",
-        "psr/cache": "~1.0",
-        "topthink/think-container": "~2.0",
-        "psr/simple-cache": "^1.0",
-        "opis/closure": "^3.1" 
-    },
-    "autoload": {
-        "psr-4": {
-            "think\\": "src"
-        },
-        "files": []
-    }
-}

+ 0 - 271
vendor/topthink/think-cache/src/CacheManager.php

@@ -1,271 +0,0 @@
-<?php
-// +----------------------------------------------------------------------
-// | ThinkPHP [ WE CAN DO IT JUST THINK ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
-// +----------------------------------------------------------------------
-// | Author: liu21st <liu21st@gmail.com>
-// +----------------------------------------------------------------------
-declare (strict_types = 1);
-
-namespace think;
-
-use Psr\Cache\CacheItemInterface;
-use Psr\Cache\CacheItemPoolInterface;
-use think\cache\Driver;
-use think\Container;
-use think\exception\InvalidArgumentException;
-
-/**
- * 缓存管理类
- * @mixin Driver
- */
-class CacheManager implements CacheItemPoolInterface
-{
-    /**
-     * 缓存队列
-     * @var array
-     */
-    protected $data = [];
-
-    /**
-     * 延期保存的缓存队列
-     * @var array
-     */
-    protected $deferred = [];
-
-    /**
-     * 缓存实例
-     * @var array
-     */
-    protected $instance = [];
-
-    /**
-     * 配置参数
-     * @var array
-     */
-    protected $config = [];
-
-    /**
-     * 初始化
-     * @access public
-     * @param  array $config 配置参数
-     * @return void
-     */
-    public function init(array $config = [])
-    {
-        $this->config = $config;
-    }
-
-    /**
-     * 连接或者切换缓存
-     * @access public
-     * @param  string $name  连接配置名
-     * @param  bool   $force 强制重新连接
-     * @return Driver
-     */
-    public function store(string $name = '', bool $force = false): Driver
-    {
-        if ('' == $name) {
-            $name = $this->config['default'] ?? 'file';
-        }
-
-        if ($force || !isset($this->instance[$name])) {
-            if (!isset($this->config['stores'][$name])) {
-                throw new InvalidArgumentException('Undefined cache config:' . $name);
-            }
-
-            $options = $this->config['stores'][$name];
-
-            $this->instance[$name] = $this->connect($options);
-        }
-
-        return $this->instance[$name];
-    }
-
-    /**
-     * 连接缓存
-     * @access public
-     * @param  array  $options 连接参数
-     * @param  string $name  连接配置名
-     * @return Driver
-     */
-    public function connect(array $options, string $name = ''): Driver
-    {
-        if ($name && isset($this->instance[$name])) {
-            return $this->instance[$name];
-        }
-
-        $type = !empty($options['type']) ? $options['type'] : 'File';
-
-        $handler = Container::factory($type, '\\think\\cache\\driver\\', $options);
-
-        if ($name) {
-            $this->instance[$name] = $handler;
-        }
-
-        return $handler;
-    }
-
-    /**
-     * 设置配置
-     * @access public
-     * @param  array $config 配置参数
-     * @return void
-     */
-    public function config(array $config): void
-    {
-        $this->config = array_merge($this->config, $config);
-    }
-
-    /**
-     * 返回「键」对应的一个缓存项。
-     * @access public
-     * @param  string $key 缓存标识
-     * @return CacheItemInterface
-     * @throws InvalidArgumentException
-     */
-    public function getItem($key): CacheItem
-    {
-        if (isset($this->data[$key])) {
-            return $this->data[$key];
-        }
-
-        $cacheItem = new CacheItem($key);
-
-        if ($this->has($key)) {
-            $cacheItem->set($this->get($key));
-        }
-
-        $this->data[$key] = $cacheItem;
-
-        return $cacheItem;
-    }
-
-    /**
-     * 返回一个可供遍历的缓存项集合。
-     * @access public
-     * @param  array $keys
-     * @return array|\Traversable
-     * @throws InvalidArgumentException
-     */
-    public function getItems(array $keys = []): array
-    {
-        $result = [];
-        foreach ($keys as $key) {
-            $result[] = $this->getItem($key);
-        }
-
-        return $result;
-    }
-
-    /**
-     * 检查缓存系统中是否有「键」对应的缓存项。
-     * @access public
-     * @param  string $key
-     * @return bool
-     * @throws InvalidArgumentException
-     */
-    public function hasItem($key): bool
-    {
-        return $this->store()->has($key);
-    }
-
-    /**
-     * 清空缓冲池
-     * @access public
-     * @return bool
-     */
-    public function clear(): bool
-    {
-        return $this->store()->clear();
-    }
-
-    /**
-     * 从缓冲池里移除某个缓存项
-     * @access public
-     * @param  string $key
-     * @return bool
-     * @throws InvalidArgumentException
-     */
-    public function deleteItem($key): bool
-    {
-        return $this->store()->delete($key);
-    }
-
-    /**
-     * 从缓冲池里移除多个缓存项
-     * @access public
-     * @param  array $keys
-     * @return bool
-     * @throws InvalidArgumentException
-     */
-    public function deleteItems(array $keys): bool
-    {
-        foreach ($keys as $key) {
-            $this->store()->delete($key);
-        }
-
-        return true;
-    }
-
-    /**
-     * 立刻为「CacheItemInterface」对象做数据持久化。
-     * @access public
-     * @param  CacheItemInterface $item
-     * @return bool
-     */
-    public function save(CacheItemInterface $item): bool
-    {
-        if ($item->getKey()) {
-            return $this->store()->set($item->getKey(), $item->get(), $item->getExpire());
-        }
-
-        return false;
-    }
-
-    /**
-     * 稍后为「CacheItemInterface」对象做数据持久化。
-     * @access public
-     * @param  CacheItemInterface $item
-     * @return bool
-     */
-    public function saveDeferred(CacheItemInterface $item): bool
-    {
-        $this->deferred[$item->getKey()] = $item;
-        return true;
-    }
-
-    /**
-     * 提交所有的正在队列里等待的请求到数据持久层,配合 `saveDeferred()` 使用
-     * @access public
-     * @return bool
-     */
-    public function commit(): bool
-    {
-        foreach ($this->deferred as $key => $item) {
-            $result = $this->save($item);
-            unset($this->deferred[$key]);
-
-            if (false === $result) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    public function __call($method, $args)
-    {
-        return call_user_func_array([$this->store(), $method], $args);
-    }
-
-    public function __destruct()
-    {
-        if (!empty($this->deferred)) {
-            $this->commit();
-        }
-    }
-
-}

+ 0 - 210
vendor/topthink/think-cache/src/cache/CacheItem.php

@@ -1,210 +0,0 @@
-<?php
-// +----------------------------------------------------------------------
-// | ThinkPHP [ WE CAN DO IT JUST THINK ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
-// +----------------------------------------------------------------------
-// | Author: liu21st <liu21st@gmail.com>
-// +----------------------------------------------------------------------
-declare (strict_types = 1);
-
-namespace think\cache;
-
-use DateInterval;
-use DateTime;
-use DateTimeInterface;
-use Psr\Cache\CacheItemInterface;
-use think\cache\exception\InvalidArgumentException;
-
-/**
- * CacheItem实现类
- */
-class CacheItem implements CacheItemInterface
-{
-    /**
-     * 缓存Key
-     * @var string
-     */
-    protected $key;
-
-    /**
-     * 缓存内容
-     * @var mixed
-     */
-    protected $value;
-
-    /**
-     * 过期时间
-     * @var int|DateTimeInterface
-     */
-    protected $expire;
-
-    /**
-     * 缓存tag
-     * @var string
-     */
-    protected $tag;
-
-    /**
-     * 缓存是否命中
-     * @var bool
-     */
-    protected $isHit = false;
-
-    public function __construct(string $key = null)
-    {
-        $this->key = $key;
-    }
-
-    /**
-     * 为此缓存项设置「键」
-     * @access public
-     * @param  string $key
-     * @return $this
-     */
-    public function setKey(string $key)
-    {
-        $this->key = $key;
-        return $this;
-    }
-
-    /**
-     * 返回当前缓存项的「键」
-     * @access public
-     * @return string
-     */
-    public function getKey()
-    {
-        return $this->key;
-    }
-
-    /**
-     * 返回当前缓存项的有效期
-     * @access public
-     * @return DateTimeInterface|int|null
-     */
-    public function getExpire()
-    {
-        if ($this->expire instanceof DateTimeInterface) {
-            return $this->expire;
-        }
-
-        return $this->expire ? $this->expire - time() : null;
-    }
-
-    /**
-     * 获取缓存Tag
-     * @access public
-     * @return string
-     */
-    public function getTag()
-    {
-        return $this->tag;
-    }
-
-    /**
-     * 凭借此缓存项的「键」从缓存系统里面取出缓存项
-     * @access public
-     * @return mixed
-     */
-    public function get()
-    {
-        return $this->value;
-    }
-
-    /**
-     * 确认缓存项的检查是否命中
-     * @access public
-     * @return bool
-     */
-    public function isHit(): bool
-    {
-        return $this->isHit;
-    }
-
-    /**
-     * 为此缓存项设置「值」
-     * @access public
-     * @param  mixed $value
-     * @return $this
-     */
-    public function set($value)
-    {
-        $this->value = $value;
-        $this->isHit = true;
-        return $this;
-    }
-
-    /**
-     * 为此缓存项设置所属标签
-     * @access public
-     * @param  string $tag
-     * @return $this
-     */
-    public function tag(string $tag = null)
-    {
-        $this->tag = $tag;
-        return $this;
-    }
-
-    /**
-     * 设置缓存项的有效期
-     * @access public
-     * @param  mixed $expire
-     * @return $this
-     */
-    public function expire($expire)
-    {
-        if (is_null($expire)) {
-            $this->expire = null;
-        } elseif (is_numeric($expire) || $expire instanceof DateInterval) {
-            $this->expiresAfter($expire);
-        } elseif ($expire instanceof DateTimeInterface) {
-            $this->expire = $expire;
-        } else {
-            throw new InvalidArgumentException('not support datetime');
-        }
-
-        return $this;
-    }
-
-    /**
-     * 设置缓存项的准确过期时间点
-     * @access public
-     * @param  DateTimeInterface $expiration
-     * @return $this
-     */
-    public function expiresAt($expiration)
-    {
-        if ($expiration instanceof DateTimeInterface) {
-            $this->expire = $expiration;
-        } else {
-            throw new InvalidArgumentException('not support datetime');
-        }
-
-        return $this;
-    }
-
-    /**
-     * 设置缓存项的过期时间
-     * @access public
-     * @param int|DateInterval $timeInterval
-     * @return $this
-     * @throws InvalidArgumentException
-     */
-    public function expiresAfter($timeInterval)
-    {
-        if ($timeInterval instanceof DateInterval) {
-            $this->expire = (int) DateTime::createFromFormat('U', (string) time())->add($timeInterval)->format('U');
-        } elseif (is_numeric($timeInterval)) {
-            $this->expire = $timeInterval + time();
-        } else {
-            throw new InvalidArgumentException('not support datetime');
-        }
-
-        return $this;
-    }
-
-}

+ 0 - 349
vendor/topthink/think-cache/src/cache/Driver.php

@@ -1,349 +0,0 @@
-<?php
-// +----------------------------------------------------------------------
-// | ThinkPHP [ WE CAN DO IT JUST THINK ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
-// +----------------------------------------------------------------------
-// | Author: liu21st <liu21st@gmail.com>
-// +----------------------------------------------------------------------
-declare (strict_types = 1);
-
-namespace think\cache;
-
-use DateInterval;
-use DateTime;
-use DateTimeInterface;
-use Opis\Closure\SerializableClosure;
-use Psr\SimpleCache\CacheInterface;
-use think\cache\exception\InvalidArgumentException;
-use think\Container;
-
-/**
- * 缓存基础类
- */
-abstract class Driver implements CacheInterface
-{
-    /**
-     * 驱动句柄
-     * @var object
-     */
-    protected $handler = null;
-
-    /**
-     * 缓存读取次数
-     * @var integer
-     */
-    protected $readTimes = 0;
-
-    /**
-     * 缓存写入次数
-     * @var integer
-     */
-    protected $writeTimes = 0;
-
-    /**
-     * 缓存参数
-     * @var array
-     */
-    protected $options = [];
-
-    /**
-     * 缓存标签
-     * @var array
-     */
-    protected $tag = [];
-
-    /**
-     * 获取有效期
-     * @access protected
-     * @param  integer|DateTimeInterface|DateInterval $expire 有效期
-     * @return int
-     */
-    protected function getExpireTime($expire): int
-    {
-        if ($expire instanceof DateTimeInterface) {
-            $expire = $expire->getTimestamp() - time();
-        } elseif ($expire instanceof DateInterval) {
-            $expire = DateTime::createFromFormat('U', (string) time())
-                ->add($expire)
-                ->format('U') - time();
-        }
-
-        return (int) $expire;
-    }
-
-    /**
-     * 获取实际的缓存标识
-     * @access public
-     * @param  string $name 缓存名
-     * @return string
-     */
-    public function getCacheKey(string $name): string
-    {
-        return $this->options['prefix'] . $name;
-    }
-
-    /**
-     * 读取缓存并删除
-     * @access public
-     * @param  string $name 缓存变量名
-     * @return mixed
-     */
-    public function pull(string $name)
-    {
-        $result = $this->get($name, false);
-
-        if ($result) {
-            $this->delete($name);
-            return $result;
-        }
-    }
-
-    /**
-     * 追加(数组)缓存
-     * @access public
-     * @param  string $name 缓存变量名
-     * @param  mixed  $value  存储数据
-     * @return void
-     */
-    public function push(string $name, $value): void
-    {
-        $item = $this->get($name, []);
-
-        if (!is_array($item)) {
-            throw new InvalidArgumentException('only array cache can be push');
-        }
-
-        $item[] = $value;
-
-        if (count($item) > 1000) {
-            array_shift($item);
-        }
-
-        $item = array_unique($item);
-
-        $this->set($name, $item);
-    }
-
-    /**
-     * 如果不存在则写入缓存
-     * @access public
-     * @param  string $name 缓存变量名
-     * @param  mixed  $value  存储数据
-     * @param  int    $expire  有效时间 0为永久
-     * @return mixed
-     */
-    public function remember(string $name, $value, $expire = null)
-    {
-        if ($this->has($name)) {
-            return $this->get($name);
-        }
-
-        $time = time();
-
-        while ($time + 5 > time() && $this->has($name . '_lock')) {
-            // 存在锁定则等待
-            usleep(200000);
-        }
-
-        try {
-            // 锁定
-            $this->set($name . '_lock', true);
-
-            if ($value instanceof \Closure) {
-                // 获取缓存数据
-                $value = Container::getInstance()->invokeFunction($value);
-            }
-
-            // 缓存数据
-            $this->set($name, $value, $expire);
-
-            // 解锁
-            $this->delete($name . '_lock');
-        } catch (\Exception | \throwable $e) {
-            $this->delete($name . '_lock');
-            throw $e;
-        }
-
-        return $value;
-    }
-
-    /**
-     * 缓存标签
-     * @access public
-     * @param  string|array $name 标签名
-     * @return $this
-     */
-    public function tag($name)
-    {
-        $name = (array) $name;
-        $key  = implode('-', $name);
-
-        if (!isset($this->tag[$key])) {
-            $name = array_map(function ($val) {
-                return $this->getTagKey($val);
-            }, $name);
-            $this->tag[$key] = new TagSet($name, $this);
-        }
-
-        return $this->tag[$key];
-    }
-
-    /**
-     * 获取标签包含的缓存标识
-     * @access public
-     * @param  string $tag 标签标识
-     * @return array
-     */
-    public function getTagItems(string $tag): array
-    {
-        $name = $this->getTagKey($tag);
-        return $this->get($name, []);
-    }
-
-    /**
-     * 获取实际标签名
-     * @access public
-     * @param  string $tag 标签名
-     * @return string
-     */
-    public function getTagKey(string $tag): string
-    {
-        return $this->options['tag_prefix'] . md5($tag);
-    }
-
-    /**
-     * 序列化数据
-     * @access protected
-     * @param  mixed $data 缓存数据
-     * @return string
-     */
-    protected function serialize($data): string
-    {
-        $serialize = $this->options['serialize'][0] ?? function ($data) {
-            SerializableClosure::enterContext();
-            SerializableClosure::wrapClosures($data);
-            $data = \serialize($data);
-            SerializableClosure::exitContext();
-            return $data;
-        };
-
-        return $serialize($data);
-    }
-
-    /**
-     * 反序列化数据
-     * @access protected
-     * @param  string $data 缓存数据
-     * @return mixed
-     */
-    protected function unserialize(string $data)
-    {
-        $unserialize = $this->options['serialize'][1] ?? function ($data) {
-            SerializableClosure::enterContext();
-            $data = \unserialize($data);
-            SerializableClosure::unwrapClosures($data);
-            SerializableClosure::exitContext();
-            return $data;
-        };
-
-        return $unserialize($data);
-    }
-
-    /**
-     * 返回句柄对象,可执行其它高级方法
-     *
-     * @access public
-     * @return object
-     */
-    public function handler()
-    {
-        return $this->handler;
-    }
-
-    /**
-     * 返回缓存读取次数
-     * @access public
-     * @return int
-     */
-    public function getReadTimes(): int
-    {
-        return $this->readTimes;
-    }
-
-    /**
-     * 返回缓存写入次数
-     * @access public
-     * @return int
-     */
-    public function getWriteTimes(): int
-    {
-        return $this->writeTimes;
-    }
-
-    /**
-     * 读取缓存
-     * @access public
-     * @param  iterable $keys 缓存变量名
-     * @param  mixed    $default 默认值
-     * @return iterable
-     * @throws InvalidArgumentException
-     */
-    public function getMultiple($keys, $default = null): iterable
-    {
-        $result = [];
-
-        foreach ($keys as $key) {
-            $result[$key] = $this->get($key, $default);
-        }
-
-        return $result;
-    }
-
-    /**
-     * 写入缓存
-     * @access public
-     * @param  iterable               $values 缓存数据
-     * @param  null|int|\DateInterval $ttl    有效时间 0为永久
-     * @return bool
-     */
-    public function setMultiple($values, $ttl = null): bool
-    {
-        foreach ($values as $key => $val) {
-            $result = $this->set($key, $val, $ttl);
-
-            if (false === $result) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * 删除缓存
-     * @access public
-     * @param iterable $keys 缓存变量名
-     * @return bool
-     * @throws InvalidArgumentException
-     */
-    public function deleteMultiple($keys): bool
-    {
-        foreach ($keys as $key) {
-            $result = $this->delete($key);
-
-            if (false === $result) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    public function __call($method, $args)
-    {
-        return call_user_func_array([$this->handler, $method], $args);
-    }
-}

+ 0 - 130
vendor/topthink/think-cache/src/cache/TagSet.php

@@ -1,130 +0,0 @@
-<?php
-// +----------------------------------------------------------------------
-// | ThinkPHP [ WE CAN DO IT JUST THINK ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
-// +----------------------------------------------------------------------
-// | Author: liu21st <liu21st@gmail.com>
-// +----------------------------------------------------------------------
-declare (strict_types = 1);
-
-namespace think\cache;
-
-/**
- * 标签集合
- */
-class TagSet
-{
-    /**
-     * 标签的缓存Key
-     * @var array
-     */
-    protected $tag;
-
-    /**
-     * 缓存句柄
-     * @var Driver
-     */
-    protected $handler;
-
-    /**
-     * 架构函数
-     * @access public
-     * @param  array  $tag 缓存标签
-     * @param  Driver $cache 缓存对象
-     */
-    public function __construct(array $tag, Driver $cache)
-    {
-        $this->tag     = $tag;
-        $this->handler = $cache;
-    }
-
-    /**
-     * 写入缓存
-     * @access public
-     * @param  string            $name 缓存变量名
-     * @param  mixed             $value  存储数据
-     * @param  integer|\DateTime $expire  有效时间(秒)
-     * @return bool
-     */
-    public function set($name, $value, $expire = null): bool
-    {
-        $this->handler->set($name, $value, $expire);
-
-        $this->append($name);
-
-        return true;
-    }
-
-    /**
-     * 追加缓存标识到标签
-     * @access public
-     * @param  string $name 缓存变量名
-     * @return void
-     */
-    public function append(string $name): void
-    {
-        $name = $this->handler->getCacheKey($name);
-
-        foreach ($this->tag as $tag) {
-            $this->handler->push($tag, $name);
-        }
-    }
-
-    /**
-     * 写入缓存
-     * @access public
-     * @param  iterable               $values 缓存数据
-     * @param  null|int|\DateInterval $ttl    有效时间 0为永久
-     * @return bool
-     */
-    public function setMultiple($values, $ttl = null): bool
-    {
-        foreach ($values as $key => $val) {
-            $result = $this->set($key, $val, $ttl);
-
-            if (false === $result) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * 如果不存在则写入缓存
-     * @access public
-     * @param  string $name 缓存变量名
-     * @param  mixed  $value  存储数据
-     * @param  int    $expire  有效时间 0为永久
-     * @return mixed
-     */
-    public function remember(string $name, $value, $expire = null)
-    {
-        $result = $this->handler->remember($name, $value, $expire);
-
-        $this->append($name);
-
-        return $result;
-    }
-
-    /**
-     * 清除缓存
-     * @access public
-     * @return bool
-     */
-    public function clear(): bool
-    {
-        // 指定标签清除
-        foreach ($this->tag as $tag) {
-            $names = $this->handler->get($tag, []);
-
-            $this->handler->clearTag($names);
-            $this->handler->delete($tag);
-        }
-
-        return true;
-    }
-}

+ 0 - 286
vendor/topthink/think-cache/src/cache/driver/File.php

@@ -1,286 +0,0 @@
-<?php
-// +----------------------------------------------------------------------
-// | ThinkPHP [ WE CAN DO IT JUST THINK ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
-// +----------------------------------------------------------------------
-// | Author: liu21st <liu21st@gmail.com>
-// +----------------------------------------------------------------------
-declare (strict_types = 1);
-
-namespace think\cache\driver;
-
-use think\cache\Driver;
-
-/**
- * 文件缓存类
- */
-class File extends Driver
-{
-    /**
-     * 配置参数
-     * @var array
-     */
-    protected $options = [
-        'expire'        => 0,
-        'cache_subdir'  => true,
-        'prefix'        => '',
-        'path'          => '',
-        'hash_type'     => 'md5',
-        'data_compress' => false,
-        'tag_prefix'    => 'tag:',
-        'serialize'     => [],
-    ];
-
-    /**
-     * 有效期
-     * @var int|\DateTime
-     */
-    protected $expire;
-
-    /**
-     * 架构函数
-     * @param array $options 参数
-     */
-    public function __construct(array $options = [])
-    {
-        if (!empty($options)) {
-            $this->options = array_merge($this->options, $options);
-        }
-
-        if (substr($this->options['path'], -1) != DIRECTORY_SEPARATOR) {
-            $this->options['path'] .= DIRECTORY_SEPARATOR;
-        }
-    }
-
-    /**
-     * 取得变量的存储文件名
-     * @access public
-     * @param  string $name 缓存变量名
-     * @return string
-     */
-    public function getCacheKey(string $name): string
-    {
-        $name = hash($this->options['hash_type'], $name);
-
-        if ($this->options['cache_subdir']) {
-            // 使用子目录
-            $name = substr($name, 0, 2) . DIRECTORY_SEPARATOR . substr($name, 2);
-        }
-
-        if ($this->options['prefix']) {
-            $name = $this->options['prefix'] . DIRECTORY_SEPARATOR . $name;
-        }
-
-        return $this->options['path'] . $name . '.php';
-    }
-
-    /**
-     * 判断缓存是否存在
-     * @access public
-     * @param  string $name 缓存变量名
-     * @return bool
-     */
-    public function has($name): bool
-    {
-        return false !== $this->get($name) ? true : false;
-    }
-
-    /**
-     * 读取缓存
-     * @access public
-     * @param  string $name 缓存变量名
-     * @param  mixed  $default 默认值
-     * @return mixed
-     */
-    public function get($name, $default = false)
-    {
-        $this->readTimes++;
-
-        $filename = $this->getCacheKey($name);
-
-        if (!is_file($filename)) {
-            return $default;
-        }
-
-        $content      = file_get_contents($filename);
-        $this->expire = null;
-
-        if (false !== $content) {
-            $expire = (int) substr($content, 8, 12);
-            if (0 != $expire && time() > filemtime($filename) + $expire) {
-                //缓存过期删除缓存文件
-                $this->unlink($filename);
-                return $default;
-            }
-
-            $this->expire = $expire;
-            $content      = substr($content, 32);
-
-            if ($this->options['data_compress'] && function_exists('gzcompress')) {
-                //启用数据压缩
-                $content = gzuncompress($content);
-            }
-            return $this->unserialize($content);
-        } else {
-            return $default;
-        }
-    }
-
-    /**
-     * 写入缓存
-     * @access public
-     * @param  string        $name 缓存变量名
-     * @param  mixed         $value  存储数据
-     * @param  int|\DateTime $expire  有效时间 0为永久
-     * @return bool
-     */
-    public function set($name, $value, $expire = null): bool
-    {
-        $this->writeTimes++;
-
-        if (is_null($expire)) {
-            $expire = $this->options['expire'];
-        }
-
-        $expire   = $this->getExpireTime($expire);
-        $filename = $this->getCacheKey($name);
-
-        $dir = dirname($filename);
-
-        if (!is_dir($dir)) {
-            try {
-                mkdir($dir, 0755, true);
-            } catch (\Exception $e) {
-                // 创建失败
-            }
-        }
-
-        $data = $this->serialize($value);
-
-        if ($this->options['data_compress'] && function_exists('gzcompress')) {
-            //数据压缩
-            $data = gzcompress($data, 3);
-        }
-
-        $data   = "<?php\n//" . sprintf('%012d', $expire) . "\n exit();?>\n" . $data;
-        $result = file_put_contents($filename, $data);
-
-        if ($result) {
-            clearstatcache();
-            return true;
-        }
-
-        return false;
-    }
-
-    /**
-     * 自增缓存(针对数值缓存)
-     * @access public
-     * @param  string $name 缓存变量名
-     * @param  int    $step 步长
-     * @return false|int
-     */
-    public function inc(string $name, int $step = 1)
-    {
-        if ($this->has($name)) {
-            $value  = $this->get($name) + $step;
-            $expire = $this->expire;
-        } else {
-            $value  = $step;
-            $expire = 0;
-        }
-
-        return $this->set($name, $value, $expire) ? $value : false;
-    }
-
-    /**
-     * 自减缓存(针对数值缓存)
-     * @access public
-     * @param  string $name 缓存变量名
-     * @param  int    $step 步长
-     * @return false|int
-     */
-    public function dec(string $name, int $step = 1)
-    {
-        if ($this->has($name)) {
-            $value  = $this->get($name) - $step;
-            $expire = $this->expire;
-        } else {
-            $value  = -$step;
-            $expire = 0;
-        }
-
-        return $this->set($name, $value, $expire) ? $value : false;
-    }
-
-    /**
-     * 删除缓存
-     * @access public
-     * @param  string $name 缓存变量名
-     * @return bool
-     */
-    public function delete($name): bool
-    {
-        $this->writeTimes++;
-
-        try {
-            return $this->unlink($this->getCacheKey($name));
-        } catch (\Exception $e) {
-            return false;
-        }
-    }
-
-    /**
-     * 清除缓存
-     * @access public
-     * @return bool
-     */
-    public function clear(): bool
-    {
-        $this->writeTimes++;
-
-        $files = (array) glob($this->options['path'] . ($this->options['prefix'] ? $this->options['prefix'] . DIRECTORY_SEPARATOR : '') . '*');
-
-        foreach ($files as $path) {
-            if (is_dir($path)) {
-                $matches = glob($path . DIRECTORY_SEPARATOR . '*.php');
-                if (is_array($matches)) {
-                    array_map('unlink', $matches);
-                }
-                rmdir($path);
-            } else {
-                unlink($path);
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * 删除缓存标签
-     * @access public
-     * @param  array $keys 缓存标识列表
-     * @return void
-     */
-    public function clearTag(array $keys): void
-    {
-        foreach ($keys as $key) {
-            $this->unlink($key);
-        }
-    }
-
-    /**
-     * 判断文件是否存在后,删除
-     * @access private
-     * @param  string $path
-     * @return bool
-     */
-    private function unlink(string $path): bool
-    {
-        return is_file($path) && unlink($path);
-    }
-
-}

+ 0 - 208
vendor/topthink/think-cache/src/cache/driver/Memcache.php

@@ -1,208 +0,0 @@
-<?php
-// +----------------------------------------------------------------------
-// | ThinkPHP [ WE CAN DO IT JUST THINK ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
-// +----------------------------------------------------------------------
-// | Author: liu21st <liu21st@gmail.com>
-// +----------------------------------------------------------------------
-
-namespace think\cache\driver;
-
-use think\cache\Driver;
-
-/**
- * Memcache缓存类
- */
-class Memcache extends Driver
-{
-    /**
-     * 配置参数
-     * @var array
-     */
-    protected $options = [
-        'host'       => '127.0.0.1',
-        'port'       => 11211,
-        'expire'     => 0,
-        'timeout'    => 0, // 超时时间(单位:毫秒)
-        'persistent' => true,
-        'prefix'     => '',
-        'tag_prefix' => 'tag:',
-        'serialize'  => [],
-    ];
-
-    /**
-     * 架构函数
-     * @access public
-     * @param  array $options 缓存参数
-     * @throws \BadFunctionCallException
-     */
-    public function __construct(array $options = [])
-    {
-        if (!extension_loaded('memcache')) {
-            throw new \BadFunctionCallException('not support: memcache');
-        }
-
-        if (!empty($options)) {
-            $this->options = array_merge($this->options, $options);
-        }
-
-        $this->handler = new \Memcache;
-
-        // 支持集群
-        $hosts = (array) $this->options['host'];
-        $ports = (array) $this->options['port'];
-
-        if (empty($ports[0])) {
-            $ports[0] = 11211;
-        }
-
-        // 建立连接
-        foreach ($hosts as $i => $host) {
-            $port = $ports[$i] ?? $ports[0];
-            $this->options['timeout'] > 0 ?
-            $this->handler->addServer($host, (int) $port, $this->options['persistent'], 1, $this->options['timeout']) :
-            $this->handler->addServer($host, (int) $port, $this->options['persistent'], 1);
-        }
-    }
-
-    /**
-     * 判断缓存
-     * @access public
-     * @param  string $name 缓存变量名
-     * @return bool
-     */
-    public function has($name): bool
-    {
-        $key = $this->getCacheKey($name);
-
-        return false !== $this->handler->get($key);
-    }
-
-    /**
-     * 读取缓存
-     * @access public
-     * @param  string $name 缓存变量名
-     * @param  mixed  $default 默认值
-     * @return mixed
-     */
-    public function get($name, $default = false)
-    {
-        $this->readTimes++;
-
-        $result = $this->handler->get($this->getCacheKey($name));
-
-        return false !== $result ? $this->unserialize($result) : $default;
-    }
-
-    /**
-     * 写入缓存
-     * @access public
-     * @param  string        $name 缓存变量名
-     * @param  mixed         $value  存储数据
-     * @param  int|\DateTime $expire  有效时间(秒)
-     * @return bool
-     */
-    public function set($name, $value, $expire = null): bool
-    {
-        $this->writeTimes++;
-
-        if (is_null($expire)) {
-            $expire = $this->options['expire'];
-        }
-
-        $key    = $this->getCacheKey($name);
-        $expire = $this->getExpireTime($expire);
-        $value  = $this->serialize($value);
-
-        if ($this->handler->set($key, $value, 0, $expire)) {
-            return true;
-        }
-
-        return false;
-    }
-
-    /**
-     * 自增缓存(针对数值缓存)
-     * @access public
-     * @param  string $name 缓存变量名
-     * @param  int    $step 步长
-     * @return false|int
-     */
-    public function inc(string $name, int $step = 1)
-    {
-        $this->writeTimes++;
-
-        $key = $this->getCacheKey($name);
-
-        if ($this->handler->get($key)) {
-            return $this->handler->increment($key, $step);
-        }
-
-        return $this->handler->set($key, $step);
-    }
-
-    /**
-     * 自减缓存(针对数值缓存)
-     * @access public
-     * @param  string $name 缓存变量名
-     * @param  int    $step 步长
-     * @return false|int
-     */
-    public function dec(string $name, int $step = 1)
-    {
-        $this->writeTimes++;
-
-        $key   = $this->getCacheKey($name);
-        $value = $this->handler->get($key) - $step;
-        $res   = $this->handler->set($key, $value);
-
-        return !$res ? false : $value;
-    }
-
-    /**
-     * 删除缓存
-     * @access public
-     * @param  string     $name 缓存变量名
-     * @param  bool|false $ttl
-     * @return bool
-     */
-    public function delete($name, $ttl = false): bool
-    {
-        $this->writeTimes++;
-
-        $key = $this->getCacheKey($name);
-
-        return false === $ttl ?
-        $this->handler->delete($key) :
-        $this->handler->delete($key, $ttl);
-    }
-
-    /**
-     * 清除缓存
-     * @access public
-     * @return bool
-     */
-    public function clear(): bool
-    {
-        $this->writeTimes++;
-
-        return $this->handler->flush();
-    }
-
-    /**
-     * 删除缓存标签
-     * @access public
-     * @param  array  $keys 缓存标识列表
-     * @return void
-     */
-    public function clearTag(array $keys): void
-    {
-        foreach ($keys as $key) {
-            $this->handler->delete($key);
-        }
-    }
-
-}

+ 0 - 220
vendor/topthink/think-cache/src/cache/driver/Memcached.php

@@ -1,220 +0,0 @@
-<?php
-// +----------------------------------------------------------------------
-// | ThinkPHP [ WE CAN DO IT JUST THINK ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
-// +----------------------------------------------------------------------
-// | Author: liu21st <liu21st@gmail.com>
-// +----------------------------------------------------------------------
-
-namespace think\cache\driver;
-
-use think\cache\Driver;
-
-/**
- * Memcached缓存类
- */
-class Memcached extends Driver
-{
-    /**
-     * 配置参数
-     * @var array
-     */
-    protected $options = [
-        'host'       => '127.0.0.1',
-        'port'       => 11211,
-        'expire'     => 0,
-        'timeout'    => 0, // 超时时间(单位:毫秒)
-        'prefix'     => '',
-        'username'   => '', //账号
-        'password'   => '', //密码
-        'option'     => [],
-        'tag_prefix' => 'tag:',
-        'serialize'  => [],
-    ];
-
-    /**
-     * 架构函数
-     * @access public
-     * @param  array $options 缓存参数
-     */
-    public function __construct(array $options = [])
-    {
-        if (!extension_loaded('memcached')) {
-            throw new \BadFunctionCallException('not support: memcached');
-        }
-
-        if (!empty($options)) {
-            $this->options = array_merge($this->options, $options);
-        }
-
-        $this->handler = new \Memcached;
-
-        if (!empty($this->options['option'])) {
-            $this->handler->setOptions($this->options['option']);
-        }
-
-        // 设置连接超时时间(单位:毫秒)
-        if ($this->options['timeout'] > 0) {
-            $this->handler->setOption(\Memcached::OPT_CONNECT_TIMEOUT, $this->options['timeout']);
-        }
-
-        // 支持集群
-        $hosts = (array) $this->options['host'];
-        $ports = (array) $this->options['port'];
-        if (empty($ports[0])) {
-            $ports[0] = 11211;
-        }
-
-        // 建立连接
-        $servers = [];
-        foreach ($hosts as $i => $host) {
-            $servers[] = [$host, $ports[$i] ?? $ports[0], 1];
-        }
-
-        $this->handler->addServers($servers);
-
-        if ('' != $this->options['username']) {
-            $this->handler->setOption(\Memcached::OPT_BINARY_PROTOCOL, true);
-            $this->handler->setSaslAuthData($this->options['username'], $this->options['password']);
-        }
-    }
-
-    /**
-     * 判断缓存
-     * @access public
-     * @param  string $name 缓存变量名
-     * @return bool
-     */
-    public function has($name): bool
-    {
-        $key = $this->getCacheKey($name);
-
-        return $this->handler->get($key) ? true : false;
-    }
-
-    /**
-     * 读取缓存
-     * @access public
-     * @param  string $name 缓存变量名
-     * @param  mixed  $default 默认值
-     * @return mixed
-     */
-    public function get($name, $default = false)
-    {
-        $this->readTimes++;
-
-        $result = $this->handler->get($this->getCacheKey($name));
-
-        return false !== $result ? $this->unserialize($result) : $default;
-    }
-
-    /**
-     * 写入缓存
-     * @access public
-     * @param  string            $name 缓存变量名
-     * @param  mixed             $value  存储数据
-     * @param  integer|\DateTime $expire  有效时间(秒)
-     * @return bool
-     */
-    public function set($name, $value, $expire = null): bool
-    {
-        $this->writeTimes++;
-
-        if (is_null($expire)) {
-            $expire = $this->options['expire'];
-        }
-
-        $key    = $this->getCacheKey($name);
-        $expire = $this->getExpireTime($expire);
-        $value  = $this->serialize($value);
-
-        if ($this->handler->set($key, $value, $expire)) {
-            return true;
-        }
-
-        return false;
-    }
-
-    /**
-     * 自增缓存(针对数值缓存)
-     * @access public
-     * @param  string $name 缓存变量名
-     * @param  int    $step 步长
-     * @return false|int
-     */
-    public function inc(string $name, int $step = 1)
-    {
-        $this->writeTimes++;
-
-        $key = $this->getCacheKey($name);
-
-        if ($this->handler->get($key)) {
-            return $this->handler->increment($key, $step);
-        }
-
-        return $this->handler->set($key, $step);
-    }
-
-    /**
-     * 自减缓存(针对数值缓存)
-     * @access public
-     * @param  string $name 缓存变量名
-     * @param  int    $step 步长
-     * @return false|int
-     */
-    public function dec(string $name, int $step = 1)
-    {
-        $this->writeTimes++;
-
-        $key   = $this->getCacheKey($name);
-        $value = $this->handler->get($key) - $step;
-        $res   = $this->handler->set($key, $value);
-
-        return !$res ? false : $value;
-    }
-
-    /**
-     * 删除缓存
-     * @access public
-     * @param  string       $name 缓存变量名
-     * @param  bool|false   $ttl
-     * @return bool
-     */
-    public function delete($name, $ttl = false): bool
-    {
-        $this->writeTimes++;
-
-        $key = $this->getCacheKey($name);
-
-        return false === $ttl ?
-        $this->handler->delete($key) :
-        $this->handler->delete($key, $ttl);
-    }
-
-    /**
-     * 清除缓存
-     * @access public
-     * @return bool
-     */
-    public function clear(): bool
-    {
-        $this->writeTimes++;
-
-        return $this->handler->flush();
-    }
-
-    /**
-     * 删除缓存标签
-     * @access public
-     * @param  array $keys 缓存标识列表
-     * @return void
-     */
-    public function clearTag(array $keys): void
-    {
-        $this->handler->deleteMulti($keys);
-    }
-
-}

+ 0 - 244
vendor/topthink/think-cache/src/cache/driver/Redis.php

@@ -1,244 +0,0 @@
-<?php
-// +----------------------------------------------------------------------
-// | ThinkPHP [ WE CAN DO IT JUST THINK ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
-// +----------------------------------------------------------------------
-// | Author: liu21st <liu21st@gmail.com>
-// +----------------------------------------------------------------------
-
-namespace think\cache\driver;
-
-use think\cache\Driver;
-
-/**
- * Redis缓存驱动,适合单机部署、有前端代理实现高可用的场景,性能最好
- * 有需要在业务层实现读写分离、或者使用RedisCluster的需求,请使用Redisd驱动
- *
- * 要求安装phpredis扩展:https://github.com/nicolasff/phpredis
- * @author    尘缘 <130775@qq.com>
- */
-class Redis extends Driver
-{
-    /**
-     * 配置参数
-     * @var array
-     */
-    protected $options = [
-        'host'       => '127.0.0.1',
-        'port'       => 6379,
-        'password'   => '',
-        'select'     => 0,
-        'timeout'    => 0,
-        'expire'     => 0,
-        'persistent' => false,
-        'prefix'     => '',
-        'tag_prefix' => 'tag:',
-        'serialize'  => [],
-    ];
-
-    /**
-     * 架构函数
-     * @access public
-     * @param  array $options 缓存参数
-     */
-    public function __construct(array $options = [])
-    {
-        if (!empty($options)) {
-            $this->options = array_merge($this->options, $options);
-        }
-
-        if (extension_loaded('redis')) {
-            $this->handler = new \Redis;
-
-            if ($this->options['persistent']) {
-                $this->handler->pconnect($this->options['host'], (int) $this->options['port'], $this->options['timeout'], 'persistent_id_' . $this->options['select']);
-            } else {
-                $this->handler->connect($this->options['host'], (int) $this->options['port'], $this->options['timeout']);
-            }
-
-            if ('' != $this->options['password']) {
-                $this->handler->auth($this->options['password']);
-            }
-        } elseif (class_exists('\Predis\Client')) {
-            $params = [];
-            foreach ($this->options as $key => $val) {
-                if (in_array($key, ['aggregate', 'cluster', 'connections', 'exceptions', 'prefix', 'profile', 'replication', 'parameters'])) {
-                    $params[$key] = $val;
-                    unset($this->options[$key]);
-                }
-            }
-
-            if ('' == $this->options['password']) {
-                unset($this->options['password']);
-            }
-
-            $this->handler = new \Predis\Client($this->options, $params);
-
-            $this->options['prefix'] = '';
-        } else {
-            throw new \BadFunctionCallException('not support: redis');
-        }
-
-        if (0 != $this->options['select']) {
-            $this->handler->select($this->options['select']);
-        }
-    }
-
-    /**
-     * 判断缓存
-     * @access public
-     * @param  string $name 缓存变量名
-     * @return bool
-     */
-    public function has($name): bool
-    {
-        return $this->handler->exists($this->getCacheKey($name));
-    }
-
-    /**
-     * 读取缓存
-     * @access public
-     * @param  string $name 缓存变量名
-     * @param  mixed  $default 默认值
-     * @return mixed
-     */
-    public function get($name, $default = false)
-    {
-        $this->readTimes++;
-
-        $value = $this->handler->get($this->getCacheKey($name));
-
-        if (is_null($value) || false === $value) {
-            return $default;
-        }
-
-        return $this->unserialize($value);
-    }
-
-    /**
-     * 写入缓存
-     * @access public
-     * @param  string            $name 缓存变量名
-     * @param  mixed             $value  存储数据
-     * @param  integer|\DateTime $expire  有效时间(秒)
-     * @return bool
-     */
-    public function set($name, $value, $expire = null): bool
-    {
-        $this->writeTimes++;
-
-        if (is_null($expire)) {
-            $expire = $this->options['expire'];
-        }
-
-        $key    = $this->getCacheKey($name);
-        $expire = $this->getExpireTime($expire);
-        $value  = $this->serialize($value);
-
-        if ($expire) {
-            $this->handler->setex($key, $expire, $value);
-        } else {
-            $this->handler->set($key, $value);
-        }
-
-        return true;
-    }
-
-    /**
-     * 自增缓存(针对数值缓存)
-     * @access public
-     * @param  string $name 缓存变量名
-     * @param  int    $step 步长
-     * @return false|int
-     */
-    public function inc(string $name, int $step = 1)
-    {
-        $this->writeTimes++;
-
-        $key = $this->getCacheKey($name);
-
-        return $this->handler->incrby($key, $step);
-    }
-
-    /**
-     * 自减缓存(针对数值缓存)
-     * @access public
-     * @param  string $name 缓存变量名
-     * @param  int    $step 步长
-     * @return false|int
-     */
-    public function dec(string $name, int $step = 1)
-    {
-        $this->writeTimes++;
-
-        $key = $this->getCacheKey($name);
-
-        return $this->handler->decrby($key, $step);
-    }
-
-    /**
-     * 删除缓存
-     * @access public
-     * @param  string $name 缓存变量名
-     * @return bool
-     */
-    public function delete($name): bool
-    {
-        $this->writeTimes++;
-
-        $this->handler->del($this->getCacheKey($name));
-        return true;
-    }
-
-    /**
-     * 清除缓存
-     * @access public
-     * @return bool
-     */
-    public function clear(): bool
-    {
-        $this->writeTimes++;
-
-        $this->handler->flushDB();
-        return true;
-    }
-
-    /**
-     * 删除缓存标签
-     * @access public
-     * @param  array  $keys 缓存标识列表
-     * @return void
-     */
-    public function clearTag(array $keys): void
-    {
-        // 指定标签清除
-        $this->handler->del($keys);
-    }
-
-    /**
-     * 追加(数组)缓存数据
-     * @access public
-     * @param  string $name 缓存标识
-     * @param  mixed  $value 数据
-     * @return void
-     */
-    public function push(string $name, $value): void
-    {
-        $this->handler->sAdd($name, $value);
-    }
-
-    /**
-     * 获取标签包含的缓存标识
-     * @access public
-     * @param  string $tag 缓存标签
-     * @return array
-     */
-    public function getTagItems(string $tag): array
-    {
-        return $this->handler->sMembers($tag);
-    }
-
-}

+ 0 - 174
vendor/topthink/think-cache/src/cache/driver/Wincache.php

@@ -1,174 +0,0 @@
-<?php
-// +----------------------------------------------------------------------
-// | ThinkPHP [ WE CAN DO IT JUST THINK ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
-// +----------------------------------------------------------------------
-// | Author: liu21st <liu21st@gmail.com>
-// +----------------------------------------------------------------------
-
-namespace think\cache\driver;
-
-use think\cache\Driver;
-
-/**
- * Wincache缓存驱动
- */
-class Wincache extends Driver
-{
-    /**
-     * 配置参数
-     * @var array
-     */
-    protected $options = [
-        'prefix'     => '',
-        'expire'     => 0,
-        'tag_prefix' => 'tag:',
-        'serialize'  => [],
-    ];
-
-    /**
-     * 架构函数
-     * @access public
-     * @param  array $options 缓存参数
-     * @throws \BadFunctionCallException
-     */
-    public function __construct(array $options = [])
-    {
-        if (!function_exists('wincache_ucache_info')) {
-            throw new \BadFunctionCallException('not support: WinCache');
-        }
-
-        if (!empty($options)) {
-            $this->options = array_merge($this->options, $options);
-        }
-    }
-
-    /**
-     * 判断缓存
-     * @access public
-     * @param  string $name 缓存变量名
-     * @return bool
-     */
-    public function has($name): bool
-    {
-        $this->readTimes++;
-
-        $key = $this->getCacheKey($name);
-
-        return wincache_ucache_exists($key);
-    }
-
-    /**
-     * 读取缓存
-     * @access public
-     * @param  string $name 缓存变量名
-     * @param  mixed  $default 默认值
-     * @return mixed
-     */
-    public function get($name, $default = false)
-    {
-        $this->readTimes++;
-
-        $key = $this->getCacheKey($name);
-
-        return wincache_ucache_exists($key) ? $this->unserialize(wincache_ucache_get($key)) : $default;
-    }
-
-    /**
-     * 写入缓存
-     * @access public
-     * @param  string            $name 缓存变量名
-     * @param  mixed             $value  存储数据
-     * @param  integer|\DateTime $expire  有效时间(秒)
-     * @return bool
-     */
-    public function set($name, $value, $expire = null): bool
-    {
-        $this->writeTimes++;
-
-        if (is_null($expire)) {
-            $expire = $this->options['expire'];
-        }
-
-        $key    = $this->getCacheKey($name);
-        $expire = $this->getExpireTime($expire);
-        $value  = $this->serialize($value);
-
-        if (wincache_ucache_set($key, $value, $expire)) {
-            return true;
-        }
-
-        return false;
-    }
-
-    /**
-     * 自增缓存(针对数值缓存)
-     * @access public
-     * @param  string    $name 缓存变量名
-     * @param  int       $step 步长
-     * @return false|int
-     */
-    public function inc(string $name, int $step = 1)
-    {
-        $this->writeTimes++;
-
-        $key = $this->getCacheKey($name);
-
-        return wincache_ucache_inc($key, $step);
-    }
-
-    /**
-     * 自减缓存(针对数值缓存)
-     * @access public
-     * @param  string    $name 缓存变量名
-     * @param  int       $step 步长
-     * @return false|int
-     */
-    public function dec(string $name, int $step = 1)
-    {
-        $this->writeTimes++;
-
-        $key = $this->getCacheKey($name);
-
-        return wincache_ucache_dec($key, $step);
-    }
-
-    /**
-     * 删除缓存
-     * @access public
-     * @param  string $name 缓存变量名
-     * @return bool
-     */
-    public function delete($name): bool
-    {
-        $this->writeTimes++;
-
-        return wincache_ucache_delete($this->getCacheKey($name));
-    }
-
-    /**
-     * 清除缓存
-     * @access public
-     * @return bool
-     */
-    public function clear(): bool
-    {
-        $this->writeTimes++;
-        return wincache_ucache_clear();
-    }
-
-    /**
-     * 删除缓存标签
-     * @access public
-     * @param  array $keys 缓存标识列表
-     * @return void
-     */
-    public function clearTag(array $keys): void
-    {
-        wincache_ucache_delete($keys);
-    }
-
-}

+ 0 - 22
vendor/topthink/think-cache/src/exception/InvalidArgumentException.php

@@ -1,22 +0,0 @@
-<?php
-// +----------------------------------------------------------------------
-// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2006-2019 http://thinkphp.cn All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
-// +----------------------------------------------------------------------
-// | Author: liu21st <liu21st@gmail.com>
-// +----------------------------------------------------------------------
-declare (strict_types = 1);
-namespace think\exception;
-
-use Psr\Cache\InvalidArgumentException as Psr6CacheInvalidArgumentInterface;
-use Psr\SimpleCache\InvalidArgumentException as SimpleCacheInvalidArgumentInterface;
-
-/**
- * 非法数据异常
- */
-class InvalidArgumentException extends \InvalidArgumentException implements Psr6CacheInvalidArgumentInterface, SimpleCacheInvalidArgumentInterface
-{
-}

+ 0 - 31
vendor/topthink/think-cache/src/facade/Cache.php

@@ -1,31 +0,0 @@
-<?php
-// +----------------------------------------------------------------------
-// | ThinkPHP [ WE CAN DO IT JUST THINK ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
-// +----------------------------------------------------------------------
-// | Author: liu21st <liu21st@gmail.com>
-// +----------------------------------------------------------------------
-declare (strict_types = 1);
-namespace think\facade;
-
-use think\Facade;
-
-/**
- * @see \think\CacheManager
- * @mixin \think\CacheManager
- */
-class Cache extends Facade
-{
-    /**
-     * 获取当前Facade对应类名(或者已经绑定的容器对象标识)
-     * @access protected
-     * @return string
-     */
-    protected static function getFacadeClass()
-    {
-        return 'think\CacheManager';
-    }
-}

+ 0 - 3
vendor/topthink/think-container/.gitignore

@@ -1,3 +0,0 @@
-.idea
-vendor
-composer.lock

+ 0 - 24
vendor/topthink/think-container/.travis.yml

@@ -1,24 +0,0 @@
-dist: xenial
-language: php
-
-matrix:
-  fast_finish: true
-  include:
-    - php: 7.1
-    - php: 7.2
-    - php: 7.3
-
-cache:
-  directories:
-    - $HOME/.composer/cache
-
-
-install:
-  - travis_retry composer update --prefer-dist --no-interaction --prefer-stable --no-suggest
-
-script:
-  - vendor/bin/phpunit --coverage-clover build/logs/coverage.xml
-
-after_script:
-  - travis_retry wget https://scrutinizer-ci.com/ocular.phar
-  - php ocular.phar code-coverage:upload --format=php-clover build/logs/coverage.xml

+ 0 - 201
vendor/topthink/think-container/LICENSE

@@ -1,201 +0,0 @@
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "{}"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright {yyyy} {name of copyright owner}
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.

+ 0 - 98
vendor/topthink/think-container/README.md

@@ -1,98 +0,0 @@
-PHP Container & Facade Manager( Support PSR-11)
-===============
-
-[![Build Status](https://travis-ci.org/top-think/think-container.svg?branch=2.0)](https://travis-ci.org/top-think/think-container)
-[![Latest Stable Version](https://poser.pugx.org/topthink/think-container/v/stable)](https://packagist.org/packages/topthink/think-container)
-[![PHP Version](https://img.shields.io/badge/php-%3E%3D7.1-8892BF.svg)](http://www.php.net/)
-
-## 安装
-~~~
-composer require topthink/think-container
-~~~
-
-## 特性
-
-* 支持PSR-11规范
-* 支持依赖注入
-* 支持Facade门面
-* 支持容器对象绑定
-* 支持闭包绑定
-* 支持接口绑定
-
-## Container
-~~~
-// 获取容器实例
-$container = \think\Container::getInstance();
-// 绑定一个类、闭包、实例、接口实现到容器
-$container->bind('cache', '\app\common\Cache');
-// 判断是否存在对象实例
-$container->has('cache');
-// 从容器中获取对象的唯一实例
-$container->get('cache');
-// 从容器中获取对象,没有则自动实例化
-$container->make('cache');
-// 删除容器中的对象实例
-$container->delete('cache');
-// 执行某个方法或者闭包 支持依赖注入
-$container->invoke($callable, $vars);
-// 执行某个类的实例化 支持依赖注入
-$container->invokeClass($class, $vars);
-// 静态方法获取容器对象实例 不存在则自动实例化
-\think\Container::pull('cache');
-~~~
-
-对象化操作
-~~~
-// 获取容器实例
-$container = \think\Container::getInstance();
-// 绑定一个类、闭包、实例、接口实现到容器
-$container->cache = '\app\common\Cache';
-// 判断是否存在对象实例
-isset($container->cache);
-// 从容器中获取对象的唯一实例
-$container->cache;
-// 删除容器中的对象实例
-unset($container->cache);
-~~~
-
-## Facade
-
-
-定义一个`app\facade\App`类之后,即可以静态方式调用`\think\App`类的动态方法
-~~~
-<?php
-namespace think;
-class App 
-{
-	public function name(){
-		return 'app';
-	}
-}
-~~~
-
-~~~
-<?php
-namespace app\facade;
-
-use think\Facade;
-
-class App extends Facade
-{
-    /**
-     * 获取当前Facade对应类名
-     * @access protected
-     * @return string
-     */
-    protected static function getFacadeClass()
-    {
-	return '\think\App';
-    }
-}
-~~~
-
-然后就可以静态方式调用动态方法了
-~~~
-use app\facade\App;
-
-echo App::name(); // app
-~~~

+ 0 - 26
vendor/topthink/think-container/composer.json

@@ -1,26 +0,0 @@
-{
-    "name": "topthink/think-container",
-    "description": "PHP Container & Facade Manager",
-    "license": "Apache-2.0",
-    "authors": [
-        {
-            "name": "liu21st",
-            "email": "liu21st@gmail.com"
-        }
-    ],
-    "require": {
-    	"php": ">=7.1.0",
-        "psr/container": "~1.0",
-        "topthink/think-helper": "^3.1"
-    },
-    "require-dev": {
-        "phpunit/phpunit": "^7.0"
-    },    
-    "autoload": {
-        "psr-4": {
-            "think\\": "src"
-        },
-        "files": [
-        ]
-    }
-}

+ 0 - 25
vendor/topthink/think-container/phpunit.xml.dist

@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<phpunit backupGlobals="false"
-         backupStaticAttributes="false"
-         beStrictAboutTestsThatDoNotTestAnything="false"
-         bootstrap="tests/bootstrap.php"
-         colors="true"
-         convertErrorsToExceptions="true"
-         convertNoticesToExceptions="true"
-         convertWarningsToExceptions="true"
-         processIsolation="false"
-         stopOnError="false"
-         stopOnFailure="false"
-         verbose="true"
->
-    <testsuites>
-        <testsuite name="ThinkPHP Test Suite">
-            <directory suffix="Test.php">./tests</directory>
-        </testsuite>
-    </testsuites>
-    <filter>
-        <whitelist processUncoveredFilesFromWhitelist="true">
-            <directory suffix=".php">./src</directory>
-        </whitelist>
-    </filter>
-</phpunit>

+ 0 - 598
vendor/topthink/think-container/src/Container.php

@@ -1,598 +0,0 @@
-<?php
-// +----------------------------------------------------------------------
-// | ThinkPHP [ WE CAN DO IT JUST THINK ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
-// +----------------------------------------------------------------------
-// | Author: liu21st <liu21st@gmail.com>
-// +----------------------------------------------------------------------
-declare (strict_types = 1);
-
-namespace think;
-
-use ArrayAccess;
-use ArrayIterator;
-use Closure;
-use Countable;
-use Exception;
-use InvalidArgumentException;
-use IteratorAggregate;
-use Psr\Container\ContainerInterface;
-use ReflectionClass;
-use ReflectionException;
-use ReflectionFunction;
-use ReflectionMethod;
-use think\exception\ClassNotFoundException;
-
-/**
- * 容器管理类 支持PSR-11
- */
-class Container implements ContainerInterface, ArrayAccess, IteratorAggregate, Countable
-{
-    /**
-     * 容器对象实例
-     * @var Container|Closure
-     */
-    protected static $instance;
-
-    /**
-     * 容器中的对象实例
-     * @var array
-     */
-    protected $instances = [];
-
-    /**
-     * 容器绑定标识
-     * @var array
-     */
-    protected $bind = [];
-
-    /**
-     * 容器回调
-     * @var array
-     */
-    protected $invokeCallback = [];
-
-    /**
-     * 获取当前容器的实例(单例)
-     * @access public
-     * @return static
-     */
-    public static function getInstance()
-    {
-        if (is_null(static::$instance)) {
-            static::$instance = new static;
-        }
-
-        if (static::$instance instanceof Closure) {
-            return (static::$instance)();
-        }
-
-        return static::$instance;
-    }
-
-    /**
-     * 设置当前容器的实例
-     * @access public
-     * @param object|Closure $instance
-     * @return void
-     */
-    public static function setInstance($instance): void
-    {
-        static::$instance = $instance;
-    }
-
-    /**
-     * 注册一个容器对象回调
-     *
-     * @param  string|Closure $abstract
-     * @param  Closure|null   $callback
-     * @return void
-     */
-    public function resolving($abstract, Closure $callback = null): void
-    {
-        if ($abstract instanceof Closure) {
-            $this->invokeCallback['*'][] = $abstract;
-            return;
-        }
-
-        if (isset($this->bind[$abstract])) {
-            $abstract = $this->bind[$abstract];
-        }
-
-        $this->invokeCallback[$abstract][] = $callback;
-    }
-
-    /**
-     * 获取容器中的对象实例 不存在则创建
-     * @access public
-     * @param string     $abstract    类名或者标识
-     * @param array|true $vars        变量
-     * @param bool       $newInstance 是否每次创建新的实例
-     * @return object
-     */
-    public static function pull(string $abstract, array $vars = [], bool $newInstance = false)
-    {
-        return static::getInstance()->make($abstract, $vars, $newInstance);
-    }
-
-    /**
-     * 获取容器中的对象实例
-     * @access public
-     * @param string $abstract 类名或者标识
-     * @return object
-     */
-    public function get($abstract)
-    {
-        if ($this->has($abstract)) {
-            return $this->make($abstract);
-        }
-
-        throw new ClassNotFoundException('class not exists: ' . $abstract, $abstract);
-    }
-
-    /**
-     * 绑定一个类、闭包、实例、接口实现到容器
-     * @access public
-     * @param string|array $abstract 类标识、接口
-     * @param mixed        $concrete 要绑定的类、闭包或者实例
-     * @return $this
-     */
-    public function bind($abstract, $concrete = null)
-    {
-        if (is_array($abstract)) {
-            $this->bind = array_merge($this->bind, $abstract);
-        } elseif ($concrete instanceof Closure) {
-            $this->bind[$abstract] = $concrete;
-        } elseif (is_object($concrete)) {
-            $this->instance($abstract, $concrete);
-        } else {
-            $this->bind[$abstract] = $concrete;
-        }
-
-        return $this;
-    }
-
-    /**
-     * 绑定一个类实例到容器
-     * @access public
-     * @param string $abstract 类名或者标识
-     * @param object $instance 类的实例
-     * @return $this
-     */
-    public function instance(string $abstract, $instance)
-    {
-        if (isset($this->bind[$abstract])) {
-            $bind = $this->bind[$abstract];
-
-            if (is_string($bind)) {
-                return $this->instance($bind, $instance);
-            }
-        }
-
-        $this->instances[$abstract] = $instance;
-
-        return $this;
-    }
-
-    /**
-     * 判断容器中是否存在类及标识
-     * @access public
-     * @param string $abstract 类名或者标识
-     * @return bool
-     */
-    public function bound(string $abstract): bool
-    {
-        return isset($this->bind[$abstract]) || isset($this->instances[$abstract]);
-    }
-
-    /**
-     * 判断容器中是否存在类及标识
-     * @access public
-     * @param string $name 类名或者标识
-     * @return bool
-     */
-    public function has($name): bool
-    {
-        return $this->bound($name);
-    }
-
-    /**
-     * 判断容器中是否存在对象实例
-     * @access public
-     * @param string $abstract 类名或者标识
-     * @return bool
-     */
-    public function exists(string $abstract): bool
-    {
-        if (isset($this->bind[$abstract])) {
-            $bind = $this->bind[$abstract];
-
-            if (is_string($bind)) {
-                return $this->exists($bind);
-            }
-        }
-
-        return isset($this->instances[$abstract]);
-    }
-
-    /**
-     * 创建类的实例 已经存在则直接获取
-     * @access public
-     * @param string $abstract    类名或者标识
-     * @param array  $vars        变量
-     * @param bool   $newInstance 是否每次创建新的实例
-     * @return mixed
-     */
-    public function make(string $abstract, array $vars = [], bool $newInstance = false)
-    {
-        if (isset($this->instances[$abstract]) && !$newInstance) {
-            return $this->instances[$abstract];
-        }
-
-        if (isset($this->bind[$abstract])) {
-            $concrete = $this->bind[$abstract];
-
-            if ($concrete instanceof Closure) {
-                $object = $this->invokeFunction($concrete, $vars);
-            } else {
-                return $this->make($concrete, $vars, $newInstance);
-            }
-        } else {
-            $object = $this->invokeClass($abstract, $vars);
-        }
-
-        if (!$newInstance) {
-            $this->instances[$abstract] = $object;
-        }
-
-        return $object;
-    }
-
-    /**
-     * 删除容器中的对象实例
-     * @access public
-     * @param string $name 类名或者标识
-     * @return void
-     */
-    public function delete($name)
-    {
-        if (isset($this->bind[$name])) {
-            $bind = $this->bind[$name];
-
-            if (is_string($bind)) {
-                $this->delete($bind);
-                return;
-            }
-        }
-
-        if (isset($this->instances[$name])) {
-            unset($this->instances[$name]);
-        }
-    }
-
-    /**
-     * 执行函数或者闭包方法 支持参数调用
-     * @access public
-     * @param string|array|Closure $function 函数或者闭包
-     * @param array $vars     参数
-     * @return mixed
-     */
-    public function invokeFunction($function, array $vars = [])
-    {
-        try {
-            $reflect = new ReflectionFunction($function);
-
-            $args = $this->bindParams($reflect, $vars);
-
-            if ($reflect->isClosure()) {
-                // 解决在`php7.1`调用时会产生`$this`上下文不存在的错误 (https://bugs.php.net/bug.php?id=66430)
-                return $function->__invoke(...$args);
-            } else {
-                return $reflect->invokeArgs($args);
-            }
-        } catch (ReflectionException $e) {
-            // 如果是调用闭包时发生错误则尝试获取闭包的真实位置
-            if (isset($reflect) && $reflect->isClosure() && $function instanceof Closure) {
-                $function = "{Closure}@{$reflect->getFileName()}#L{$reflect->getStartLine()}-{$reflect->getEndLine()}";
-            } else {
-                $function .= '()';
-            }
-            throw new Exception('function not exists: ' . $function, 0, $e);
-        }
-    }
-
-    /**
-     * 调用反射执行类的方法 支持参数绑定
-     * @access public
-     * @param mixed $method 方法
-     * @param array $vars   参数
-     * @return mixed
-     */
-    public function invokeMethod($method, array $vars = [])
-    {
-        try {
-            if (is_array($method)) {
-                $class   = is_object($method[0]) ? $method[0] : $this->invokeClass($method[0]);
-                $reflect = new ReflectionMethod($class, $method[1]);
-            } else {
-                // 静态方法
-                $reflect = new ReflectionMethod($method);
-            }
-
-            $args = $this->bindParams($reflect, $vars);
-
-            return $reflect->invokeArgs($class ?? null, $args);
-        } catch (ReflectionException $e) {
-            if (is_array($method)) {
-                $class    = is_object($method[0]) ? get_class($method[0]) : $method[0];
-                $callback = $class . '::' . $method[1];
-            } else {
-                $callback = $method;
-            }
-
-            throw new Exception('method not exists: ' . $callback . '()', 0, $e);
-        }
-    }
-
-    /**
-     * 调用反射执行类的方法 支持参数绑定
-     * @access public
-     * @param object $instance 对象实例
-     * @param mixed  $reflect  反射类
-     * @param array  $vars     参数
-     * @return mixed
-     */
-    public function invokeReflectMethod($instance, $reflect, array $vars = [])
-    {
-        $args = $this->bindParams($reflect, $vars);
-
-        return $reflect->invokeArgs($instance, $args);
-    }
-
-    /**
-     * 调用反射执行callable 支持参数绑定
-     * @access public
-     * @param mixed $callable
-     * @param array $vars 参数
-     * @return mixed
-     */
-    public function invoke($callable, array $vars = [])
-    {
-        if ($callable instanceof Closure) {
-            return $this->invokeFunction($callable, $vars);
-        }
-
-        return $this->invokeMethod($callable, $vars);
-    }
-
-    /**
-     * 调用反射执行类的实例化 支持依赖注入
-     * @access public
-     * @param string $class 类名
-     * @param array  $vars  参数
-     * @return mixed
-     */
-    public function invokeClass(string $class, array $vars = [])
-    {
-        try {
-            $reflect = new ReflectionClass($class);
-
-            if ($reflect->hasMethod('__make')) {
-                $method = new ReflectionMethod($class, '__make');
-
-                if ($method->isPublic() && $method->isStatic()) {
-                    $args = $this->bindParams($method, $vars);
-                    return $method->invokeArgs(null, $args);
-                }
-            }
-
-            $constructor = $reflect->getConstructor();
-
-            $args = $constructor ? $this->bindParams($constructor, $vars) : [];
-
-            $object = $reflect->newInstanceArgs($args);
-
-            $this->invokeAfter($class, $object);
-
-            return $object;
-        } catch (ReflectionException $e) {
-            throw new ClassNotFoundException('class not exists: ' . $class, $class, $e);
-        }
-    }
-
-    /**
-     * 执行invokeClass回调
-     * @access protected
-     * @param string $class  对象类名
-     * @param object $object 容器对象实例
-     * @return void
-     */
-    protected function invokeAfter(string $class, $object): void
-    {
-        if (isset($this->invokeCallback['*'])) {
-            foreach ($this->invokeCallback['*'] as $callback) {
-                $callback($object, $this);
-            }
-        }
-
-        if (isset($this->invokeCallback[$class])) {
-            foreach ($this->invokeCallback[$class] as $callback) {
-                $callback($object, $this);
-            }
-        }
-    }
-
-    /**
-     * 绑定参数
-     * @access protected
-     * @param \ReflectionMethod|\ReflectionFunction $reflect 反射类
-     * @param array                                 $vars    参数
-     * @return array
-     */
-    protected function bindParams($reflect, array $vars = []): array
-    {
-        if ($reflect->getNumberOfParameters() == 0) {
-            return [];
-        }
-
-        // 判断数组类型 数字数组时按顺序绑定参数
-        reset($vars);
-        $type   = key($vars) === 0 ? 1 : 0;
-        $params = $reflect->getParameters();
-        $args   = [];
-
-        foreach ($params as $param) {
-            $name      = $param->getName();
-            $lowerName = self::parseName($name);
-            $class     = $param->getClass();
-
-            if ($class) {
-                $args[] = $this->getObjectParam($class->getName(), $vars);
-            } elseif (1 == $type && !empty($vars)) {
-                $args[] = array_shift($vars);
-            } elseif (0 == $type && isset($vars[$name])) {
-                $args[] = $vars[$name];
-            } elseif (0 == $type && isset($vars[$lowerName])) {
-                $args[] = $vars[$lowerName];
-            } elseif ($param->isDefaultValueAvailable()) {
-                $args[] = $param->getDefaultValue();
-            } else {
-                throw new InvalidArgumentException('method param miss:' . $name);
-            }
-        }
-
-        return $args;
-    }
-
-    /**
-     * 字符串命名风格转换
-     * type 0 将Java风格转换为C的风格 1 将C风格转换为Java的风格
-     * @deprecated
-     * @access public
-     * @param string  $name    字符串
-     * @param integer $type    转换类型
-     * @param bool    $ucfirst 首字母是否大写(驼峰规则)
-     * @return string
-     */
-    public static function parseName(string $name = null, int $type = 0, bool $ucfirst = true): string
-    {
-        if ($type) {
-            $name = preg_replace_callback('/_([a-zA-Z])/', function ($match) {
-                return strtoupper($match[1]);
-            }, $name);
-            return $ucfirst ? ucfirst($name) : lcfirst($name);
-        }
-
-        return strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $name), "_"));
-    }
-
-    /**
-     * 获取类名(不包含命名空间)
-     * @deprecated
-     * @access public
-     * @param string|object $class
-     * @return string
-     */
-    public static function classBaseName($class): string
-    {
-        $class = is_object($class) ? get_class($class) : $class;
-        return basename(str_replace('\\', '/', $class));
-    }
-
-    /**
-     * 创建工厂对象实例
-     * @deprecated
-     * @access public
-     * @param string $name      工厂类名
-     * @param string $namespace 默认命名空间
-     * @param array  $args
-     * @return mixed
-     */
-    public static function factory(string $name, string $namespace = '', ...$args)
-    {
-        $class = false !== strpos($name, '\\') ? $name : $namespace . ucwords($name);
-
-        if (class_exists($class)) {
-            return Container::getInstance()->invokeClass($class, $args);
-        }
-
-        throw new ClassNotFoundException('class not exists:' . $class, $class);
-    }
-
-    /**
-     * 获取对象类型的参数值
-     * @access protected
-     * @param string $className 类名
-     * @param array  $vars      参数
-     * @return mixed
-     */
-    protected function getObjectParam(string $className, array &$vars)
-    {
-        $array = $vars;
-        $value = array_shift($array);
-
-        if ($value instanceof $className) {
-            $result = $value;
-            array_shift($vars);
-        } else {
-            $result = $this->make($className);
-        }
-
-        return $result;
-    }
-
-    public function __set($name, $value)
-    {
-        $this->bind($name, $value);
-    }
-
-    public function __get($name)
-    {
-        return $this->get($name);
-    }
-
-    public function __isset($name): bool
-    {
-        return $this->exists($name);
-    }
-
-    public function __unset($name)
-    {
-        $this->delete($name);
-    }
-
-    public function offsetExists($key)
-    {
-        return $this->exists($key);
-    }
-
-    public function offsetGet($key)
-    {
-        return $this->make($key);
-    }
-
-    public function offsetSet($key, $value)
-    {
-        $this->bind($key, $value);
-    }
-
-    public function offsetUnset($key)
-    {
-        $this->delete($key);
-    }
-
-    //Countable
-    public function count()
-    {
-        return count($this->instances);
-    }
-
-    //IteratorAggregate
-    public function getIterator()
-    {
-        return new ArrayIterator($this->instances);
-    }
-}

+ 0 - 98
vendor/topthink/think-container/src/Facade.php

@@ -1,98 +0,0 @@
-<?php
-// +----------------------------------------------------------------------
-// | ThinkPHP [ WE CAN DO IT JUST THINK ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
-// +----------------------------------------------------------------------
-// | Author: liu21st <liu21st@gmail.com>
-// +----------------------------------------------------------------------
-namespace think;
-
-/**
- * Facade管理类
- */
-class Facade
-{
-    /**
-     * 始终创建新的对象实例
-     * @var bool
-     */
-    protected static $alwaysNewInstance;
-
-    /**
-     * 创建Facade实例
-     * @static
-     * @access protected
-     * @param  string $class       类名或标识
-     * @param  array  $args        变量
-     * @param  bool   $newInstance 是否每次创建新的实例
-     * @return object
-     */
-    protected static function createFacade(string $class = '', array $args = [], bool $newInstance = false)
-    {
-        $class = $class ?: static::class;
-
-        $facadeClass = static::getFacadeClass();
-
-        if ($facadeClass) {
-            $class = $facadeClass;
-        }
-
-        if (static::$alwaysNewInstance) {
-            $newInstance = true;
-        }
-
-        return Container::getInstance()->make($class, $args, $newInstance);
-    }
-
-    /**
-     * 获取当前Facade对应类名
-     * @access protected
-     * @return string
-     */
-    protected static function getFacadeClass()
-    {}
-
-    /**
-     * 带参数实例化当前Facade类
-     * @access public
-     * @return object
-     */
-    public static function instance(...$args)
-    {
-        if (__CLASS__ != static::class) {
-            return self::createFacade('', $args);
-        }
-    }
-
-    /**
-     * 调用类的实例
-     * @access public
-     * @param  string     $class       类名或者标识
-     * @param  array|true $args        变量
-     * @param  bool       $newInstance 是否每次创建新的实例
-     * @return object
-     */
-    public static function make(string $class, $args = [], $newInstance = false)
-    {
-        if (__CLASS__ != static::class) {
-            return self::__callStatic('make', func_get_args());
-        }
-
-        if (true === $args) {
-            // 总是创建新的实例化对象
-            $newInstance = true;
-            $args        = [];
-        }
-
-        return self::createFacade($class, $args, $newInstance);
-    }
-
-    // 调用实际类的方法
-    public static function __callStatic($method, $params)
-    {
-        return call_user_func_array([static::createFacade(), $method], $params);
-    }
-}

+ 0 - 39
vendor/topthink/think-container/src/exception/ClassNotFoundException.php

@@ -1,39 +0,0 @@
-<?php
-// +----------------------------------------------------------------------
-// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
-// +----------------------------------------------------------------------
-// | Author: yunwuxin <448901948@qq.com>
-// +----------------------------------------------------------------------
-
-namespace think\exception;
-
-use Psr\Container\NotFoundExceptionInterface;
-use RuntimeException;
-use Throwable;
-
-class ClassNotFoundException extends RuntimeException implements NotFoundExceptionInterface
-{
-    protected $class;
-
-    public function __construct(string $message, string $class = '', Throwable $previous = null)
-    {
-        $this->message = $message;
-        $this->class   = $class;
-
-        parent::__construct($message, 0, $previous);
-    }
-
-    /**
-     * 获取类名
-     * @access public
-     * @return string
-     */
-    public function getClass()
-    {
-        return $this->class;
-    }
-}

+ 0 - 290
vendor/topthink/think-container/tests/ContainerTest.php

@@ -1,290 +0,0 @@
-<?php
-
-namespace think\tests;
-
-use Exception;
-use PHPUnit\Framework\TestCase;
-use ReflectionMethod;
-use stdClass;
-use think\Container;
-use think\exception\ClassNotFoundException;
-
-class Taylor
-{
-    public $name;
-
-    public function __construct($name)
-    {
-        $this->name = $name;
-    }
-
-    public function some(Container $container)
-    {
-
-    }
-
-    public static function test(Container $container)
-    {
-        return $container;
-    }
-
-    public static function __make()
-    {
-        return new self('Taylor');
-    }
-}
-
-class SomeClass
-{
-    public $container;
-
-    public function __construct(Container $container)
-    {
-        $this->container = $container;
-    }
-}
-
-class ContainerTest extends TestCase
-{
-    protected function tearDown(): void
-    {
-        Container::setInstance(null);
-    }
-
-    public function testClosureResolution()
-    {
-        $container = new Container;
-
-        Container::setInstance($container);
-
-        $container->bind('name', function () {
-            return 'Taylor';
-        });
-
-        $this->assertEquals('Taylor', $container->make('name'));
-
-        $this->assertEquals('Taylor', Container::pull('name'));
-    }
-
-    public function testGet()
-    {
-        $container = new Container;
-
-        $this->expectException(ClassNotFoundException::class);
-        $this->expectExceptionMessage('class not exists: name');
-        $container->get('name');
-
-        $container->bind('name', function () {
-            return 'Taylor';
-        });
-
-        $this->assertSame('Taylor', $container->get('name'));
-    }
-
-    public function testExist()
-    {
-        $container = new Container;
-
-        $container->bind('name', function () {
-            return 'Taylor';
-        });
-
-        $this->assertFalse($container->exists("name"));
-
-        $container->make('name');
-
-        $this->assertTrue($container->exists('name'));
-    }
-
-    public function testInstance()
-    {
-        $container = new Container;
-
-        $container->bind('name', function () {
-            return 'Taylor';
-        });
-
-        $this->assertEquals('Taylor', $container->get('name'));
-
-        $container->bind('name2', Taylor::class);
-
-        $object = new stdClass();
-
-        $this->assertFalse($container->exists('name2'));
-
-        $container->instance('name2', $object);
-
-        $this->assertTrue($container->exists('name2'));
-
-        $this->assertTrue($container->exists(Taylor::class));
-
-        $this->assertEquals($object, $container->make(Taylor::class));
-
-        unset($container->name1);
-
-        $this->assertFalse($container->exists('name1'));
-
-        $container->delete('name2');
-
-        $this->assertFalse($container->exists('name2'));
-
-        foreach ($container as $class => $instance) {
-
-        }
-    }
-
-    public function testBind()
-    {
-        $container = new Container;
-
-        $object = new stdClass();
-
-        $container->bind(['name' => Taylor::class]);
-
-        $container->bind('name2', $object);
-
-        $container->bind('name3', Taylor::class);
-
-        $container->name4 = $object;
-
-        $container['name5'] = $object;
-
-        $this->assertTrue(isset($container->name4));
-
-        $this->assertTrue(isset($container['name5']));
-
-        $this->assertInstanceOf(Taylor::class, $container->get('name'));
-
-        $this->assertSame($object, $container->get('name2'));
-
-        $this->assertSame($object, $container->name4);
-
-        $this->assertSame($object, $container['name5']);
-
-        $this->assertInstanceOf(Taylor::class, $container->get('name3'));
-
-        unset($container['name']);
-
-        $this->assertFalse(isset($container['name']));
-
-        unset($container->name3);
-
-        $this->assertFalse(isset($container->name3));
-    }
-
-    public function testAutoConcreteResolution()
-    {
-        $container = new Container;
-
-        $taylor = $container->make(Taylor::class);
-
-        $this->assertInstanceOf(Taylor::class, $taylor);
-        $this->assertAttributeSame('Taylor', 'name', $taylor);
-    }
-
-    public function testGetAndSetInstance()
-    {
-        $this->assertInstanceOf(Container::class, Container::getInstance());
-
-        $object = new stdClass();
-
-        Container::setInstance($object);
-
-        $this->assertSame($object, Container::getInstance());
-
-        Container::setInstance(function () {
-            return $this;
-        });
-
-        $this->assertSame($this, Container::getInstance());
-    }
-
-    public function testInvokeFunctionWithoutMethodThrowsException()
-    {
-        $this->expectException(Exception::class);
-        $this->expectExceptionMessage('function not exists: ContainerTestCallStub()');
-        $container = new Container;
-        $container->invokeFunction('ContainerTestCallStub', []);
-    }
-
-    public function testInvokeClosureFunctionWithoutMethodThrowsException()
-    {
-        $this->expectException(Exception::class);
-        $this->expectExceptionMessageRegExp('/function not exists: {Closure}@.+#L\d+-\d+/');
-        $container = new Container;
-        $container->invokeFunction(function () {
-            throw new \ReflectionException('test exception');
-        });
-    }
-
-    public function testInvoke()
-    {
-        $container = new Container();
-
-        Container::setInstance($container);
-
-        $container->bind(Container::class, $container);
-
-        $stub = $this->createMock(Taylor::class);
-
-        $stub->expects($this->once())->method('some')->with($container)->will($this->returnSelf());
-
-        $container->invokeMethod([$stub, 'some']);
-
-        $this->assertSame($container, $container->invokeMethod(Taylor::class . '::test'));
-
-        $reflect = new ReflectionMethod($container, 'exists');
-
-        $this->assertTrue($container->invokeReflectMethod($container, $reflect, [Container::class]));
-
-        $this->assertSame($container, $container->invoke(function (Container $container) {
-            return $container;
-        }));
-
-        $this->assertSame($container, $container->invoke(Taylor::class . '::test'));
-
-        $object = $container->invokeClass(SomeClass::class);
-        $this->assertInstanceOf(SomeClass::class, $object);
-        $this->assertSame($container, $object->container);
-
-        $stdClass = new stdClass();
-
-        $container->invoke(function (Container $container, stdClass $stdObject, $key1, $lowKey, $key2 = 'default') use ($stdClass) {
-            $this->assertEquals('value1', $key1);
-            $this->assertEquals('default', $key2);
-            $this->assertEquals('value2', $lowKey);
-            $this->assertSame($stdClass, $stdObject);
-            return $container;
-        }, ['some' => $stdClass, 'key1' => 'value1', 'low_key' => 'value2']);
-    }
-
-    public function testInvokeMethodNotExists()
-    {
-        $container = $this->resolveContainer();
-        $this->expectException(Exception::class);
-
-        $container->invokeMethod([SomeClass::class, 'any']);
-    }
-
-    public function testInvokeClassNotExists()
-    {
-        $container = new Container();
-
-        Container::setInstance($container);
-
-        $container->bind(Container::class, $container);
-
-        $this->expectExceptionObject(new ClassNotFoundException('class not exists: SomeClass'));
-
-        $container->invokeClass('SomeClass');
-    }
-
-    protected function resolveContainer()
-    {
-        $container = new Container();
-
-        Container::setInstance($container);
-        return $container;
-    }
-
-}

+ 0 - 3
vendor/topthink/think-container/tests/bootstrap.php

@@ -1,3 +0,0 @@
-<?php
-
-require __DIR__.'/../vendor/autoload.php';

+ 0 - 1
vendor/topthink/think-log/.gitignore

@@ -1 +0,0 @@
-.idea

+ 0 - 201
vendor/topthink/think-log/LICENSE

@@ -1,201 +0,0 @@
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "{}"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright {yyyy} {name of copyright owner}
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.

+ 0 - 38
vendor/topthink/think-log/README.md

@@ -1,38 +0,0 @@
-# think-log
-
-写入LOG日志,要求PHP7.1+。
-
-## 主要特性
-
-* 多通道日志写入
-* 日志实时/延时写入
-* 日志信息格式化
-* 日志信息处理机制
-* JSON格式支持
-* 日志自动清理
-
-## 安装
-
-~~~
-composer require topthink/think-log
-~~~
-
-## 用法
-
-~~~php
-use think\facade\Log;
-
-Log::init([
-	'default'	=>	'file',
-	'channels'	=>	[
-		'file'	=>	[
-			'type'	=>	'file',
-			'path'	=>	'./logs/',
-		],
-	],
-]);
-
-Log::error('error info');
-Log::info('log info');
-Log::save();
-~~~

+ 0 - 21
vendor/topthink/think-log/composer.json

@@ -1,21 +0,0 @@
-{
-    "name": "topthink/think-log",
-    "description": "think log",
-    "license": "Apache-2.0",
-    "authors": [
-        {
-            "name": "liu21st",
-            "email": "liu21st@gmail.com"
-        }
-    ],
-    "require": {
-	   "php": ">=7.1.0",
-       "psr/log": "~1.0",
-       "topthink/think-container": "^2.0"
-    },
-    "autoload": {
-        "psr-4": {
-            "think\\": "src"
-        }
-    }
-}

+ 0 - 510
vendor/topthink/think-log/src/LogManager.php

@@ -1,510 +0,0 @@
-<?php
-// +----------------------------------------------------------------------
-// | ThinkPHP [ WE CAN DO IT JUST THINK ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
-// +----------------------------------------------------------------------
-// | Author: liu21st <liu21st@gmail.com>
-// +----------------------------------------------------------------------
-declare (strict_types = 1);
-
-namespace think;
-
-use InvalidArgumentException;
-use Psr\Log\LoggerInterface;
-use think\Container;
-
-/**
- * 日志管理类
- */
-class LogManager implements LoggerInterface
-{
-    const EMERGENCY = 'emergency';
-    const ALERT     = 'alert';
-    const CRITICAL  = 'critical';
-    const ERROR     = 'error';
-    const WARNING   = 'warning';
-    const NOTICE    = 'notice';
-    const INFO      = 'info';
-    const DEBUG     = 'debug';
-    const SQL       = 'sql';
-
-    /**
-     * 日志信息
-     * @var array
-     */
-    protected $log = [];
-
-    /**
-     * 日志通道
-     * @var array
-     */
-    protected $channel = [];
-
-    /**
-     * 配置参数
-     * @var array
-     */
-    protected $config = [];
-
-    /**
-     * 日志写入驱动
-     * @var array
-     */
-    protected $driver = [];
-
-    /**
-     * 日志处理
-     *
-     * @var array
-     */
-    protected $processor = [];
-
-    /**
-     * 关闭日志(渠道)
-     * @var array
-     */
-    protected $close = [];
-
-    /**
-     * (通道)允许写入类型
-     * @var array
-     */
-    protected $allow = [];
-
-    /**
-     * 是否控制台执行
-     * @var bool
-     */
-    protected $isCli = false;
-
-    /**
-     * 初始化
-     * @access public
-     */
-    public function init(array $config = [])
-    {
-        $this->config = $config;
-
-        if (isset($this->config['processor'])) {
-            $this->processor($this->config['processor']);
-        }
-
-        if (!empty($this->config['close'])) {
-            $this->close['*'] = true;
-        }
-
-        if (!empty($this->config['level'])) {
-            $this->allow['*'] = $this->config['level'];
-        }
-
-        $this->isCli = $this->runningInConsole();
-        $this->channel();
-    }
-
-    /**
-     * 是否运行在命令行下
-     * @return bool
-     */
-    public function runningInConsole()
-    {
-        return php_sapi_name() === 'cli' || php_sapi_name() === 'phpdbg';
-    }
-
-    /**
-     * 获取日志配置
-     * @access public
-     * @return array
-     */
-    public function getConfig(): array
-    {
-        return $this->config;
-    }
-
-    /**
-     * 注册一个日志回调处理
-     *
-     * @param  callable $callback 回调
-     * @param  string   $channel  日志通道名
-     * @return void
-     */
-    public function processor(callable $callback, string $channel = '*'): void
-    {
-        $this->processor[$channel][] = $callback;
-    }
-
-    /**
-     * 切换日志通道
-     * @access public
-     * @param  string|array $name 日志通道名
-     * @return $this
-     */
-    public function channel($name = '')
-    {
-        if ('' == $name) {
-            $name = $this->config['default'] ?? 'think';
-        }
-
-        $names = (array) $name;
-
-        foreach ($names as $name) {
-            if (!isset($this->config['channels'][$name])) {
-                throw new InvalidArgumentException('Undefined log config:' . $name);
-            }
-
-            $config = $this->config['channels'][$name];
-
-            if (!empty($config['processor'])) {
-                $this->processor($config['processor'], $name);
-            }
-
-            if (!empty($config['close'])) {
-                $this->close[$name] = true;
-            }
-
-            if (!empty($config['level'])) {
-                $this->allow[$name] = $config['level'];
-            }
-        }
-
-        $this->channel = $names;
-        return $this;
-    }
-
-    /**
-     * 实例化日志写入驱动
-     * @access public
-     * @param  string $name 日志通道名
-     * @return object
-     */
-    protected function driver(string $name)
-    {
-        if (!isset($this->driver[$name])) {
-            $config = $this->config['channels'][$name];
-            $type   = !empty($config['type']) ? $config['type'] : 'File';
-
-            $config['is_cli'] = $this->isCli;
-
-            $this->driver[$name] = Container::factory($type, '\\think\\log\\driver\\', $config);
-        }
-
-        return $this->driver[$name];
-    }
-
-    /**
-     * 获取日志信息
-     * @access public
-     * @param  string $channel 日志通道
-     * @return array
-     */
-    public function getLog(string $channel = ''): array
-    {
-        $channel = $channel ?: array_shift($this->channel);
-        return $this->log[$channel] ?? [];
-    }
-
-    /**
-     * 记录日志信息
-     * @access public
-     * @param  mixed  $msg       日志信息
-     * @param  string $type      日志级别
-     * @param  array  $context   替换内容
-     * @return $this
-     */
-    public function record($msg, string $type = 'info', array $context = [])
-    {
-        if (!empty($this->allow['*']) && !in_array($type, $this->allow['*'])) {
-            return $this;
-        }
-
-        if (is_string($msg) && !empty($context)) {
-            $replace = [];
-            foreach ($context as $key => $val) {
-                $replace['{' . $key . '}'] = $val;
-            }
-
-            $msg = strtr($msg, $replace);
-        }
-
-        if (isset($this->config['type_channel'][$type])) {
-            $channels = (array) $this->config['type_channel'][$type];
-        } else {
-            $channels = $this->channel;
-        }
-
-        foreach ($channels as $channel) {
-            if (empty($this->allow[$channel]) || in_array($type, $this->allow[$channel])) {
-                $this->channelLog($channel, $msg, $type);
-            }
-        }
-
-        return $this;
-    }
-
-    /**
-     * 记录通道日志
-     * @access public
-     * @param  string $channel 日志通道
-     * @param  mixed  $msg  日志信息
-     * @param  string $type 日志级别
-     * @return void
-     */
-    protected function channelLog(string $channel, $msg, string $type): void
-    {
-        if (!empty($this->close['*']) || !empty($this->close[$channel])) {
-            return;
-        }
-
-        if ($this->isCli || !empty($this->config['channels'][$channel]['realtime_write'])) {
-            // 实时写入
-            $this->write($msg, $type, true, $channel);
-        } else {
-            $this->log[$channel][$type][] = $msg;
-        }
-    }
-
-    /**
-     * 清空日志信息
-     * @access public
-     * @param  string  $channel 日志通道名
-     * @return $this
-     */
-    public function clear(string $channel = '')
-    {
-        if ($channel) {
-            $this->log[$channel] = [];
-        } else {
-            $this->log = [];
-        }
-
-        return $this;
-    }
-
-    /**
-     * 关闭本次请求日志写入
-     * @access public
-     * @param  string  $channel 日志通道名
-     * @return $this
-     */
-    public function close(string $channel = '*')
-    {
-        $this->close[$channel] = true;
-
-        $this->clear('*' == $channel ? '' : $channel);
-
-        return $this;
-    }
-
-    /**
-     * 保存日志信息
-     * @access public
-     * @return bool
-     */
-    public function save(): bool
-    {
-        if (!empty($this->close['*'])) {
-            return true;
-        }
-
-        foreach ($this->log as $channel => $logs) {
-            if (!empty($this->close[$channel])) {
-                continue;
-            }
-
-            $result = $this->saveChannel($channel, $logs);
-
-            if ($result) {
-                $this->log[$channel] = [];
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * 保存某个通道的日志信息
-     * @access protected
-     * @param  string $channel 日志通道名
-     * @param  array  $log    日志信息
-     * @return bool
-     */
-    protected function saveChannel(string $channel, array $log = []): bool
-    {
-        // 日志处理
-        $processors = array_merge($this->processor[$channel] ?? [], $this->processor['*'] ?? []);
-
-        foreach ($processors as $callback) {
-            $log = $callback($log, $channel);
-
-            if (false === $log) {
-                return false;
-            }
-        }
-
-        return $this->driver($channel)->save($log);
-    }
-
-    /**
-     * 实时写入日志信息
-     * @access public
-     * @param  mixed  $msg   调试信息
-     * @param  string $type  日志级别
-     * @param  bool   $force 是否强制写入
-     * @param  string $channel  日志通道
-     * @return bool
-     */
-    public function write($msg, string $type = 'info', bool $force = false, $channel = ''): bool
-    {
-        if (empty($this->allow['*'])) {
-            $force = true;
-        }
-
-        $log = [];
-
-        if (true === $force || in_array($type, $this->allow['*'])) {
-            $log[$type][] = $msg;
-        } else {
-            return false;
-        }
-
-        // 写入日志
-        $channels = $channel ? (array) $channel : $this->channel;
-
-        foreach ($channels as $channel) {
-            if (empty($this->allow[$channel]) || in_array($type, $this->allow[$channel])) {
-                $this->saveChannel($channel, $log);
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * 记录日志信息
-     * @access public
-     * @param  string $level     日志级别
-     * @param  mixed  $message   日志信息
-     * @param  array  $context   替换内容
-     * @return void
-     */
-    public function log($level, $message, array $context = []): void
-    {
-        $this->record($message, $level, $context);
-    }
-
-    /**
-     * 记录emergency信息
-     * @access public
-     * @param  mixed $message 日志信息
-     * @param  array $context 替换内容
-     * @return void
-     */
-    public function emergency($message, array $context = []): void
-    {
-        $this->log(__FUNCTION__, $message, $context);
-    }
-
-    /**
-     * 记录警报信息
-     * @access public
-     * @param  mixed $message 日志信息
-     * @param  array $context 替换内容
-     * @return void
-     */
-    public function alert($message, array $context = []): void
-    {
-        $this->log(__FUNCTION__, $message, $context);
-    }
-
-    /**
-     * 记录紧急情况
-     * @access public
-     * @param  mixed $message 日志信息
-     * @param  array $context 替换内容
-     * @return void
-     */
-    public function critical($message, array $context = []): void
-    {
-        $this->log(__FUNCTION__, $message, $context);
-    }
-
-    /**
-     * 记录错误信息
-     * @access public
-     * @param  mixed $message 日志信息
-     * @param  array $context 替换内容
-     * @return void
-     */
-    public function error($message, array $context = []): void
-    {
-        $this->log(__FUNCTION__, $message, $context);
-    }
-
-    /**
-     * 记录warning信息
-     * @access public
-     * @param  mixed $message 日志信息
-     * @param  array $context 替换内容
-     * @return void
-     */
-    public function warning($message, array $context = []): void
-    {
-        $this->log(__FUNCTION__, $message, $context);
-    }
-
-    /**
-     * 记录notice信息
-     * @access public
-     * @param  mixed $message 日志信息
-     * @param  array $context 替换内容
-     * @return void
-     */
-    public function notice($message, array $context = []): void
-    {
-        $this->log(__FUNCTION__, $message, $context);
-    }
-
-    /**
-     * 记录一般信息
-     * @access public
-     * @param  mixed $message 日志信息
-     * @param  array $context 替换内容
-     * @return void
-     */
-    public function info($message, array $context = []): void
-    {
-        $this->log(__FUNCTION__, $message, $context);
-    }
-
-    /**
-     * 记录调试信息
-     * @access public
-     * @param  mixed $message 日志信息
-     * @param  array $context 替换内容
-     * @return void
-     */
-    public function debug($message, array $context = []): void
-    {
-        $this->log(__FUNCTION__, $message, $context);
-    }
-
-    /**
-     * 记录sql信息
-     * @access public
-     * @param  mixed $message 日志信息
-     * @param  array $context 替换内容
-     * @return void
-     */
-    public function sql($message, array $context = []): void
-    {
-        $this->log(__FUNCTION__, $message, $context);
-    }
-
-    public function __call($method, $args)
-    {
-        array_unshift($args, $method);
-        call_user_func_array([$this, 'log'], $args);
-    }
-}

+ 0 - 32
vendor/topthink/think-log/src/facade/Log.php

@@ -1,32 +0,0 @@
-<?php
-// +----------------------------------------------------------------------
-// | ThinkPHP [ WE CAN DO IT JUST THINK ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
-// +----------------------------------------------------------------------
-// | Author: liu21st <liu21st@gmail.com>
-// +----------------------------------------------------------------------
-
-namespace think\facade;
-
-use think\Facade;
-
-/**
- * @see \think\LogManager
- * @package think\facade
- * @mixin \think\LogManager
- */
-class Log extends Facade
-{
-    /**
-     * 获取当前Facade对应类名(或者已经绑定的容器对象标识)
-     * @access protected
-     * @return string
-     */
-    protected static function getFacadeClass()
-    {
-        return 'think\LogManager';
-    }
-}

+ 0 - 208
vendor/topthink/think-log/src/log/driver/File.php

@@ -1,208 +0,0 @@
-<?php
-// +----------------------------------------------------------------------
-// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
-// +----------------------------------------------------------------------
-// | Author: liu21st <liu21st@gmail.com>
-// +----------------------------------------------------------------------
-declare (strict_types = 1);
-
-namespace think\log\driver;
-
-/**
- * 本地化调试输出到文件
- */
-class File
-{
-    /**
-     * 配置参数
-     * @var array
-     */
-    protected $config = [
-        'time_format'  => 'c',
-        'single'       => false,
-        'file_size'    => 2097152,
-        'path'         => '',
-        'apart_level'  => [],
-        'max_files'    => 0,
-        'json'         => false,
-        'json_options' => JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES,
-        'format'       => '[%s][%s] %s',
-    ];
-
-    /**
-     * 是否控制台执行
-     * @var bool
-     */
-    protected $isCli = false;
-
-    // 实例化并传入参数
-    public function __construct($config = [])
-    {
-        if (is_array($config)) {
-            $this->config = array_merge($this->config, $config);
-        }
-
-        if (empty($this->config['format'])) {
-            $this->config['format'] = '[%s][%s] %s';
-        }
-
-        $this->isCli = $this->config['is_cli'];
-    }
-
-    /**
-     * 日志写入接口
-     * @access public
-     * @param  array $log 日志信息
-     * @return bool
-     */
-    public function save(array $log): bool
-    {
-        $destination = $this->getMasterLogFile();
-
-        $path = dirname($destination);
-        !is_dir($path) && mkdir($path, 0755, true);
-
-        $info = [];
-
-        // 日志信息封装
-        $time = date($this->config['time_format']);
-
-        foreach ($log as $type => $val) {
-            $message = [];
-            foreach ($val as $msg) {
-                if (!is_string($msg)) {
-                    $msg = var_export($msg, true);
-                }
-
-                $message[] = $this->config['json'] ?
-                json_encode(['time' => $time, 'type' => $type, 'msg' => $msg], $this->config['json_options']) :
-                sprintf($this->config['format'], $time, $type, $msg);
-            }
-
-            if (true === $this->config['apart_level'] || in_array($type, $this->config['apart_level'])) {
-                // 独立记录的日志级别
-                $filename = $this->getApartLevelFile($path, $type);
-                $this->write($message, $filename);
-                continue;
-            }
-
-            $info[$type] = $message;
-        }
-
-        if ($info) {
-            return $this->write($info, $destination);
-        }
-
-        return true;
-    }
-
-    /**
-     * 日志写入
-     * @access protected
-     * @param  array  $message 日志信息
-     * @param  string $destination 日志文件
-     * @return bool
-     */
-    protected function write(array $message, string $destination): bool
-    {
-        // 检测日志文件大小,超过配置大小则备份日志文件重新生成
-        $this->checkLogSize($destination);
-
-        $info = [];
-
-        foreach ($message as $type => $msg) {
-            $info[$type] = is_array($msg) ? implode(PHP_EOL, $msg) : $msg;
-        }
-
-        $message = implode(PHP_EOL, $info) . PHP_EOL;
-
-        return error_log($message, 3, $destination);
-    }
-
-    /**
-     * 获取主日志文件名
-     * @access public
-     * @return string
-     */
-    protected function getMasterLogFile(): string
-    {
-        if (substr($this->config['path'], -1) != DIRECTORY_SEPARATOR) {
-            $this->config['path'] .= DIRECTORY_SEPARATOR;
-        }
-
-        if ($this->config['max_files']) {
-            $files = glob($this->config['path'] . '*.log');
-
-            try {
-                if (count($files) > $this->config['max_files']) {
-                    unlink($files[0]);
-                }
-            } catch (\Exception $e) {
-                //
-            }
-        }
-
-        if ($this->config['single']) {
-            $name        = is_string($this->config['single']) ? $this->config['single'] : 'single';
-            $cli         = $this->isCli ? '_cli' : '';
-            $destination = $this->config['path'] . $name . $cli . '.log';
-        } else {
-            $cli = $this->isCli ? '_cli' : '';
-
-            if ($this->config['max_files']) {
-                $filename = date('Ymd') . $cli . '.log';
-            } else {
-                $filename = date('Ym') . DIRECTORY_SEPARATOR . date('d') . $cli . '.log';
-            }
-
-            $destination = $this->config['path'] . $filename;
-        }
-
-        return $destination;
-    }
-
-    /**
-     * 获取独立日志文件名
-     * @access public
-     * @param  string $path 日志目录
-     * @param  string $type 日志类型
-     * @return string
-     */
-    protected function getApartLevelFile(string $path, string $type): string
-    {
-        $cli = $this->isCli ? '_cli' : '';
-
-        if ($this->config['single']) {
-            $name = is_string($this->config['single']) ? $this->config['single'] : 'single';
-
-            $name .= '_' . $type;
-        } elseif ($this->config['max_files']) {
-            $name = date('Ymd') . '_' . $type . $cli;
-        } else {
-            $name = date('d') . '_' . $type . $cli;
-        }
-
-        return $path . DIRECTORY_SEPARATOR . $name . '.log';
-    }
-
-    /**
-     * 检查日志文件大小并自动生成备份文件
-     * @access protected
-     * @param  string $destination 日志文件
-     * @return void
-     */
-    protected function checkLogSize(string $destination): void
-    {
-        if (is_file($destination) && floor($this->config['file_size']) <= filesize($destination)) {
-            try {
-                rename($destination, dirname($destination) . DIRECTORY_SEPARATOR . time() . '-' . basename($destination));
-            } catch (\Exception $e) {
-                //
-            }
-        }
-    }
-}

+ 0 - 268
vendor/topthink/think-log/src/log/driver/Socket.php

@@ -1,268 +0,0 @@
-<?php
-// +----------------------------------------------------------------------
-// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
-// +----------------------------------------------------------------------
-// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
-// +----------------------------------------------------------------------
-// | Author: luofei614 <weibo.com/luofei614>
-// +----------------------------------------------------------------------
-
-namespace think\log\driver;
-
-/**
- * github: https://github.com/luofei614/SocketLog
- * @author luofei614<weibo.com/luofei614>
- */
-class Socket
-{
-    public $port = 1116; //SocketLog 服务的http的端口号
-
-    protected $config = [
-        // socket服务器地址
-        'host'                => 'localhost',
-        // 是否显示加载的文件列表
-        'show_included_files' => false,
-        // 日志强制记录到配置的client_id
-        'force_client_ids'    => [],
-        // 限制允许读取日志的client_id
-        'allow_client_ids'    => [],
-        // 调试开关
-        'debug'               => false,
-    ];
-
-    protected $css = [
-        'sql'      => 'color:#009bb4;',
-        'sql_warn' => 'color:#009bb4;font-size:14px;',
-        'error'    => 'color:#f4006b;font-size:14px;',
-        'page'     => 'color:#40e2ff;background:#171717;',
-        'big'      => 'font-size:20px;color:red;',
-    ];
-
-    protected $allowForceClientIds = []; //配置强制推送且被授权的client_id
-
-    /**
-     * 架构函数
-     * @access public
-     * @param  array $config 缓存参数
-     */
-    public function __construct(array $config = [])
-    {
-        if (!empty($config)) {
-            $this->config = array_merge($this->config, $config);
-        }
-    }
-
-    /**
-     * 调试输出接口
-     * @access public
-     * @param  array     $log 日志信息
-     * @return bool
-     */
-    public function save(array $log = [])
-    {
-        if (!$this->check()) {
-            return false;
-        }
-
-        $trace = [];
-
-        if ($this->config['debug']) {
-
-            if (isset($_SERVER['HTTP_HOST'])) {
-                $current_uri = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
-            } else {
-                $current_uri = 'cmd:' . implode(' ', $_SERVER['argv']);
-            }
-
-            // 基本信息
-            $trace[] = [
-                'type' => 'group',
-                'msg'  => $current_uri,
-                'css'  => $this->css['page'],
-            ];
-        }
-
-        foreach ($log as $type => $val) {
-            $trace[] = [
-                'type' => 'groupCollapsed',
-                'msg'  => '[ ' . $type . ' ]',
-                'css'  => isset($this->css[$type]) ? $this->css[$type] : '',
-            ];
-
-            foreach ($val as $msg) {
-                if (!is_string($msg)) {
-                    $msg = var_export($msg, true);
-                }
-                $trace[] = [
-                    'type' => 'log',
-                    'msg'  => $msg,
-                    'css'  => '',
-                ];
-            }
-
-            $trace[] = [
-                'type' => 'groupEnd',
-                'msg'  => '',
-                'css'  => '',
-            ];
-        }
-
-        if ($this->config['show_included_files']) {
-            $trace[] = [
-                'type' => 'groupCollapsed',
-                'msg'  => '[ file ]',
-                'css'  => '',
-            ];
-
-            $trace[] = [
-                'type' => 'log',
-                'msg'  => implode("\n", get_included_files()),
-                'css'  => '',
-            ];
-
-            $trace[] = [
-                'type' => 'groupEnd',
-                'msg'  => '',
-                'css'  => '',
-            ];
-        }
-
-        $trace[] = [
-            'type' => 'groupEnd',
-            'msg'  => '',
-            'css'  => '',
-        ];
-
-        $tabid = $this->getClientArg('tabid');
-
-        if (!$client_id = $this->getClientArg('client_id')) {
-            $client_id = '';
-        }
-
-        if (!empty($this->allowForceClientIds)) {
-            //强制推送到多个client_id
-            foreach ($this->allowForceClientIds as $force_client_id) {
-                $client_id = $force_client_id;
-                $this->sendToClient($tabid, $client_id, $trace, $force_client_id);
-            }
-        } else {
-            $this->sendToClient($tabid, $client_id, $trace, '');
-        }
-
-        return true;
-    }
-
-    /**
-     * 发送给指定客户端
-     * @access protected
-     * @author Zjmainstay
-     * @param  $tabid
-     * @param  $client_id
-     * @param  $logs
-     * @param  $force_client_id
-     */
-    protected function sendToClient($tabid, $client_id, $logs, $force_client_id)
-    {
-        $logs = [
-            'tabid'           => $tabid,
-            'client_id'       => $client_id,
-            'logs'            => $logs,
-            'force_client_id' => $force_client_id,
-        ];
-
-        $msg     = @json_encode($logs);
-        $address = '/' . $client_id; //将client_id作为地址, server端通过地址判断将日志发布给谁
-
-        $this->send($this->config['host'], $msg, $address);
-    }
-
-    protected function check()
-    {
-        $tabid = $this->getClientArg('tabid');
-
-        //是否记录日志的检查
-        if (!$tabid && !$this->config['force_client_ids']) {
-            return false;
-        }
-
-        //用户认证
-        $allow_client_ids = $this->config['allow_client_ids'];
-
-        if (!empty($allow_client_ids)) {
-            //通过数组交集得出授权强制推送的client_id
-            $this->allowForceClientIds = array_intersect($allow_client_ids, $this->config['force_client_ids']);
-            if (!$tabid && count($this->allowForceClientIds)) {
-                return true;
-            }
-
-            $client_id = $this->getClientArg('client_id');
-            if (!in_array($client_id, $allow_client_ids)) {
-                return false;
-            }
-        } else {
-            $this->allowForceClientIds = $this->config['force_client_ids'];
-        }
-
-        return true;
-    }
-
-    protected function getClientArg($name)
-    {
-        static $args = [];
-
-        $key = 'HTTP_USER_AGENT';
-
-        if (isset($_SERVER['HTTP_SOCKETLOG'])) {
-            $key = 'HTTP_SOCKETLOG';
-        }
-
-        if (!isset($_SERVER[$key])) {
-            return;
-        }
-
-        if (empty($args)) {
-            if (!preg_match('/SocketLog\((.*?)\)/', $_SERVER[$key], $match)) {
-                $args = ['tabid' => null];
-                return;
-            }
-            parse_str($match[1], $args);
-        }
-
-        if (isset($args[$name])) {
-            return $args[$name];
-        }
-
-        return;
-    }
-
-    /**
-     * @access protected
-     * @param  string $host - $host of socket server
-     * @param  string $message - 发送的消息
-     * @param  string $address - 地址
-     * @return bool
-     */
-    protected function send($host, $message = '', $address = '/')
-    {
-        $url = 'http://' . $host . ':' . $this->port . $address;
-        $ch  = curl_init();
-
-        curl_setopt($ch, CURLOPT_URL, $url);
-        curl_setopt($ch, CURLOPT_POST, true);
-        curl_setopt($ch, CURLOPT_POSTFIELDS, $message);
-        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
-        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1);
-        curl_setopt($ch, CURLOPT_TIMEOUT, 10);
-
-        $headers = [
-            "Content-Type: application/json;charset=UTF-8",
-        ];
-
-        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); //设置header
-
-        return curl_exec($ch);
-    }
-
-}