From 060fb1ae5cb631a06529effbb19f1c3812f4837d Mon Sep 17 00:00:00 2001 From: ASUS <515617283@qq.com> Date: Wed, 17 Sep 2025 18:03:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A8=A1=E7=89=88=E6=B6=88=E6=81=AF=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/functions.php | 30 +- app/model/MessagePushTask.php | 341 +++++-- app/process/MessagePushTask.php | 10 +- composer.json | 10 +- composer.lock | 1668 ++++++++++++++++++++++++++++++- config/cons.php | 8 + 6 files changed, 1976 insertions(+), 91 deletions(-) create mode 100644 config/cons.php diff --git a/app/functions.php b/app/functions.php index de46d8f..1b63623 100644 --- a/app/functions.php +++ b/app/functions.php @@ -22,4 +22,32 @@ if (!function_exists('p')) { } die; } -} \ No newline at end of file +} + +/** + * 多维数组去重并重新索引 + * @param array $array 待处理的多维数组 + * @return array 去重后并重新索引的数组 + */ +function uniqueMultidimensionalArray($array, $k = 'user_id') { + $unique = []; + $seenIds = []; // 用于记录已出现的user_id + + foreach ($array as $item) { + // 确保子数组包含user_id字段 + if (!isset($item[$k])) { + continue; // 跳过不包含user_id的子数组(可选:也可抛出异常) + } + + $userId = $item[$k]; + // 如果user_id未出现过,则保留该记录 + if (!in_array($userId, $seenIds)) { + $seenIds[] = $userId; + $unique[] = $item; + } + // 已出现的user_id会被自动跳过(去重) + } + + // 重新索引数组(从0开始的连续数字键) + return array_values($unique); +} diff --git a/app/model/MessagePushTask.php b/app/model/MessagePushTask.php index 3fb6be5..5481ea1 100644 --- a/app/model/MessagePushTask.php +++ b/app/model/MessagePushTask.php @@ -5,6 +5,7 @@ namespace app\model; // 消息推送 use support\Log; use support\think\Db; +use EasyWeChat\Factory; class MessagePushTask { @@ -13,11 +14,70 @@ class MessagePushTask // 查询任务 $event_list = Db::name('tb_push_event')->where(['status' => 0])->select(); if($event_list) { - foreach ($event_list as $k => $event) { - $user_list = self::getPullInfoUser($event); + try { + Db::startTrans(); + foreach ($event_list as $k => $event) { + Db::name('tb_push_event')->where(['id' => $event['id']])->update(['status' => 1, 'start_time' => date('Y-m-d H:i:s')]); + $res = self::getPullInfoUser($event); + if($res) { + foreach ($res as $rk => &$rv) { + if(empty($rv['open_id'])) { + unset($res[$rk]); + } + $rv['push_event_id'] = $event['id']; + $rv['template_id'] = $event['template_id']; + $rv['keyword1'] = $event['keyword1']; + $rv['keyword2'] = $event['keyword2']; + $rv['keyword3'] = $event['keyword3']; + $rv['keyword4'] = $event['keyword4']; + $rv['keyword5'] = $event['keyword5']; + } + + $user_list = uniqueMultidimensionalArray($res); + // 需要接收推送的用户 准备发送 + foreach ($user_list as $k => $user) { + $user_push_list_res_id = Db::name('tb_user_push_event')->insertGetId([ + 'push_event_id' => $user['push_event_id'], + 'user_id' => $user['user_id'], + 'create_time' => date("Y-m-d H:i:s"), + ]); + if($user_push_list_res_id) { + $app = Factory::officialAccount([ + 'app_id' => config('cons.app_id'), + 'secret' => config('cons.secret'), + 'response_type' => 'array', + ]); + $data = [ + 'thing2' => $user['keyword1'], + 'amount3' => $user['keyword2'], + 'time6' => $user['keyword3'], + ]; + // 正式推送 + $push = $app->template_message->send([ + 'touser' => $user['open_id'], + 'template_id' => $user['template_id'], + 'data' => $data + ]); + Log::info('用户-' . $user['user_id'] . ' 推送模版ID:'. $user['template_id'] .' 内容:' . json_encode($data, 256) . ' 推送结果:' . json_encode($push)); + if($push['errcode'] == 0) { + Db::name('tb_user_push_event')->where(['id' => $user_push_list_res_id])->update(['update_time' => date("Y-m-d H:i:s"), 'status' => 1]); + }else { + Db::name('tb_user_push_event')->where(['id' => $user_push_list_res_id])->update(['update_time' => date("Y-m-d H:i:s"), 'status' => -1, 'error' => json_encode($push)]); + } + } + sleep(1); + } + Db::name('tb_push_event')->where(['id' => $event['id']])->update(['status' => 2, 'send_time' => date('Y-m-d H:i:s')]); + } + } + Db::commit(); + }catch (\Exception $e) { + Log::info('执行出错--' . $e->getMessage()); + Db::rollback(); } } - + Log::info('没有推送任务可执行'); + return true; } @@ -49,10 +109,11 @@ class MessagePushTask { $user_num = []; if($event['can_send_times'] > 0) { - $user_num = Db::name('tb_user_push_event_num')->alias('upen')->where(['num', '>=', $event['can_send_times']]) + $user_num = Db::name('tb_user_push_event_num')->alias('upen')->where('upen.num', '>=', $event['can_send_times']) ->join('tb_user_info u', 'upen.user_id = u.id') - ->field('upen.user_id as user_id, u.wechat_ac_open_id as open_id') - ->column('open_id', 'user_id'); + ->field('upen.user_id as user_id, upen.open_id as open_id') + ->select() + ->toArray(); } return $user_num; } @@ -64,26 +125,39 @@ class MessagePushTask $data_arr = []; // 按照性别 if(isset($event['gender']) && is_string($event['gender'])) { + $gender_data_arr = []; $gender_arr = explode(',', $event['gender']); foreach ($gender_arr as $k => $gender) { // 未知 if($gender == 0) { - $data_arr[] = Db::name('tb_user_info')->whereNotIn('sex', [0,1]) - ->field('user_id as user_id, wechat_ac_open_id as open_id') - ->column('open_id', 'user_id'); + $gender_data_res = Db::name('tb_user_info')->whereNotIn('sex', [0,1]) + ->field('id as user_id, wechat_ac_open_id as open_id') + ->select() + ->toArray(); } // 男 if($gender == 1) { - $data_arr[] = Db::name('tb_user_info')->where('sex', 1) - ->field('user_id as user_id, wechat_ac_open_id as open_id') - ->column('open_id', 'user_id'); + $gender_data_res = Db::name('tb_user_info')->where('sex', 1) + ->field('id as user_id, wechat_ac_open_id as open_id') + ->select() + ->toArray(); } // 女 if($gender == 2) { - $data_arr[] = Db::name('tb_user_info')->where('sex', 0) - ->field('user_id as user_id, wechat_ac_open_id as open_id') - ->column('open_id', 'user_id'); + $gender_data_res = Db::name('tb_user_info')->where('sex', 0) + ->field('id as user_id, wechat_ac_open_id as open_id') + ->select() + ->toArray(); } + if($gender_data_arr) { + $gender_data_arr = array_merge($gender_data_arr, $gender_data_res); + }else { + $gender_data_arr = $gender_data_res; + } + } + if($gender_data_arr) { + $data_arr = array_merge($data_arr, $gender_data_arr); + } } @@ -91,144 +165,247 @@ class MessagePushTask // 按照下单次数 if(isset($event['order_history']) && is_string($event['order_history'])) { $order_history_arr = explode(',', $event['order_history']); + $order_history_data_arr = []; foreach ($order_history_arr as $k => $order_history) { // 从未下单 if($order_history == 0) { - $data_arr[] = Db::name('tb_user_info') + $order_history_data_res = Db::name('tb_user_info') ->alias('u') // 用户表别名u ->leftJoin('tb_order_info o', 'u.id = o.user_id') ->where('o.user_id', 'null') + ->distinct() ->field('u.id as user_id, u.wechat_ac_open_id as open_id') - ->distinct(true) - ->column('open_id', 'user_id'); + ->select() + ->toArray(); } // 下过1单 if($order_history == 1) { - $data_arr[] = Db::name('tb_user_info') + $order_history_data_res = Db::name('tb_user_info') ->alias('u') // 关联订单表,使用内连接确保只包含有订单的用户 - ->innerJoin('tb_order_info o', 'u.id = o.user_id') + ->join('tb_order_info o', 'u.id = o.user_id') // 按用户ID分组 ->group('u.id') // 筛选出订单数量为1的用户 ->having('COUNT(o.id) = 1') // 选择需要的用户字段,同时查询订单数量(可选) - ->field('u.id as user_id, u.wechat_ac_open_id as user_id') - ->column('open_id', 'user_id'); + ->field('u.id as user_id, u.wechat_ac_open_id as open_id') + ->select() + ->toArray(); } // 下过2-5单 if($order_history == 2) { - $data_arr[] = Db::name('tb_user_info') + $order_history_data_res = Db::name('tb_user_info') ->alias('u') // 关联订单表,使用内连接确保只包含有订单的用户 - ->innerJoin('tb_order_info o', 'u.id = o.user_id') + ->join('tb_order_info o', 'u.id = o.user_id') // 按用户ID分组 ->group('u.id') // 筛选出订单数量为1的用户 ->having('COUNT(o.id) BETWEEN 2 AND 5') - // 选择需要的用户字段,同时查询订单数量(可选) - ->field('u.id as user_id, u.wechat_ac_open_id as user_id') - ->column('open_id', 'user_id'); + ->field('u.id as user_id, u.wechat_ac_open_id as open_id') + ->select() + ->toArray(); } // 下过5单起 if($order_history == 3) { - $data_arr[] = Db::name('tb_user_info') + $order_history_data_res = Db::name('tb_user_info') ->alias('u') // 关联订单表,使用内连接确保只包含有订单的用户 - ->innerJoin('tb_order_info o', 'u.id = o.user_id') + ->join('tb_order_info o', 'u.id = o.user_id') // 按用户ID分组 ->group('u.id') // 筛选出订单数量为1的用户 ->having('COUNT(o.id) >= 5') - // 选择需要的用户字段,同时查询订单数量(可选) - ->field('u.id as user_id, u.wechat_ac_open_id as user_id') - ->column('open_id', 'user_id'); + ->field('u.id as user_id, u.wechat_ac_open_id as open_id') + ->select() + ->toArray(); } + if($order_history_data_arr) { + $order_history_data_arr = array_merge($order_history_data_arr, $order_history_data_res); + ; + }else { + $order_history_data_arr = $order_history_data_res; + } + } + if($order_history_data_arr) { + $data_arr = array_merge($data_arr, $gender_data_arr); + } } - // 按照下单时间 no + // 按照下单时间 if(isset($event['order_times']) && is_string($event['order_times'])) { $order_times_arr = explode(',', $event['order_times']); + $order_times_data_arr = []; foreach ($order_times_arr as $k => $order_times) { // 今天下过 if($order_times == 0) { - $data_arr[] = Db::name('tb_user_info') + $order_times_data_res = Db::name('tb_user_info') ->alias('u') // 用户表别名u - ->innerJoin('tb_order_info o', 'u.id = o.user_id') + ->join('tb_order_info o', 'u.id = o.user_id') ->where('o.create_time', '>=', date('Y-m-d 00:00:00')) ->where('o.create_time', '<=', date('Y-m-d 23:59:59')) ->field('u.id as user_id, u.wechat_ac_open_id as open_id') - ->distinct(true) - ->column('open_id', 'user_id'); + ->distinct() + ->select() + ->toArray(); } // 昨天下过 if($order_times == 1) { - $data_arr[] = Db::name('tb_user_info') - ->alias('u') - // 关联订单表,使用内连接确保只包含有订单的用户 - ->innerJoin('tb_order_info o', 'u.id = o.user_id') - // 按用户ID分组 - ->group('u.id') - // 筛选出订单数量为1的用户 - ->having('COUNT(o.id) = 1') - // 选择需要的用户字段,同时查询订单数量(可选) - ->field('u.id as user_id, u.wechat_ac_open_id as user_id') - ->column('open_id', 'user_id'); + $order_times_data_res = Db::name('tb_user_info') + ->alias('u') // 用户表别名u + ->join('tb_order_info o', 'u.id = o.user_id') + ->where('o.create_time', '>=', date('Y-m-d 00:00:00', strtotime('-1 day'))) + ->where('o.create_time', '<=', date('Y-m-d 23:59:59', strtotime('-1 day'))) + ->field('u.id as user_id, u.wechat_ac_open_id as open_id') + ->distinct() + ->select() + ->toArray(); } // 2周内没下过 if($order_times == 2) { - $data_arr[] = Db::name('tb_user_info') - ->alias('u') - // 关联订单表,使用内连接确保只包含有订单的用户 - ->innerJoin('tb_order_info o', 'u.id = o.user_id') - // 按用户ID分组 - ->group('u.id') - // 筛选出订单数量为1的用户 - ->having('COUNT(o.id) BETWEEN 2 AND 5') - // 选择需要的用户字段,同时查询订单数量(可选) - ->field('u.id as user_id, u.wechat_ac_open_id as user_id') - ->column('open_id', 'user_id'); + $twoWeeksAgo = date('Y-m-d H:i:s', strtotime('-14 days')); + $order_times_data_res = Db::name('tb_user_info') + ->alias('u') // 用户表别名u + // 左连接订单表,关联条件包含近两周内的订单 + ->leftJoin('tb_order_info o', 'u.id = o.user_id') + ->where('o.create_time', '>=', $twoWeeksAgo) + ->where('o.id', 'null') + ->field('u.id as user_id, u.wechat_ac_open_id as open_id') + ->distinct() + ->select() + ->toArray(); } // 半个月-1个月没下过 if($order_times == 3) { - $data_arr[] = Db::name('tb_user_info') - ->alias('u') - // 关联订单表,使用内连接确保只包含有订单的用户 - ->innerJoin('tb_order_info o', 'u.id = o.user_id') - // 按用户ID分组 + $startTime = date('Y-m-d H:i:s', strtotime('-30 days')); + $endTime = date('Y-m-d H:i:s', strtotime('-15 days')); + $order_times_data_res = Db::name('tb_user_info') + ->alias('u') // 用户表别名u + // 左连接订单表,关联条件包含近两周内的订单 + ->join('tb_order_info o', 'u.id = o.user_id') + // 按用户分组 ->group('u.id') - // 筛选出订单数量为1的用户 - ->having('COUNT(o.id) >= 5') - // 选择需要的用户字段,同时查询订单数量(可选) - ->field('u.id as user_id, u.wechat_ac_open_id as user_id') - ->column('open_id', 'user_id'); + // 筛选最后下单时间在30天前到15天前之间的用户 + ->having('MAX(o.create_time) >="'. $startTime .'" AND MAX(o.create_time) <= "' . $endTime . '"') + ->field('u.id as user_id, u.wechat_ac_open_id as open_id') + ->select() + ->toArray(); } // 1个月以上没下过 if($order_times == 4) { - $data_arr[] = Db::name('tb_user_info') - ->alias('u') - // 关联订单表,使用内连接确保只包含有订单的用户 - ->innerJoin('tb_order_info o', 'u.id = o.user_id') - // 按用户ID分组 + $oneMonthAgo = date('Y-m-d H:i:s', strtotime('-30 days')); + $order_times_data_res = Db::name('tb_user_info') + ->alias('u') // 用户表别名u + // 左连接订单表,关联条件包含近两周内的订单 + ->join('tb_order_info o', 'u.id = o.user_id') + // 按用户分组 ->group('u.id') - // 筛选出订单数量为1的用户 - ->having('COUNT(o.id) >= 5') - // 选择需要的用户字段,同时查询订单数量(可选) - ->field('u.id as user_id, u.wechat_ac_open_id as user_id') - ->column('open_id', 'user_id'); + // 筛选最后下单时间在1个月前及更早 + ->having('MAX(o.create_time) <= "' . $oneMonthAgo . '"') +// ->field('u.id as user_id, u.wechat_ac_open_id as open_id, MAX(o.create_time) as last_order_time') + ->field('u.id as user_id, u.wechat_ac_open_id as open_id') + ->select() + ->toArray(); + } + if($order_times_data_arr) { + $order_times_data_arr = array_merge($order_times_data_arr, $order_times_data_res); + + }else { + $order_times_data_arr = $order_times_data_res; + } + } + if($order_times_data_arr) { + $data_arr = array_merge($data_arr, $order_times_data_arr); + + } + + // 按照会员 + if(isset($event['vip']) && is_string($event['vip'])) { + $vip_data_arr = []; + $vip_arr = explode(',', $event['vip']); + foreach ($vip_arr as $k => $vip) { + // 非会员 + if($vip == 0) { + $vip_data_res = Db::name('tb_user_info')->whereNotIn('is_vip', 0) + ->field('id as user_id, wechat_ac_open_id as open_id') + ->select() + ->toArray(); + } + // 会员 + if($vip == 1) { + $vip_data_res = Db::name('tb_user_info')->where('is_vip', 1) + ->field('id as user_id, wechat_ac_open_id as open_id') + ->select() + ->toArray(); + } + + if($vip_data_arr) { + $vip_data_arr = array_merge($vip_data_arr, $vip_data_res); + + }else { + $vip_data_arr = $vip_data_res; + } + } + if($vip_data_arr) { + $data_arr = array_merge($data_arr, $vip_data_arr); + + } + } + + // 按照手机号 + if(isset($event['telphone']) && is_string($event['telphone'])) { + $telphone_data_arr = []; + $telphone_arr = explode(',', $event['telphone']); + foreach ($telphone_arr as $k => $telphone) { + // 非绑定 + if($telphone == 0) { + $telphone_data_res = Db::name('tb_user_info')->where(function ($query) { + $query->where('phone', 'null') // 为 NULL + ->whereOr('phone', ''); // 为空字符串 + }) + ->field('id as user_id, wechat_ac_open_id as open_id') + ->select() + ->toArray(); + } + // 已绑定 + if($telphone == 1) { + $telphone_data_res = Db::name('tb_user_info')->where('phone', '<>', '') + ->field('id as user_id, wechat_ac_open_id as open_id') + ->select() + ->toArray(); + } + if($telphone_data_arr) { + $telphone_data_arr = array_merge($telphone_data_arr, $telphone_data_res); + + }else { + $telphone_data_arr = $telphone_data_res; + } + } + if($telphone_data_arr) { + $data_arr = array_merge($data_arr, $telphone_data_arr); + } } } - - return $data_arr; } // 按照标签获取用户信息 public static function getPullInfoUserToLabel($event) { - return []; + $data_arr = []; + $label = Db::name('tb_user_label')->whereIn('label_id', explode(',', $event['user_label'])) + ->distinct() + ->column('user_id'); + if($label) { + $data_arr = Db::name('tb_user_info')->whereIn('id', $label) + ->field('id as user_id, wechat_ac_open_id as open_id') + ->select() + ->toArray(); + } + return $data_arr; } diff --git a/app/process/MessagePushTask.php b/app/process/MessagePushTask.php index c028065..77beaa3 100644 --- a/app/process/MessagePushTask.php +++ b/app/process/MessagePushTask.php @@ -19,11 +19,11 @@ class MessagePushTask // 每分钟执行 营销推送 - new Crontab('1 * * * * *', function(){ - Log::info('营销推送开始执行---->'); - \app\model\MessagePushTask::send_msg(); - Log::info('营销推送执行结束---->'); - }); +// new Crontab('1 * * * * *', function(){ +// Log::info('营销推送开始执行---->'); +// \app\model\MessagePushTask::send_msg(); +// Log::info('营销推送执行结束---->'); +// }); diff --git a/composer.json b/composer.json index 50e9c50..5e16c53 100644 --- a/composer.json +++ b/composer.json @@ -31,7 +31,8 @@ "webman/redis": "^2.1", "illuminate/events": "^11.46", "webman/redis-queue": "^1.3", - "workerman/crontab": "^1.0" + "workerman/crontab": "^1.0", + "overtrue/wechat": "~5.0" }, "suggest": { "ext-event": "For better performance. " @@ -56,5 +57,10 @@ ] }, "minimum-stability": "dev", - "prefer-stable": true + "prefer-stable": true, + "config": { + "allow-plugins": { + "easywechat-composer/easywechat-composer": true + } + } } diff --git a/composer.lock b/composer.lock index 55c23ce..304177b 100644 --- a/composer.lock +++ b/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": "2f950d877ad756c4aca10580de6402e6", + "content-hash": "040f32da681f9a2df8b0884d06157b51", "packages": [ { "name": "carbonphp/carbon-doctrine-types", @@ -178,6 +178,403 @@ ], "time": "2024-02-18T20:23:39+00:00" }, + { + "name": "easywechat-composer/easywechat-composer", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/mingyoung/easywechat-composer.git", + "reference": "3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mingyoung/easywechat-composer/zipball/3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd", + "reference": "3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=7.0" + }, + "require-dev": { + "composer/composer": "^1.0 || ^2.0", + "phpunit/phpunit": "^6.5 || ^7.0" + }, + "type": "composer-plugin", + "extra": { + "class": "EasyWeChatComposer\\Plugin" + }, + "autoload": { + "psr-4": { + "EasyWeChatComposer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "张铭阳", + "email": "mingyoungcheung@gmail.com" + } + ], + "description": "The composer plugin for EasyWeChat", + "support": { + "issues": "https://github.com/mingyoung/easywechat-composer/issues", + "source": "https://github.com/mingyoung/easywechat-composer/tree/1.4.1" + }, + "time": "2021-07-05T04:03:22+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.9.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.3", + "guzzlehttp/psr7": "^2.7.0", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.9.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2024-07-24T11:22:20+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "481557b130ef3790cf82b713667b43030dc9c957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", + "reference": "481557b130ef3790cf82b713667b43030dc9c957", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.3.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2025-08-22T14:34:08+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.8.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "21dc724a0583619cd1652f673303492272778051" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", + "reference": "21dc724a0583619cd1652f673303492272778051", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.8.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2025-08-23T21:21:41+00:00" + }, { "name": "illuminate/bus", "version": "v11.45.3", @@ -1048,6 +1445,296 @@ }, "time": "2018-02-13T20:26:39+00:00" }, + { + "name": "overtrue/socialite", + "version": "4.11.0", + "source": { + "type": "git", + "url": "https://github.com/overtrue/socialite.git", + "reference": "4929bbb9241818783c5954151ebbbef36d4953f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/overtrue/socialite/zipball/4929bbb9241818783c5954151ebbbef36d4953f4", + "reference": "4929bbb9241818783c5954151ebbbef36d4953f4", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-json": "*", + "ext-openssl": "*", + "guzzlehttp/guzzle": "^7.0", + "php": ">=8.0.2", + "symfony/psr-http-message-bridge": "^2.1|^6.0" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.0", + "laravel/pint": "^1.2", + "mockery/mockery": "^1.3", + "phpstan/phpstan": "^1.7", + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/Contracts/FactoryInterface.php", + "src/Contracts/UserInterface.php", + "src/Contracts/ProviderInterface.php" + ], + "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.", + "keywords": [ + "Feishu", + "login", + "oauth", + "qcloud", + "qq", + "social", + "wechat", + "weibo" + ], + "support": { + "issues": "https://github.com/overtrue/socialite/issues", + "source": "https://github.com/overtrue/socialite/tree/4.11.0" + }, + "funding": [ + { + "url": "https://github.com/overtrue", + "type": "github" + } + ], + "time": "2024-06-07T06:46:20+00:00" + }, + { + "name": "overtrue/wechat", + "version": "5.36.0", + "source": { + "type": "git", + "url": "https://github.com/w7corp/easywechat.git", + "reference": "3e3af7e1195e8ad25dae196bdb6420a24b382f1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/w7corp/easywechat/zipball/3e3af7e1195e8ad25dae196bdb6420a24b382f1d", + "reference": "3e3af7e1195e8ad25dae196bdb6420a24b382f1d", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "easywechat-composer/easywechat-composer": "^1.1", + "ext-fileinfo": "*", + "ext-libxml": "*", + "ext-openssl": "*", + "ext-simplexml": "*", + "guzzlehttp/guzzle": "^6.2 || ^7.0", + "monolog/monolog": "^1.22 || ^2.0 || ^3.0", + "overtrue/socialite": "^3.2 || ^4.0", + "php": ">=7.4", + "pimple/pimple": "^3.0", + "psr/simple-cache": "^1.0||^2.0||^3.0", + "symfony/cache": "^3.3 || ^4.3 || ^5.0 || ^6.0", + "symfony/event-dispatcher": "^4.3 || ^5.0 || ^6.0", + "symfony/http-foundation": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "brainmaestro/composer-git-hooks": "^2.7", + "dms/phpunit-arraysubset-asserts": "^0.2.0", + "friendsofphp/php-cs-fixer": "^3.5.0", + "mikey179/vfsstream": "^1.6", + "mockery/mockery": "^1.2.3", + "phpstan/phpstan": "^0.12.0", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "hooks": { + "pre-push": [ + "composer test", + "composer fix-style" + ], + "pre-commit": [ + "composer test", + "composer fix-style" + ] + } + }, + "autoload": { + "files": [ + "src/Kernel/Support/Helpers.php", + "src/Kernel/Helpers.php" + ], + "psr-4": { + "EasyWeChat\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "overtrue", + "email": "anzhengchao@gmail.com" + } + ], + "description": "微信SDK", + "keywords": [ + "easywechat", + "sdk", + "wechat", + "weixin", + "weixin-sdk" + ], + "support": { + "issues": "https://github.com/w7corp/easywechat/issues", + "source": "https://github.com/w7corp/easywechat/tree/5.36.0" + }, + "funding": [ + { + "url": "https://github.com/overtrue", + "type": "github" + } + ], + "abandoned": "w7corp/easywechat", + "time": "2024-12-25T08:00:38+00:00" + }, + { + "name": "pimple/pimple", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/silexphp/Pimple.git", + "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a94b3a4db7fb774b3d78dad2315ddc07629e1bed", + "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1 || ^2.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^5.4@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4.x-dev" + } + }, + "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": "https://pimple.symfony.com", + "keywords": [ + "container", + "dependency injection" + ], + "support": { + "source": "https://github.com/silexphp/Pimple/tree/v3.5.0" + }, + "time": "2021-10-28T11:13:42+00:00" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, { "name": "psr/clock", "version": "1.0.0", @@ -1161,6 +1848,240 @@ }, "time": "2021-11-05T16:47:00+00:00" }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "e616d01114759c4c489f93b099585439f795fe35" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", + "reference": "e616d01114759c4c489f93b099585439f795fe35", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + }, + "time": "2023-04-10T20:10:41+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://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" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, { "name": "psr/log", "version": "3.0.1", @@ -1274,6 +2195,240 @@ }, "time": "2021-10-29T13:26:27+00:00" }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "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.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "symfony/cache", + "version": "v6.4.23", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "c88690befb8d4a85dc321fb78d677507f5eb141b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/c88690befb8d4a85dc321fb78d677507f5eb141b", + "reference": "c88690befb8d4a85dc321fb78d677507f5eb141b", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.1", + "psr/cache": "^2.0|^3.0", + "psr/log": "^1.1|^2|^3", + "symfony/cache-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3", + "symfony/var-exporter": "^6.3.6|^7.0" + }, + "conflict": { + "doctrine/dbal": "<2.13.1", + "symfony/dependency-injection": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/var-dumper": "<5.4" + }, + "provide": { + "psr/cache-implementation": "2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0", + "symfony/cache-implementation": "1.1|2.0|3.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "classmap": [ + "Traits/ValueWrapper.php" + ], + "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": "Provides extended PSR-6, PSR-16 (and tags) implementations", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "support": { + "source": "https://github.com/symfony/cache/tree/v6.4.23" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-27T18:31:36+00:00" + }, + { + "name": "symfony/cache-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b", + "reference": "15a4f8e5cd3bce9aeafc882b1acab39ec8de2c1b", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.1", + "psr/cache": "^3.0" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Cache\\": "" + } + }, + "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 caching", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/cache-contracts/tree/v3.5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, { "name": "symfony/clock", "version": "v7.3.0", @@ -1427,6 +2582,257 @@ ], "time": "2024-09-25T14:20:29+00:00" }, + { + "name": "symfony/event-dispatcher", + "version": "v6.4.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e", + "reference": "0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.0|^7.0" + }, + "type": "library", + "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": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.13" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:18:03+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "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 dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v6.4.22", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "6b7c97fe1ddac8df3cc9ba6410c8abc683e148ae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6b7c97fe1ddac8df3cc9ba6410c8abc683e148ae", + "reference": "6b7c97fe1ddac8df3cc9ba6410c8abc683e148ae", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "symfony/cache": "<6.4.12|>=7.0,<7.1.5" + }, + "require-dev": { + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4.12|^7.1.5", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0" + }, + "type": "library", + "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": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v6.4.22" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-05-11T15:36:20+00:00" + }, { "name": "symfony/polyfill-mbstring", "version": "v1.32.0", @@ -1596,6 +3002,184 @@ ], "time": "2024-09-09T11:45:10+00:00" }, + { + "name": "symfony/psr-http-message-bridge", + "version": "v6.4.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/psr-http-message-bridge.git", + "reference": "c9cf83326a1074f83a738fc5320945abf7fb7fec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/c9cf83326a1074f83a738fc5320945abf7fb7fec", + "reference": "c9cf83326a1074f83a738fc5320945abf7fb7fec", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.1", + "psr/http-message": "^1.0|^2.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0" + }, + "conflict": { + "php-http/discovery": "<1.15", + "symfony/http-kernel": "<6.2" + }, + "require-dev": { + "nyholm/psr7": "^1.1", + "php-http/discovery": "^1.15", + "psr/log": "^1.1.4|^2|^3", + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/framework-bundle": "^6.2|^7.0", + "symfony/http-kernel": "^6.2|^7.0" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\PsrHttpMessage\\": "" + }, + "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": "PSR HTTP message bridge", + "homepage": "https://symfony.com", + "keywords": [ + "http", + "http-message", + "psr-17", + "psr-7" + ], + "support": { + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v6.4.13" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:18:03+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "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 writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, { "name": "symfony/translation", "version": "v7.3.1", @@ -1782,6 +3366,88 @@ ], "time": "2024-09-25T14:20:29+00:00" }, + { + "name": "symfony/var-exporter", + "version": "v7.2.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "422b8de94c738830a1e071f59ad14d67417d7007" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/422b8de94c738830a1e071f59ad14d67417d7007", + "reference": "422b8de94c738830a1e071f59ad14d67417d7007", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "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": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "lazy-loading", + "proxy", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v7.2.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-05-02T08:36:00+00:00" + }, { "name": "topthink/think-container", "version": "v3.0.1", diff --git a/config/cons.php b/config/cons.php new file mode 100644 index 0000000..3fdb4f0 --- /dev/null +++ b/config/cons.php @@ -0,0 +1,8 @@ + 'wx1fb600d0f5ea6279', // 银收客czg + 'secret' => 'b4c0534c9b5e6c84a7fe5c2078dff876', +];