├── .gitignore ├── Config ├── Redis.php ├── Mianqian.php └── Db.php ├── App ├── Model │ └── Demo.php ├── Lib │ ├── Singleton.php │ ├── Cookie.php │ ├── Requst.php │ └── EasyGatewayCore.php ├── EasyGateway │ ├── start_register.php │ ├── start_businessworker.php │ ├── start_gateway.php │ └── Events.php ├── FileMonitor │ └── start.php └── Controller │ ├── Gatewaymoney.php │ └── Alipay.php ├── Comm └── function.php ├── composer.json ├── MIT-LICENSE.txt ├── start.php ├── README.md ├── LICENSE └── composer.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | vendor/ 3 | -------------------------------------------------------------------------------- /Config/Redis.php: -------------------------------------------------------------------------------- 1 | [ 11 | 'host' => '127.0.0.1', 12 | 'prot' => 6379, 13 | 'time_out' => 5 14 | ] 15 | ]; -------------------------------------------------------------------------------- /Config/Mianqian.php: -------------------------------------------------------------------------------- 1 | '你的支付宝cookie', 6 | // 微信cookie 7 | 'wx_cookie' => '', 8 | 9 | // 订单有效时间 单位分钟 10 | 'order_success_time' => 3, 11 | 12 | // 异步回调url 13 | 'notify_url' => 'http://baidu.com' 14 | ]; -------------------------------------------------------------------------------- /App/Model/Demo.php: -------------------------------------------------------------------------------- 1 | [ 11 | 'driver' => 'mysql', 12 | 'host' => 'mysql', 13 | 'port' => 3306, 14 | 'database' => 'demo', 15 | 'username' => 'root', 16 | 'password' => '', 17 | 'charset' => 'utf8', 18 | 'collation' => 'utf8_unicode_ci', 19 | 'prefix' => '', 20 | ] 21 | 22 | 23 | ]; -------------------------------------------------------------------------------- /Comm/function.php: -------------------------------------------------------------------------------- 1 | $code, 20 | 'msg' => $msg, 21 | 'data' => $data 22 | ]; 23 | return json_encode($jsonData); 24 | 25 | } -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "autoload": { 3 | "psr-4": { 4 | "App\\": "App/" 5 | } 6 | }, 7 | 8 | "name" : "workerman/gateway-worker-demo", 9 | "keywords": ["distributed","communication"], 10 | "homepage": "http://www.workerman.net", 11 | "license" : "MIT", 12 | "require": { 13 | "workerman/gateway-worker" : ">=3.0.0", 14 | "hassankhan/config": "^2.0", 15 | "illuminate/database": "^5.8", 16 | "guzzlehttp/guzzle": "^6.3", 17 | "predis/predis": "^1.1" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /App/Lib/Cookie.php: -------------------------------------------------------------------------------- 1 | controller = $controller; 32 | $this->action = $action; 33 | foreach ($param as $key => $value) { 34 | $this->param[$key] = $value; 35 | 36 | } 37 | } 38 | 39 | 40 | } -------------------------------------------------------------------------------- /App/EasyGateway/start_register.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright walkor 11 | * @link http://www.workerman.net/ 12 | * @license http://www.opensource.org/licenses/mit-license.php MIT License 13 | */ 14 | use \Workerman\Worker; 15 | use \GatewayWorker\Register; 16 | 17 | // 自动加载类 18 | require_once __DIR__ . '/../../vendor/autoload.php'; 19 | 20 | // register 必须是text协议 21 | $register = new Register('text://0.0.0.0:1238'); 22 | 23 | // 如果不是在根目录启动,则运行runAll方法 24 | if(!defined('GLOBAL_START')) 25 | { 26 | Worker::runAll(); 27 | } 28 | 29 | -------------------------------------------------------------------------------- /App/EasyGateway/start_businessworker.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright walkor 11 | * @link http://www.workerman.net/ 12 | * @license http://www.opensource.org/licenses/mit-license.php MIT License 13 | */ 14 | use \Workerman\Worker; 15 | use \Workerman\WebServer; 16 | use \GatewayWorker\Gateway; 17 | use \GatewayWorker\BusinessWorker; 18 | use \Workerman\Autoloader; 19 | 20 | // 自动加载类 21 | require_once __DIR__ . '/../../vendor/autoload.php'; 22 | 23 | // bussinessWorker 进程 24 | $worker = new BusinessWorker(); 25 | // worker名称 26 | $worker->name = 'EasyGatewayBusinessWorker'; 27 | // bussinessWorker进程数量 28 | $worker->count = 4; 29 | // 服务注册地址 30 | $worker->registerAddress = '127.0.0.1:1238'; 31 | 32 | // 如果不是在根目录启动,则运行runAll方法 33 | if(!defined('GLOBAL_START')) 34 | { 35 | Worker::runAll(); 36 | } 37 | 38 | -------------------------------------------------------------------------------- /MIT-LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2009-2015 walkor and contributors (see https://github.com/walkor/workerman/contributors) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /start.php: -------------------------------------------------------------------------------- 1 | name = 'FileMonitor'; 11 | $worker->reloadable = false; 12 | $last_mtime = time(); 13 | 14 | $worker->onWorkerStart = function() 15 | { 16 | global $monitor_dir; 17 | // watch files only in daemon mode 18 | if(!Worker::$daemonize) 19 | { 20 | // chek mtime of files per second 21 | Timer::add(1, 'check_files_change', array($monitor_dir)); 22 | } 23 | }; 24 | 25 | // check files func 26 | function check_files_change($monitor_dir) 27 | { 28 | global $last_mtime; 29 | // recursive traversal directory 30 | $dir_iterator = new RecursiveDirectoryIterator($monitor_dir); 31 | $iterator = new RecursiveIteratorIterator($dir_iterator); 32 | foreach ($iterator as $file) 33 | { 34 | // only check php files 35 | if(pathinfo($file, PATHINFO_EXTENSION) != 'php') 36 | { 37 | continue; 38 | } 39 | // check mtime 40 | if($last_mtime < $file->getMTime()) 41 | { 42 | echo $file." update and reload\n"; 43 | // send SIGUSR1 signal to master process for reload 44 | posix_kill(posix_getppid(), SIGUSR1); 45 | $last_mtime = $file->getMTime(); 46 | break; 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /App/EasyGateway/start_gateway.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright walkor 11 | * @link http://www.workerman.net/ 12 | * @license http://www.opensource.org/licenses/mit-license.php MIT License 13 | */ 14 | use \Workerman\Worker; 15 | use \Workerman\WebServer; 16 | use \GatewayWorker\Gateway; 17 | use \GatewayWorker\BusinessWorker; 18 | use \Workerman\Autoloader; 19 | 20 | // 自动加载类 21 | require_once __DIR__ . '/../../vendor/autoload.php'; 22 | 23 | // gateway 进程,这里使用Text协议,可以用telnet测试 24 | $gateway = new Gateway("websocket://0.0.0.0:8282"); 25 | // gateway名称,status方便查看 26 | $gateway->name = 'EasyGatewayGateway'; 27 | // gateway进程数 28 | $gateway->count = 4; 29 | // 本机ip,分布式部署时使用内网ip 30 | $gateway->lanIp = '127.0.0.1'; 31 | // 内部通讯起始端口,假如$gateway->count=4,起始端口为4000 32 | // 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口 33 | $gateway->startPort = 2900; 34 | // 服务注册地址 35 | $gateway->registerAddress = '127.0.0.1:1238'; 36 | 37 | // 心跳间隔 38 | $gateway->pingInterval = 10; 39 | // 心跳数据 40 | $gateway->pingData = '{"type":"ping"}'; 41 | 42 | /* 43 | // 当客户端连接上来时,设置连接的onWebSocketConnect,即在websocket握手时的回调 44 | $gateway->onConnect = function($connection) 45 | { 46 | $connection->onWebSocketConnect = function($connection , $http_header) 47 | { 48 | // 可以在这里判断连接来源是否合法,不合法就关掉连接 49 | // $_SERVER['HTTP_ORIGIN']标识来自哪个站点的页面发起的websocket链接 50 | if($_SERVER['HTTP_ORIGIN'] != 'http://kedou.workerman.net') 51 | { 52 | $connection->close(); 53 | } 54 | // onWebSocketConnect 里面$_GET $_SERVER是可用的 55 | // var_dump($_GET, $_SERVER); 56 | }; 57 | }; 58 | */ 59 | 60 | // 如果不是在根目录启动,则运行runAll方法 61 | if(!defined('GLOBAL_START')) 62 | { 63 | Worker::runAll(); 64 | } 65 | 66 | -------------------------------------------------------------------------------- /App/Controller/Gatewaymoney.php: -------------------------------------------------------------------------------- 1 | keys(self::ALIPAY_NEW_ORDERS.'*'); 25 | // 开始匹配 26 | foreach ($newAlipayOrderList as $item){ 27 | $item = EasyGatewayCore::$rediscon->get($item); 28 | $item = json_decode($item, true); 29 | if (!EasyGatewayCore::$rediscon->hget(self::SUCCESS_NOTIFY_ORDERS, $item['tradeNo'])) { 30 | var_dump('开始回调'); 31 | // 开始回调 32 | $notifyRes = self::notifyRequst($item['totalAmount'], $item['tradeNo']); 33 | // 回调成功 34 | if ($notifyRes == 'success') { 35 | // 将订单号载入已回调订单 36 | EasyGatewayCore::$rediscon->hset(self::SUCCESS_NOTIFY_ORDERS, $item['tradeNo'], 1); 37 | } 38 | } 39 | } 40 | 41 | } 42 | 43 | public static function notifyRequst($price,$tradeNo,$paytype = 'alipay') 44 | { 45 | $requstData = [ 46 | 'timeout' => 10, 47 | 'form_params' => [ 48 | 'price' => $price, // 支付金额 49 | 'tradeNo' => $tradeNo, // 支付平台id 50 | 'paytype' => $paytype 51 | ] 52 | ]; 53 | var_dump('回调参数'); 54 | var_dump($requstData); 55 | $client = new Client(); 56 | $appres = $client->request('POST',EasyGatewayCore::$sysConf->get('notify_url'),$requstData)->getBody()->getContents(); 57 | var_dump('商户网站回调结果:'); 58 | var_dump($appres); 59 | return $appres; 60 | } 61 | 62 | 63 | } -------------------------------------------------------------------------------- /App/EasyGateway/Events.php: -------------------------------------------------------------------------------- 1 | 10 | * @copyright walkor 11 | * @link http://www.workerman.net/ 12 | * @license http://www.opensource.org/licenses/mit-license.php MIT License 13 | */ 14 | 15 | /** 16 | * 用于检测业务代码死循环或者长时间阻塞等问题 17 | * 如果发现业务卡死,可以将下面declare打开(去掉//注释),并执行php start.php reload 18 | * 然后观察一段时间workerman.log看是否有process_timeout异常 19 | */ 20 | //declare(ticks=1); 21 | 22 | use App\Lib\EasyGatewayCore; 23 | use \GatewayWorker\Lib\Gateway; 24 | 25 | /** 26 | * 主逻辑 27 | * 主要是处理 onConnect onMessage onClose 三个方法 28 | * onConnect 和 onClose 如果不需要可以不用实现并删除 29 | */ 30 | class Events 31 | { 32 | 33 | /** 34 | * 当进程启动时触发 35 | * @param $worker worker进程. 36 | */ 37 | public static function onWorkerStart($worker) 38 | { 39 | // 配置载入 40 | \App\Lib\EasyGatewayCore::loadConf(); 41 | // 数据库初始化 42 | // \App\Lib\EasyGatewayCore::initDatabase(); 43 | // 初始化redis 44 | EasyGatewayCore::initRedis(); 45 | if ($worker->id == 0) { 46 | // 多久心跳一次 秒为单位 47 | \Workerman\Lib\Timer::add(60, function (){ 48 | \App\Controller\Alipay::pong(EasyGatewayCore::$sysConf->get('alipay_cookie')); 49 | // 十秒获取一次支付宝订单 50 | \App\Controller\Alipay::getNewOrderList(EasyGatewayCore::$sysConf->get('alipay_cookie')); 51 | }); 52 | } 53 | if ($worker->id == 1) { 54 | \Workerman\Lib\Timer::add(5, function (){ 55 | \App\Controller\Gatewaymoney::muchOrder(); 56 | }); 57 | } 58 | 59 | } 60 | 61 | /** 62 | * 当客户端连接时触发 63 | * 如果业务不需此回调可以删除onConnect 64 | * 65 | * @param int $client_id 连接id 66 | */ 67 | public static function onConnect($client_id) 68 | { 69 | 70 | } 71 | 72 | /** 73 | * 当客户端发来消息时触发 74 | * @param int $client_id 连接id 75 | * @param mixed $message 具体消息 76 | */ 77 | public static function onMessage($client_id, $message) 78 | { 79 | // 核心启动 80 | \App\Lib\EasyGatewayCore::runAll($client_id, $message); 81 | 82 | } 83 | 84 | /** 85 | * 当用户断开连接时触发 86 | * @param int $client_id 连接id 87 | */ 88 | public static function onClose($client_id) 89 | { 90 | 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /App/Lib/EasyGatewayCore.php: -------------------------------------------------------------------------------- 1 | addConnection(self::$sysConf->get('DATABASE')); 33 | // 设置全局静态可访问 34 | $capsule->setAsGlobal(); 35 | // 启动Eloquent 36 | $capsule->bootEloquent(); 37 | } 38 | 39 | public static function initRedis() 40 | { 41 | self::$rediscon = new Client(self::$sysConf->get('REDIS')); 42 | } 43 | 44 | /** 45 | * 配置载入 46 | */ 47 | public static function loadConf() 48 | { 49 | self::$sysConf = Config::load(EASYGATEWAY_ROOT . '/Config'); 50 | } 51 | 52 | /** 53 | * 核心启动 54 | * @param $client_id 55 | * @param $message 56 | * @return bool|void 57 | */ 58 | public static function runAll($client_id, $message) 59 | { 60 | // 收到消息,解析包体 61 | $requstData = json_decode($message, true); 62 | // 消息空包,无视 63 | if (empty($requstData)) return; 64 | $controller = ucfirst(strtolower($requstData['_controller_'])); 65 | $action = $requstData['_action_']; 66 | $paramData = $requstData['_param_data_']; 67 | // 追加客户端id 68 | $paramData['client_id'] = $client_id; 69 | // 加上命名空间 70 | $paramData['class'] = '\\App\\Controller\\'.$controller; 71 | if (!class_exists($paramData['class'])) { 72 | return Gateway::sendToCurrentClient(easygateway_json_response(500, '请求控制器不存在!')); 73 | } 74 | if (!method_exists($paramData['class'], $action)) { 75 | return Gateway::sendToCurrentClient(easygateway_json_response(500, '请求方法不存在!')); 76 | } 77 | // 注入请求参数 78 | $requstObj = new \App\Lib\Requst($controller, $action, $paramData); 79 | // 调用类的方法 80 | try 81 | { 82 | $callBack = array(new $paramData['class'], $action); 83 | if(is_callable($callBack)) 84 | { 85 | call_user_func_array($callBack, [&$requstObj]); 86 | } 87 | } 88 | // 有异常 89 | catch(Exception $e) 90 | { 91 | // 发送数据给客户端,发生异常,调用失败 92 | return Gateway::sendToCurrentClient(easygateway_json_response(500, '服务器开小差拉!')); 93 | } 94 | } 95 | 96 | 97 | 98 | 99 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Easymqpay (支付宝免签支付监控) 2 | ================= 3 | 4 | 基于支付宝网页版协议实现免签约支付监控! 5 | 采用workerman纯php编写,常驻内存!无需添加额外定时任务! 6 | 7 | 开发初衷 8 | ======= 9 | 10 | 为没有企业支付宝接入资质的站长及个人创业者实现自己的免签约支付 11 | 12 | 13 | 原理 14 | ======= 15 | 利用支付宝商家中心网页版api接口,实现订单批量查询。 16 | 17 | 前端网页支付时,只需要根据订单金额及时间即可分析此笔订单由谁支付! 18 | 19 | 举个栗子: 20 | 21 | 用户A在 2019年7月31日下午5点13分发起支付请求20元。 22 | 用户B 突然在2019年7月31日下午5点14分又发起了一笔20元的支付,但是此时用户A的20元还没支付,那么该怎么判断订单是谁的呢? 23 | 很简单,你只需让用户B支付20.01元,就可以区分是谁支付的! 24 | 以此类推再给订单加上支付限制时间,就可以很直接的判断支付用户 25 | 26 | 安装 27 | ======= 28 | ~~~ 29 | git clone https://github.com/assimon/easymqpay easymqpay 30 | 31 | composer install 32 | ~~~ 33 | 34 | 启动停止命令 35 | ========= 36 | 37 | debug调试启动 38 | `php start.php start` 39 | 40 | 常驻后台启动 41 | `php start.php start -d` 42 | 43 | 重启启动 44 | `php start.php restart` 45 | 46 | 平滑重启/重新加载配置 47 | `php start.php reload` 48 | 49 | 查看服务状态 50 | `php start.php status` 51 | 52 | 停止 53 | `php start.php stop` 54 | 55 | 56 | 57 | 注意事项 58 | ======= 59 | 1. easymqpay只负责帮助使用者抓取支付宝订单列表,并且上传给使用者的应用服务端。使用者需自行根据订单生成不同金额并且判断! 60 | 2. 请保证服务器或本机为linux系统,且安装了composer 及 PHP7 及 redis 61 | 3. 请保证服务器或本机php扩展支持pcntl、posix扩展 62 | 4. easymqpay只会抓取配置文件里面的有效分钟数内支付的订单并回调,使用者可据此判断订单 63 | 5. 每次修改代码后请最好重启一次!! 64 | 6. 请先以debug方式启动查看有无报错后再常驻内存启动 65 | 7. 常驻内存启动后可在根目录查询pay.log日志(服务器状态) 66 | 67 | 使用方法 68 | ========= 69 | 70 | ### 配置支付宝cookie(Config/Mianqian.php): 71 | 72 | 支付宝cookie获取方法: 73 | 1.浏览器访问:https://mbillexprod.alipay.com/enterprise/tradeListQuery.htm 74 | 2.登录支付宝账号 75 | 3.浏览器按f12 76 | 4.找到Network并点击再刷新一下 77 | 5.可以看到tradeListQuery.json点击它 78 | 6.点击headers它找到Cookie: 后面就是cookie(务必复制完整) 79 | 80 | 81 | 82 | ```php 83 | '你的cookie', 88 | 89 | // 微信cookie 90 | 'wx_cookie' => '暂时还没做', 91 | 92 | // 订单有效时间 单位分钟 93 | 'order_success_time' => 3, 94 | 95 | // 异步回调url 96 | 'notify_url' => 'http://baidu.com' 97 | ]; 98 | ``` 99 | ### 修改定时时间,个人建议1分钟一次(App/EasyGateway/Events.php)47行: 100 | 101 | ```php 102 | if ($worker->id == 0) { 103 | // 多久心跳一次 秒为单位 104 | \Workerman\Lib\Timer::add(60, function (){ 105 | \App\Controller\Alipay::pong(EasyGatewayCore::$sysConf->get('alipay_cookie')); 106 | // 十秒获取一次支付宝订单 107 | \App\Controller\Alipay::getNewOrderList(EasyGatewayCore::$sysConf->get('alipay_cookie')); 108 | }); 109 | } 110 | 111 | ``` 112 | 113 | ### 抓取到新的支付宝成功支付的订单后,服务器会向使用者服务端进行回调 114 | 115 | 请接收回调参数: 116 | ```php 117 | 'price' => $_POST['price'], // 支付金额 118 | 'tradeNo' => $_POST['tradeNo'], // 支付平台id 119 | 'paytype' => $_POST['paytype'] // 支付类型 alipay为支付宝 wepay为微信 120 | ``` 121 | 122 | 回调服务器接收到回调后: 123 | 1. 根据订单时间或金额判断是哪个用户支付的 124 | 2. 回调成功后请返回success,否则服务端会一直回调直至订单过期! 125 | 126 | 127 | 128 | 其他使用功能 129 | ========= 130 | 131 | ### 获取配置 132 | ```php 133 | \App\Lib\EasyGatewayCore::$sysConf->get('key'); 134 | \App\Lib\EasyGatewayCore::$sysConf->get('key1.key2'); 135 | ``` 136 | 137 | ### 微信功能请等待更新.... 138 | 139 | 140 | 鸣谢 141 | ========= 142 | [GatewayWorker](https://github.com/walkor/GatewayWorker)、[ChenSee/ChenPay](https://github.com/ChenSee/ChenPay) -------------------------------------------------------------------------------- /App/Controller/Alipay.php: -------------------------------------------------------------------------------- 1 | 10, 32 | 'headers' => [ 33 | 'Cookie' => $cookie, 34 | 'Accept-Encoding' => 'gzip, deflate, br', 35 | 'Accept-Language' => 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7', 36 | 'User-Agent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36', 37 | 'Content-Type' => 'application/x-www-form-urlencoded', 38 | 'Accept' => 'application/json, text/javascript', 39 | 'Referer' => 'https://mrchportalweb.alipay.com/user/home.htm', 40 | 'Origin' => 'https://mbillexprod.alipay.com', 41 | 'Connection' => 'keep-alive', 42 | ], 43 | 'body' => 'action=loadEntInfo' 44 | ]; 45 | try { 46 | $aliPongReturn = $aliPong->request('POST', self::PONG_URL . time() * 1000, $requstData)->getBody()->getContents(); 47 | $aliPongReturn = iconv('GBK', 'UTF-8', $aliPongReturn); 48 | $aliPongReturn = json_decode( $aliPongReturn, true); 49 | } catch (GuzzleException $exception) { 50 | echo $exception->getMessage(); 51 | } 52 | //$aliPongReturn = json_decode(, true); 53 | if (!$aliPongReturn || !isset($aliPongReturn['navResult'])) { 54 | var_dump('支付宝cookie失效!'); 55 | } 56 | // 销毁对象 57 | unset($aliPong); 58 | var_dump('支付宝心跳结束,cookie正常'); 59 | } 60 | 61 | public static function getNewOrderList($cookie = '') 62 | { 63 | $orderList = self::channelOne($cookie) ? self::channelOne($cookie) : self::channeTwo($cookie); 64 | if (!$orderList) { 65 | var_dump('无法获取订单,可能是心跳过快,服务异常~'); 66 | return ; 67 | } 68 | //var_dump(json_encode($orderList)); 69 | date_default_timezone_set('Asia/Shanghai'); 70 | // 上载最新订单到服务器 71 | $nowtime = time(); 72 | $success_time = EasyGatewayCore::$sysConf->get('order_success_time'); 73 | if(empty($orderList['result']['detail'])) { 74 | var_dump('暂无数据'); 75 | return; 76 | } 77 | foreach ($orderList['result']['detail'] as $val) { 78 | if ( 79 | (isset($val['direction']) == '卖出' && isset($val['tradeFrom']) == '外部商户' && strtotime($val['gmtCreate']) > ($nowtime - $success_time * 60)) || 80 | (isset($val['signProduct']) == '转账收款码' && isset($val['accountType']) == '交易' && strtotime($val['tradeTime']) > ($nowtime - $success_time * 60) ) 81 | ){ 82 | if(!isset($val['totalAmount'])) $val['totalAmount'] = $val['tradeAmount']; 83 | // 将订单信息载入redis 方便服务器上载订单数据 84 | EasyGatewayCore::$rediscon->setex(self::ALIPAY_NEW_ORDERS . $val['totalAmount'], $success_time*60, json_encode($val)); 85 | } 86 | } 87 | } 88 | 89 | 90 | // 通道1 91 | public static function channelOne($cookie = '') 92 | { 93 | // 请求参数 94 | $requstData = [ 95 | 'timeout' => 10, 96 | 'headers' => [ 97 | 'Cookie' => $cookie, 98 | 'Origin' => 'https://mbillexprod.alipay.com', 99 | 'Accept-Encoding' => 'gzip, deflate, br', 100 | 'Accept-Language' => 'zh-CN,zh;q=0.9', 101 | 'User-Agent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36', 102 | 'Content-Type' => 'application/x-www-form-urlencoded; charset=UTF-8', 103 | 'Accept' => 'application/json, text/javascript', 104 | 'Referer' => 'https://mbillexprod.alipay.com/enterprise/tradeListQuery.htm', 105 | 'X-Requested-With' => 'XMLHttpRequest', 106 | 'Connection' => 'keep-alive', 107 | ], 108 | 'body' => 'queryEntrance=1&billUserId=' . Cookie::getCookieName('uid', $cookie) . 109 | '&status=SUCCESS&entityFilterType=0&activeTargetSearchItem=tradeNo&tradeFrom=ALL&startTime=' . 110 | date('Y-m-d', strtotime('-1 day')) . '+00%3A00%3A00&endTime=' . date('Y-m-d') . 111 | '+23%3A59%3A59&pageSize=20&pageNum=1&total=1&sortTarget=gmtCreate&order=descend&sortType=0&_input_charset=gbk&ctoken=' . 112 | Cookie::getCookieName('ctoken', $cookie), 113 | ]; 114 | 115 | $channe = new Client(); 116 | $channeReturn = $channe->request('POST', self::CHANNEL_ONE, $requstData)->getBody()->getContents(); 117 | $encode = mb_detect_encoding($channeReturn, array("ASCII",'UTF-8',"GB2312","GBK",'BIG5')); 118 | $channeReturn = mb_convert_encoding($channeReturn, 'UTF-8', $encode); 119 | $channeReturn = json_decode($channeReturn, true); 120 | if ($channeReturn['status'] != 'succeed') { 121 | var_dump($channeReturn['msg']); 122 | return false; 123 | } 124 | unset($channe); 125 | return $channeReturn; 126 | } 127 | 128 | // 通道2 129 | public static function channeTwo($cookie = '') 130 | { 131 | // 请求参数 132 | $requstData = [ 133 | 'timeout' => 10, 134 | 'headers' => [ 135 | 'Cookie' => $cookie, 136 | 'Origin' => 'https://mbillexprod.alipay.com', 137 | 'Accept-Encoding' => 'gzip, deflate, br', 138 | 'Accept-Language' => 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7', 139 | 'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36', 140 | 'Content-Type' => 'application/x-www-form-urlencoded; charset=UTF-8', 141 | 'Accept' => 'application/json, text/javascript', 142 | 'Referer' => 'https://mbillexprod.alipay.com/enterprise/fundAccountDetail.htm', 143 | 'X-Requested-With' => 'XMLHttpRequest', 144 | 'Connection' => 'keep-alive', 145 | ], 146 | 'body' => 'queryEntrance=1&billUserId=' . Cookie::getCookieName('uid', $cookie) . 147 | '&showType=1&type=&precisionQueryKey=tradeNo&' . 148 | 'startDateInput=' . date('Y-m-d', strtotime('-1 day')) . '+00%3A00%3A00&endDateInput=' . date('Y-m-d') . '+23%3A59%3A59&' . 149 | 'pageSize=20&pageNum=1&total=1&sortTarget=tradeTime&order=descend&sortType=0&' . 150 | '_input_charset=gbk&ctoken=' . Cookie::getCookieName('ctoken', $cookie) 151 | ]; 152 | $channe = new Client(); 153 | $channeReturn = $channe->request('POST', self::CHANNEL_TWO, $requstData)->getBody()->getContents(); 154 | $encode = mb_detect_encoding($channeReturn, array("ASCII",'UTF-8',"GB2312","GBK",'BIG5')); 155 | $channeReturn = mb_convert_encoding($channeReturn, 'UTF-8', $encode); 156 | $channeReturn = json_decode($channeReturn, true); 157 | if ($channeReturn['status'] != 'succeed') { 158 | var_dump($channeReturn['msg']); 159 | return false; 160 | } 161 | unset($channe); 162 | return $channeReturn; 163 | } 164 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "05d94b3aebadb1e2411ff2bb2550e771", 8 | "packages": [ 9 | { 10 | "name": "doctrine/inflector", 11 | "version": "v1.3.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/doctrine/inflector.git", 15 | "reference": "5527a48b7313d15261292c149e55e26eae771b0a" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a", 20 | "reference": "5527a48b7313d15261292c149e55e26eae771b0a", 21 | "shasum": "", 22 | "mirrors": [ 23 | { 24 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 25 | "preferred": true 26 | } 27 | ] 28 | }, 29 | "require": { 30 | "php": "^7.1" 31 | }, 32 | "require-dev": { 33 | "phpunit/phpunit": "^6.2" 34 | }, 35 | "type": "library", 36 | "extra": { 37 | "branch-alias": { 38 | "dev-master": "1.3.x-dev" 39 | } 40 | }, 41 | "autoload": { 42 | "psr-4": { 43 | "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" 44 | } 45 | }, 46 | "notification-url": "https://packagist.org/downloads/", 47 | "license": [ 48 | "MIT" 49 | ], 50 | "authors": [ 51 | { 52 | "name": "Roman Borschel", 53 | "email": "roman@code-factory.org" 54 | }, 55 | { 56 | "name": "Benjamin Eberlei", 57 | "email": "kontakt@beberlei.de" 58 | }, 59 | { 60 | "name": "Guilherme Blanco", 61 | "email": "guilhermeblanco@gmail.com" 62 | }, 63 | { 64 | "name": "Jonathan Wage", 65 | "email": "jonwage@gmail.com" 66 | }, 67 | { 68 | "name": "Johannes Schmitt", 69 | "email": "schmittjoh@gmail.com" 70 | } 71 | ], 72 | "description": "Common String Manipulations with regard to casing and singular/plural rules.", 73 | "homepage": "http://www.doctrine-project.org", 74 | "keywords": [ 75 | "inflection", 76 | "pluralize", 77 | "singularize", 78 | "string" 79 | ], 80 | "time": "2018-01-09T20:05:19+00:00" 81 | }, 82 | { 83 | "name": "guzzlehttp/guzzle", 84 | "version": "6.3.3", 85 | "source": { 86 | "type": "git", 87 | "url": "https://github.com/guzzle/guzzle.git", 88 | "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" 89 | }, 90 | "dist": { 91 | "type": "zip", 92 | "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", 93 | "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", 94 | "shasum": "", 95 | "mirrors": [ 96 | { 97 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 98 | "preferred": true 99 | } 100 | ] 101 | }, 102 | "require": { 103 | "guzzlehttp/promises": "^1.0", 104 | "guzzlehttp/psr7": "^1.4", 105 | "php": ">=5.5" 106 | }, 107 | "require-dev": { 108 | "ext-curl": "*", 109 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", 110 | "psr/log": "^1.0" 111 | }, 112 | "suggest": { 113 | "psr/log": "Required for using the Log middleware" 114 | }, 115 | "type": "library", 116 | "extra": { 117 | "branch-alias": { 118 | "dev-master": "6.3-dev" 119 | } 120 | }, 121 | "autoload": { 122 | "files": [ 123 | "src/functions_include.php" 124 | ], 125 | "psr-4": { 126 | "GuzzleHttp\\": "src/" 127 | } 128 | }, 129 | "notification-url": "https://packagist.org/downloads/", 130 | "license": [ 131 | "MIT" 132 | ], 133 | "authors": [ 134 | { 135 | "name": "Michael Dowling", 136 | "email": "mtdowling@gmail.com", 137 | "homepage": "https://github.com/mtdowling" 138 | } 139 | ], 140 | "description": "Guzzle is a PHP HTTP client library", 141 | "homepage": "http://guzzlephp.org/", 142 | "keywords": [ 143 | "client", 144 | "curl", 145 | "framework", 146 | "http", 147 | "http client", 148 | "rest", 149 | "web service" 150 | ], 151 | "time": "2018-04-22T15:46:56+00:00" 152 | }, 153 | { 154 | "name": "guzzlehttp/promises", 155 | "version": "v1.3.1", 156 | "source": { 157 | "type": "git", 158 | "url": "https://github.com/guzzle/promises.git", 159 | "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" 160 | }, 161 | "dist": { 162 | "type": "zip", 163 | "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", 164 | "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", 165 | "shasum": "", 166 | "mirrors": [ 167 | { 168 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 169 | "preferred": true 170 | } 171 | ] 172 | }, 173 | "require": { 174 | "php": ">=5.5.0" 175 | }, 176 | "require-dev": { 177 | "phpunit/phpunit": "^4.0" 178 | }, 179 | "type": "library", 180 | "extra": { 181 | "branch-alias": { 182 | "dev-master": "1.4-dev" 183 | } 184 | }, 185 | "autoload": { 186 | "psr-4": { 187 | "GuzzleHttp\\Promise\\": "src/" 188 | }, 189 | "files": [ 190 | "src/functions_include.php" 191 | ] 192 | }, 193 | "notification-url": "https://packagist.org/downloads/", 194 | "license": [ 195 | "MIT" 196 | ], 197 | "authors": [ 198 | { 199 | "name": "Michael Dowling", 200 | "email": "mtdowling@gmail.com", 201 | "homepage": "https://github.com/mtdowling" 202 | } 203 | ], 204 | "description": "Guzzle promises library", 205 | "keywords": [ 206 | "promise" 207 | ], 208 | "time": "2016-12-20T10:07:11+00:00" 209 | }, 210 | { 211 | "name": "guzzlehttp/psr7", 212 | "version": "1.6.1", 213 | "source": { 214 | "type": "git", 215 | "url": "https://github.com/guzzle/psr7.git", 216 | "reference": "239400de7a173fe9901b9ac7c06497751f00727a" 217 | }, 218 | "dist": { 219 | "type": "zip", 220 | "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", 221 | "reference": "239400de7a173fe9901b9ac7c06497751f00727a", 222 | "shasum": "", 223 | "mirrors": [ 224 | { 225 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 226 | "preferred": true 227 | } 228 | ] 229 | }, 230 | "require": { 231 | "php": ">=5.4.0", 232 | "psr/http-message": "~1.0", 233 | "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" 234 | }, 235 | "provide": { 236 | "psr/http-message-implementation": "1.0" 237 | }, 238 | "require-dev": { 239 | "ext-zlib": "*", 240 | "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" 241 | }, 242 | "suggest": { 243 | "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" 244 | }, 245 | "type": "library", 246 | "extra": { 247 | "branch-alias": { 248 | "dev-master": "1.6-dev" 249 | } 250 | }, 251 | "autoload": { 252 | "psr-4": { 253 | "GuzzleHttp\\Psr7\\": "src/" 254 | }, 255 | "files": [ 256 | "src/functions_include.php" 257 | ] 258 | }, 259 | "notification-url": "https://packagist.org/downloads/", 260 | "license": [ 261 | "MIT" 262 | ], 263 | "authors": [ 264 | { 265 | "name": "Michael Dowling", 266 | "email": "mtdowling@gmail.com", 267 | "homepage": "https://github.com/mtdowling" 268 | }, 269 | { 270 | "name": "Tobias Schultze", 271 | "homepage": "https://github.com/Tobion" 272 | } 273 | ], 274 | "description": "PSR-7 message implementation that also provides common utility methods", 275 | "keywords": [ 276 | "http", 277 | "message", 278 | "psr-7", 279 | "request", 280 | "response", 281 | "stream", 282 | "uri", 283 | "url" 284 | ], 285 | "time": "2019-07-01T23:21:34+00:00" 286 | }, 287 | { 288 | "name": "hassankhan/config", 289 | "version": "2.0.2", 290 | "source": { 291 | "type": "git", 292 | "url": "https://github.com/hassankhan/config.git", 293 | "reference": "d30cdc72d37a592e856e9f1b62e29a03b049d785" 294 | }, 295 | "dist": { 296 | "type": "zip", 297 | "url": "https://api.github.com/repos/hassankhan/config/zipball/d30cdc72d37a592e856e9f1b62e29a03b049d785", 298 | "reference": "d30cdc72d37a592e856e9f1b62e29a03b049d785", 299 | "shasum": "", 300 | "mirrors": [ 301 | { 302 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 303 | "preferred": true 304 | } 305 | ] 306 | }, 307 | "require": { 308 | "php": ">=5.5.9" 309 | }, 310 | "require-dev": { 311 | "phpunit/phpunit": "~4.8 || ~5.7 || ~6.5 || ~7.5", 312 | "scrutinizer/ocular": "~1.1", 313 | "squizlabs/php_codesniffer": "~2.2", 314 | "symfony/yaml": "~3.4" 315 | }, 316 | "suggest": { 317 | "symfony/yaml": "~3.4" 318 | }, 319 | "type": "library", 320 | "autoload": { 321 | "psr-4": { 322 | "Noodlehaus\\": "src" 323 | } 324 | }, 325 | "notification-url": "https://packagist.org/downloads/", 326 | "license": [ 327 | "MIT" 328 | ], 329 | "authors": [ 330 | { 331 | "name": "Hassan Khan", 332 | "homepage": "http://hassankhan.me/", 333 | "role": "Developer" 334 | } 335 | ], 336 | "description": "Lightweight configuration file loader that supports PHP, INI, XML, JSON, and YAML files", 337 | "homepage": "http://hassankhan.me/config/", 338 | "keywords": [ 339 | "config", 340 | "configuration", 341 | "ini", 342 | "json", 343 | "microphp", 344 | "unframework", 345 | "xml", 346 | "yaml", 347 | "yml" 348 | ], 349 | "time": "2019-04-06T17:34:30+00:00" 350 | }, 351 | { 352 | "name": "illuminate/container", 353 | "version": "v5.8.30", 354 | "source": { 355 | "type": "git", 356 | "url": "https://github.com/illuminate/container.git", 357 | "reference": "7afee1ef2cb53190a98d727ea77096b6a610c05e" 358 | }, 359 | "dist": { 360 | "type": "zip", 361 | "url": "https://api.github.com/repos/illuminate/container/zipball/7afee1ef2cb53190a98d727ea77096b6a610c05e", 362 | "reference": "7afee1ef2cb53190a98d727ea77096b6a610c05e", 363 | "shasum": "", 364 | "mirrors": [ 365 | { 366 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 367 | "preferred": true 368 | } 369 | ] 370 | }, 371 | "require": { 372 | "illuminate/contracts": "5.8.*", 373 | "illuminate/support": "5.8.*", 374 | "php": "^7.1.3", 375 | "psr/container": "^1.0" 376 | }, 377 | "type": "library", 378 | "extra": { 379 | "branch-alias": { 380 | "dev-master": "5.8-dev" 381 | } 382 | }, 383 | "autoload": { 384 | "psr-4": { 385 | "Illuminate\\Container\\": "" 386 | } 387 | }, 388 | "notification-url": "https://packagist.org/downloads/", 389 | "license": [ 390 | "MIT" 391 | ], 392 | "authors": [ 393 | { 394 | "name": "Taylor Otwell", 395 | "email": "taylor@laravel.com" 396 | } 397 | ], 398 | "description": "The Illuminate Container package.", 399 | "homepage": "https://laravel.com", 400 | "time": "2019-07-16T13:14:16+00:00" 401 | }, 402 | { 403 | "name": "illuminate/contracts", 404 | "version": "v5.8.30", 405 | "source": { 406 | "type": "git", 407 | "url": "https://github.com/illuminate/contracts.git", 408 | "reference": "00fc6afee788fa07c311b0650ad276585f8aef96" 409 | }, 410 | "dist": { 411 | "type": "zip", 412 | "url": "https://api.github.com/repos/illuminate/contracts/zipball/00fc6afee788fa07c311b0650ad276585f8aef96", 413 | "reference": "00fc6afee788fa07c311b0650ad276585f8aef96", 414 | "shasum": "", 415 | "mirrors": [ 416 | { 417 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 418 | "preferred": true 419 | } 420 | ] 421 | }, 422 | "require": { 423 | "php": "^7.1.3", 424 | "psr/container": "^1.0", 425 | "psr/simple-cache": "^1.0" 426 | }, 427 | "type": "library", 428 | "extra": { 429 | "branch-alias": { 430 | "dev-master": "5.8-dev" 431 | } 432 | }, 433 | "autoload": { 434 | "psr-4": { 435 | "Illuminate\\Contracts\\": "" 436 | } 437 | }, 438 | "notification-url": "https://packagist.org/downloads/", 439 | "license": [ 440 | "MIT" 441 | ], 442 | "authors": [ 443 | { 444 | "name": "Taylor Otwell", 445 | "email": "taylor@laravel.com" 446 | } 447 | ], 448 | "description": "The Illuminate Contracts package.", 449 | "homepage": "https://laravel.com", 450 | "time": "2019-07-30T13:57:21+00:00" 451 | }, 452 | { 453 | "name": "illuminate/database", 454 | "version": "v5.8.30", 455 | "source": { 456 | "type": "git", 457 | "url": "https://github.com/illuminate/database.git", 458 | "reference": "760ef316055ab69f711746e0455442d9b6b6db93" 459 | }, 460 | "dist": { 461 | "type": "zip", 462 | "url": "https://api.github.com/repos/illuminate/database/zipball/760ef316055ab69f711746e0455442d9b6b6db93", 463 | "reference": "760ef316055ab69f711746e0455442d9b6b6db93", 464 | "shasum": "", 465 | "mirrors": [ 466 | { 467 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 468 | "preferred": true 469 | } 470 | ] 471 | }, 472 | "require": { 473 | "ext-json": "*", 474 | "illuminate/container": "5.8.*", 475 | "illuminate/contracts": "5.8.*", 476 | "illuminate/support": "5.8.*", 477 | "php": "^7.1.3" 478 | }, 479 | "suggest": { 480 | "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6).", 481 | "fzaninotto/faker": "Required to use the eloquent factory builder (^1.4).", 482 | "illuminate/console": "Required to use the database commands (5.8.*).", 483 | "illuminate/events": "Required to use the observers with Eloquent (5.8.*).", 484 | "illuminate/filesystem": "Required to use the migrations (5.8.*).", 485 | "illuminate/pagination": "Required to paginate the result set (5.8.*)." 486 | }, 487 | "type": "library", 488 | "extra": { 489 | "branch-alias": { 490 | "dev-master": "5.8-dev" 491 | } 492 | }, 493 | "autoload": { 494 | "psr-4": { 495 | "Illuminate\\Database\\": "" 496 | } 497 | }, 498 | "notification-url": "https://packagist.org/downloads/", 499 | "license": [ 500 | "MIT" 501 | ], 502 | "authors": [ 503 | { 504 | "name": "Taylor Otwell", 505 | "email": "taylor@laravel.com" 506 | } 507 | ], 508 | "description": "The Illuminate Database package.", 509 | "homepage": "https://laravel.com", 510 | "keywords": [ 511 | "database", 512 | "laravel", 513 | "orm", 514 | "sql" 515 | ], 516 | "time": "2019-07-29T14:26:41+00:00" 517 | }, 518 | { 519 | "name": "illuminate/support", 520 | "version": "v5.8.30", 521 | "source": { 522 | "type": "git", 523 | "url": "https://github.com/illuminate/support.git", 524 | "reference": "1d82de27c37ee6e8493dac0521cbda5b9456626c" 525 | }, 526 | "dist": { 527 | "type": "zip", 528 | "url": "https://api.github.com/repos/illuminate/support/zipball/1d82de27c37ee6e8493dac0521cbda5b9456626c", 529 | "reference": "1d82de27c37ee6e8493dac0521cbda5b9456626c", 530 | "shasum": "", 531 | "mirrors": [ 532 | { 533 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 534 | "preferred": true 535 | } 536 | ] 537 | }, 538 | "require": { 539 | "doctrine/inflector": "^1.1", 540 | "ext-json": "*", 541 | "ext-mbstring": "*", 542 | "illuminate/contracts": "5.8.*", 543 | "nesbot/carbon": "^1.26.3 || ^2.0", 544 | "php": "^7.1.3" 545 | }, 546 | "conflict": { 547 | "tightenco/collect": "<5.5.33" 548 | }, 549 | "suggest": { 550 | "illuminate/filesystem": "Required to use the composer class (5.8.*).", 551 | "moontoast/math": "Required to use ordered UUIDs (^1.1).", 552 | "ramsey/uuid": "Required to use Str::uuid() (^3.7).", 553 | "symfony/process": "Required to use the composer class (^4.2).", 554 | "symfony/var-dumper": "Required to use the dd function (^4.2).", 555 | "vlucas/phpdotenv": "Required to use the env helper (^3.3)." 556 | }, 557 | "type": "library", 558 | "extra": { 559 | "branch-alias": { 560 | "dev-master": "5.8-dev" 561 | } 562 | }, 563 | "autoload": { 564 | "psr-4": { 565 | "Illuminate\\Support\\": "" 566 | }, 567 | "files": [ 568 | "helpers.php" 569 | ] 570 | }, 571 | "notification-url": "https://packagist.org/downloads/", 572 | "license": [ 573 | "MIT" 574 | ], 575 | "authors": [ 576 | { 577 | "name": "Taylor Otwell", 578 | "email": "taylor@laravel.com" 579 | } 580 | ], 581 | "description": "The Illuminate Support package.", 582 | "homepage": "https://laravel.com", 583 | "time": "2019-07-26T06:46:07+00:00" 584 | }, 585 | { 586 | "name": "nesbot/carbon", 587 | "version": "2.22.0", 588 | "source": { 589 | "type": "git", 590 | "url": "https://github.com/briannesbitt/Carbon.git", 591 | "reference": "1a0e48b5f656065ba3c265b058b25d36c2162a5e" 592 | }, 593 | "dist": { 594 | "type": "zip", 595 | "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/1a0e48b5f656065ba3c265b058b25d36c2162a5e", 596 | "reference": "1a0e48b5f656065ba3c265b058b25d36c2162a5e", 597 | "shasum": "", 598 | "mirrors": [ 599 | { 600 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 601 | "preferred": true 602 | } 603 | ] 604 | }, 605 | "require": { 606 | "ext-json": "*", 607 | "php": "^7.1.8 || ^8.0", 608 | "symfony/translation": "^3.4 || ^4.0" 609 | }, 610 | "require-dev": { 611 | "friendsofphp/php-cs-fixer": "^2.14 || ^3.0", 612 | "kylekatarnls/multi-tester": "^1.1", 613 | "phpmd/phpmd": "dev-php-7.1-compatibility", 614 | "phpstan/phpstan": "^0.11", 615 | "phpunit/phpunit": "^7.5 || ^8.0", 616 | "squizlabs/php_codesniffer": "^3.4" 617 | }, 618 | "bin": [ 619 | "bin/carbon" 620 | ], 621 | "type": "library", 622 | "extra": { 623 | "laravel": { 624 | "providers": [ 625 | "Carbon\\Laravel\\ServiceProvider" 626 | ] 627 | } 628 | }, 629 | "autoload": { 630 | "psr-4": { 631 | "Carbon\\": "src/Carbon/" 632 | } 633 | }, 634 | "notification-url": "https://packagist.org/downloads/", 635 | "license": [ 636 | "MIT" 637 | ], 638 | "authors": [ 639 | { 640 | "name": "Brian Nesbitt", 641 | "email": "brian@nesbot.com", 642 | "homepage": "http://nesbot.com" 643 | }, 644 | { 645 | "name": "kylekatarnls", 646 | "homepage": "http://github.com/kylekatarnls" 647 | } 648 | ], 649 | "description": "A simple API extension for DateTime.", 650 | "homepage": "http://carbon.nesbot.com", 651 | "keywords": [ 652 | "date", 653 | "datetime", 654 | "time" 655 | ], 656 | "time": "2019-07-28T09:02:12+00:00" 657 | }, 658 | { 659 | "name": "predis/predis", 660 | "version": "v1.1.1", 661 | "source": { 662 | "type": "git", 663 | "url": "https://github.com/nrk/predis.git", 664 | "reference": "f0210e38881631afeafb56ab43405a92cafd9fd1" 665 | }, 666 | "dist": { 667 | "type": "zip", 668 | "url": "https://api.github.com/repos/nrk/predis/zipball/f0210e38881631afeafb56ab43405a92cafd9fd1", 669 | "reference": "f0210e38881631afeafb56ab43405a92cafd9fd1", 670 | "shasum": "", 671 | "mirrors": [ 672 | { 673 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 674 | "preferred": true 675 | } 676 | ] 677 | }, 678 | "require": { 679 | "php": ">=5.3.9" 680 | }, 681 | "require-dev": { 682 | "phpunit/phpunit": "~4.8" 683 | }, 684 | "suggest": { 685 | "ext-curl": "Allows access to Webdis when paired with phpiredis", 686 | "ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol" 687 | }, 688 | "type": "library", 689 | "autoload": { 690 | "psr-4": { 691 | "Predis\\": "src/" 692 | } 693 | }, 694 | "notification-url": "https://packagist.org/downloads/", 695 | "license": [ 696 | "MIT" 697 | ], 698 | "authors": [ 699 | { 700 | "name": "Daniele Alessandri", 701 | "email": "suppakilla@gmail.com", 702 | "homepage": "http://clorophilla.net" 703 | } 704 | ], 705 | "description": "Flexible and feature-complete Redis client for PHP and HHVM", 706 | "homepage": "http://github.com/nrk/predis", 707 | "keywords": [ 708 | "nosql", 709 | "predis", 710 | "redis" 711 | ], 712 | "time": "2016-06-16T16:22:20+00:00" 713 | }, 714 | { 715 | "name": "psr/container", 716 | "version": "1.0.0", 717 | "source": { 718 | "type": "git", 719 | "url": "https://github.com/php-fig/container.git", 720 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" 721 | }, 722 | "dist": { 723 | "type": "zip", 724 | "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 725 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 726 | "shasum": "", 727 | "mirrors": [ 728 | { 729 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 730 | "preferred": true 731 | } 732 | ] 733 | }, 734 | "require": { 735 | "php": ">=5.3.0" 736 | }, 737 | "type": "library", 738 | "extra": { 739 | "branch-alias": { 740 | "dev-master": "1.0.x-dev" 741 | } 742 | }, 743 | "autoload": { 744 | "psr-4": { 745 | "Psr\\Container\\": "src/" 746 | } 747 | }, 748 | "notification-url": "https://packagist.org/downloads/", 749 | "license": [ 750 | "MIT" 751 | ], 752 | "authors": [ 753 | { 754 | "name": "PHP-FIG", 755 | "homepage": "http://www.php-fig.org/" 756 | } 757 | ], 758 | "description": "Common Container Interface (PHP FIG PSR-11)", 759 | "homepage": "https://github.com/php-fig/container", 760 | "keywords": [ 761 | "PSR-11", 762 | "container", 763 | "container-interface", 764 | "container-interop", 765 | "psr" 766 | ], 767 | "time": "2017-02-14T16:28:37+00:00" 768 | }, 769 | { 770 | "name": "psr/http-message", 771 | "version": "1.0.1", 772 | "source": { 773 | "type": "git", 774 | "url": "https://github.com/php-fig/http-message.git", 775 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" 776 | }, 777 | "dist": { 778 | "type": "zip", 779 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", 780 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", 781 | "shasum": "", 782 | "mirrors": [ 783 | { 784 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 785 | "preferred": true 786 | } 787 | ] 788 | }, 789 | "require": { 790 | "php": ">=5.3.0" 791 | }, 792 | "type": "library", 793 | "extra": { 794 | "branch-alias": { 795 | "dev-master": "1.0.x-dev" 796 | } 797 | }, 798 | "autoload": { 799 | "psr-4": { 800 | "Psr\\Http\\Message\\": "src/" 801 | } 802 | }, 803 | "notification-url": "https://packagist.org/downloads/", 804 | "license": [ 805 | "MIT" 806 | ], 807 | "authors": [ 808 | { 809 | "name": "PHP-FIG", 810 | "homepage": "http://www.php-fig.org/" 811 | } 812 | ], 813 | "description": "Common interface for HTTP messages", 814 | "homepage": "https://github.com/php-fig/http-message", 815 | "keywords": [ 816 | "http", 817 | "http-message", 818 | "psr", 819 | "psr-7", 820 | "request", 821 | "response" 822 | ], 823 | "time": "2016-08-06T14:39:51+00:00" 824 | }, 825 | { 826 | "name": "psr/simple-cache", 827 | "version": "1.0.1", 828 | "source": { 829 | "type": "git", 830 | "url": "https://github.com/php-fig/simple-cache.git", 831 | "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" 832 | }, 833 | "dist": { 834 | "type": "zip", 835 | "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", 836 | "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", 837 | "shasum": "", 838 | "mirrors": [ 839 | { 840 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 841 | "preferred": true 842 | } 843 | ] 844 | }, 845 | "require": { 846 | "php": ">=5.3.0" 847 | }, 848 | "type": "library", 849 | "extra": { 850 | "branch-alias": { 851 | "dev-master": "1.0.x-dev" 852 | } 853 | }, 854 | "autoload": { 855 | "psr-4": { 856 | "Psr\\SimpleCache\\": "src/" 857 | } 858 | }, 859 | "notification-url": "https://packagist.org/downloads/", 860 | "license": [ 861 | "MIT" 862 | ], 863 | "authors": [ 864 | { 865 | "name": "PHP-FIG", 866 | "homepage": "http://www.php-fig.org/" 867 | } 868 | ], 869 | "description": "Common interfaces for simple caching", 870 | "keywords": [ 871 | "cache", 872 | "caching", 873 | "psr", 874 | "psr-16", 875 | "simple-cache" 876 | ], 877 | "time": "2017-10-23T01:57:42+00:00" 878 | }, 879 | { 880 | "name": "ralouphie/getallheaders", 881 | "version": "3.0.3", 882 | "source": { 883 | "type": "git", 884 | "url": "https://github.com/ralouphie/getallheaders.git", 885 | "reference": "120b605dfeb996808c31b6477290a714d356e822" 886 | }, 887 | "dist": { 888 | "type": "zip", 889 | "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", 890 | "reference": "120b605dfeb996808c31b6477290a714d356e822", 891 | "shasum": "", 892 | "mirrors": [ 893 | { 894 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 895 | "preferred": true 896 | } 897 | ] 898 | }, 899 | "require": { 900 | "php": ">=5.6" 901 | }, 902 | "require-dev": { 903 | "php-coveralls/php-coveralls": "^2.1", 904 | "phpunit/phpunit": "^5 || ^6.5" 905 | }, 906 | "type": "library", 907 | "autoload": { 908 | "files": [ 909 | "src/getallheaders.php" 910 | ] 911 | }, 912 | "notification-url": "https://packagist.org/downloads/", 913 | "license": [ 914 | "MIT" 915 | ], 916 | "authors": [ 917 | { 918 | "name": "Ralph Khattar", 919 | "email": "ralph.khattar@gmail.com" 920 | } 921 | ], 922 | "description": "A polyfill for getallheaders.", 923 | "time": "2019-03-08T08:55:37+00:00" 924 | }, 925 | { 926 | "name": "symfony/polyfill-mbstring", 927 | "version": "v1.11.0", 928 | "source": { 929 | "type": "git", 930 | "url": "https://github.com/symfony/polyfill-mbstring.git", 931 | "reference": "fe5e94c604826c35a32fa832f35bd036b6799609" 932 | }, 933 | "dist": { 934 | "type": "zip", 935 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fe5e94c604826c35a32fa832f35bd036b6799609", 936 | "reference": "fe5e94c604826c35a32fa832f35bd036b6799609", 937 | "shasum": "", 938 | "mirrors": [ 939 | { 940 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 941 | "preferred": true 942 | } 943 | ] 944 | }, 945 | "require": { 946 | "php": ">=5.3.3" 947 | }, 948 | "suggest": { 949 | "ext-mbstring": "For best performance" 950 | }, 951 | "type": "library", 952 | "extra": { 953 | "branch-alias": { 954 | "dev-master": "1.11-dev" 955 | } 956 | }, 957 | "autoload": { 958 | "psr-4": { 959 | "Symfony\\Polyfill\\Mbstring\\": "" 960 | }, 961 | "files": [ 962 | "bootstrap.php" 963 | ] 964 | }, 965 | "notification-url": "https://packagist.org/downloads/", 966 | "license": [ 967 | "MIT" 968 | ], 969 | "authors": [ 970 | { 971 | "name": "Nicolas Grekas", 972 | "email": "p@tchwork.com" 973 | }, 974 | { 975 | "name": "Symfony Community", 976 | "homepage": "https://symfony.com/contributors" 977 | } 978 | ], 979 | "description": "Symfony polyfill for the Mbstring extension", 980 | "homepage": "https://symfony.com", 981 | "keywords": [ 982 | "compatibility", 983 | "mbstring", 984 | "polyfill", 985 | "portable", 986 | "shim" 987 | ], 988 | "time": "2019-02-06T07:57:58+00:00" 989 | }, 990 | { 991 | "name": "symfony/translation", 992 | "version": "v4.3.3", 993 | "source": { 994 | "type": "git", 995 | "url": "https://github.com/symfony/translation.git", 996 | "reference": "4e3e39cc485304f807622bdc64938e4633396406" 997 | }, 998 | "dist": { 999 | "type": "zip", 1000 | "url": "https://api.github.com/repos/symfony/translation/zipball/4e3e39cc485304f807622bdc64938e4633396406", 1001 | "reference": "4e3e39cc485304f807622bdc64938e4633396406", 1002 | "shasum": "", 1003 | "mirrors": [ 1004 | { 1005 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1006 | "preferred": true 1007 | } 1008 | ] 1009 | }, 1010 | "require": { 1011 | "php": "^7.1.3", 1012 | "symfony/polyfill-mbstring": "~1.0", 1013 | "symfony/translation-contracts": "^1.1.2" 1014 | }, 1015 | "conflict": { 1016 | "symfony/config": "<3.4", 1017 | "symfony/dependency-injection": "<3.4", 1018 | "symfony/yaml": "<3.4" 1019 | }, 1020 | "provide": { 1021 | "symfony/translation-implementation": "1.0" 1022 | }, 1023 | "require-dev": { 1024 | "psr/log": "~1.0", 1025 | "symfony/config": "~3.4|~4.0", 1026 | "symfony/console": "~3.4|~4.0", 1027 | "symfony/dependency-injection": "~3.4|~4.0", 1028 | "symfony/finder": "~2.8|~3.0|~4.0", 1029 | "symfony/http-kernel": "~3.4|~4.0", 1030 | "symfony/intl": "~3.4|~4.0", 1031 | "symfony/service-contracts": "^1.1.2", 1032 | "symfony/var-dumper": "~3.4|~4.0", 1033 | "symfony/yaml": "~3.4|~4.0" 1034 | }, 1035 | "suggest": { 1036 | "psr/log-implementation": "To use logging capability in translator", 1037 | "symfony/config": "", 1038 | "symfony/yaml": "" 1039 | }, 1040 | "type": "library", 1041 | "extra": { 1042 | "branch-alias": { 1043 | "dev-master": "4.3-dev" 1044 | } 1045 | }, 1046 | "autoload": { 1047 | "psr-4": { 1048 | "Symfony\\Component\\Translation\\": "" 1049 | }, 1050 | "exclude-from-classmap": [ 1051 | "/Tests/" 1052 | ] 1053 | }, 1054 | "notification-url": "https://packagist.org/downloads/", 1055 | "license": [ 1056 | "MIT" 1057 | ], 1058 | "authors": [ 1059 | { 1060 | "name": "Fabien Potencier", 1061 | "email": "fabien@symfony.com" 1062 | }, 1063 | { 1064 | "name": "Symfony Community", 1065 | "homepage": "https://symfony.com/contributors" 1066 | } 1067 | ], 1068 | "description": "Symfony Translation Component", 1069 | "homepage": "https://symfony.com", 1070 | "time": "2019-07-18T10:34:59+00:00" 1071 | }, 1072 | { 1073 | "name": "symfony/translation-contracts", 1074 | "version": "v1.1.5", 1075 | "source": { 1076 | "type": "git", 1077 | "url": "https://github.com/symfony/translation-contracts.git", 1078 | "reference": "cb4b18ad7b92a26e83b65dde940fab78339e6f3c" 1079 | }, 1080 | "dist": { 1081 | "type": "zip", 1082 | "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/cb4b18ad7b92a26e83b65dde940fab78339e6f3c", 1083 | "reference": "cb4b18ad7b92a26e83b65dde940fab78339e6f3c", 1084 | "shasum": "", 1085 | "mirrors": [ 1086 | { 1087 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1088 | "preferred": true 1089 | } 1090 | ] 1091 | }, 1092 | "require": { 1093 | "php": "^7.1.3" 1094 | }, 1095 | "suggest": { 1096 | "symfony/translation-implementation": "" 1097 | }, 1098 | "type": "library", 1099 | "extra": { 1100 | "branch-alias": { 1101 | "dev-master": "1.1-dev" 1102 | } 1103 | }, 1104 | "autoload": { 1105 | "psr-4": { 1106 | "Symfony\\Contracts\\Translation\\": "" 1107 | } 1108 | }, 1109 | "notification-url": "https://packagist.org/downloads/", 1110 | "license": [ 1111 | "MIT" 1112 | ], 1113 | "authors": [ 1114 | { 1115 | "name": "Nicolas Grekas", 1116 | "email": "p@tchwork.com" 1117 | }, 1118 | { 1119 | "name": "Symfony Community", 1120 | "homepage": "https://symfony.com/contributors" 1121 | } 1122 | ], 1123 | "description": "Generic abstractions related to translation", 1124 | "homepage": "https://symfony.com", 1125 | "keywords": [ 1126 | "abstractions", 1127 | "contracts", 1128 | "decoupling", 1129 | "interfaces", 1130 | "interoperability", 1131 | "standards" 1132 | ], 1133 | "time": "2019-06-13T11:15:36+00:00" 1134 | }, 1135 | { 1136 | "name": "workerman/gateway-worker", 1137 | "version": "v3.0.13", 1138 | "source": { 1139 | "type": "git", 1140 | "url": "https://github.com/walkor/GatewayWorker.git", 1141 | "reference": "38b44c95f21cd340b5a9cff3987ddb2abb9a2a38" 1142 | }, 1143 | "dist": { 1144 | "type": "zip", 1145 | "url": "https://api.github.com/repos/walkor/GatewayWorker/zipball/38b44c95f21cd340b5a9cff3987ddb2abb9a2a38", 1146 | "reference": "38b44c95f21cd340b5a9cff3987ddb2abb9a2a38", 1147 | "shasum": "", 1148 | "mirrors": [ 1149 | { 1150 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1151 | "preferred": true 1152 | } 1153 | ] 1154 | }, 1155 | "require": { 1156 | "workerman/workerman": ">=3.1.8" 1157 | }, 1158 | "type": "library", 1159 | "autoload": { 1160 | "psr-4": { 1161 | "GatewayWorker\\": "./src" 1162 | } 1163 | }, 1164 | "notification-url": "https://packagist.org/downloads/", 1165 | "license": [ 1166 | "MIT" 1167 | ], 1168 | "homepage": "http://www.workerman.net", 1169 | "keywords": [ 1170 | "communication", 1171 | "distributed" 1172 | ], 1173 | "time": "2019-07-02T11:55:24+00:00" 1174 | }, 1175 | { 1176 | "name": "workerman/workerman", 1177 | "version": "v3.5.20", 1178 | "source": { 1179 | "type": "git", 1180 | "url": "https://github.com/walkor/Workerman.git", 1181 | "reference": "4d590130310a8d7632f807120c3ca1c0f55ed0d7" 1182 | }, 1183 | "dist": { 1184 | "type": "zip", 1185 | "url": "https://api.github.com/repos/walkor/Workerman/zipball/4d590130310a8d7632f807120c3ca1c0f55ed0d7", 1186 | "reference": "4d590130310a8d7632f807120c3ca1c0f55ed0d7", 1187 | "shasum": "", 1188 | "mirrors": [ 1189 | { 1190 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1191 | "preferred": true 1192 | } 1193 | ] 1194 | }, 1195 | "require": { 1196 | "php": ">=5.3" 1197 | }, 1198 | "suggest": { 1199 | "ext-event": "For better performance. " 1200 | }, 1201 | "type": "library", 1202 | "autoload": { 1203 | "psr-4": { 1204 | "Workerman\\": "./" 1205 | } 1206 | }, 1207 | "notification-url": "https://packagist.org/downloads/", 1208 | "license": [ 1209 | "MIT" 1210 | ], 1211 | "authors": [ 1212 | { 1213 | "name": "walkor", 1214 | "role": "Developer", 1215 | "email": "walkor@workerman.net", 1216 | "homepage": "http://www.workerman.net" 1217 | } 1218 | ], 1219 | "description": "An asynchronous event driven PHP framework for easily building fast, scalable network applications.", 1220 | "homepage": "http://www.workerman.net", 1221 | "keywords": [ 1222 | "asynchronous", 1223 | "event-loop" 1224 | ], 1225 | "time": "2019-07-02T10:23:18+00:00" 1226 | } 1227 | ], 1228 | "packages-dev": [], 1229 | "aliases": [], 1230 | "minimum-stability": "stable", 1231 | "stability-flags": [], 1232 | "prefer-stable": false, 1233 | "prefer-lowest": false, 1234 | "platform": [], 1235 | "platform-dev": [] 1236 | } 1237 | --------------------------------------------------------------------------------