Laravel+easywechat 多公众号管理

您所在的位置:网站首页 envi水体提取方法 Laravel+easywechat 多公众号管理

Laravel+easywechat 多公众号管理

2024-07-12 13:26:29| 来源: 网络整理| 查看: 265

开发工作当中,会有这样的需求:

一个后台需要管理多账号,其中包括多个小程序,多个开放平台和多个公众号;小程序比较好管理,因为小程序的登录方式是根据小程序的配置信息(app_id和secret)用户code获取open_id、session_key,然后使用session_key、iv、encryptedData获取基本信息。因此可以通过不同项目的标识获取不同的配置;公众号获取用户信息的方式有两种,一种是使用配置服务器的方式,但是在ouath域名的配置的时候,无法灵活的配置域名参数,因此放弃;想到使用中间件中获取用户信息的方法://中间件 $router->any('/wechat/login', 'WeChatController@login')->middleware(['wechat.oauth','web']); //获取用户信息 $user = session('wechat.oauth_user.default'); 那可不可以在wechat.oauth_user.default中下功夫呢?

尝试:

在config/wechat.php中增加另外的配置:

'test' => [ 'app_id' => env('WECHAT_OFFICIAL_ACCOUNT_APPID', ''), // AppID 'secret' => env('WECHAT_OFFICIAL_ACCOUNT_SECRET', ''), // AppSecret 'token' => env('WECHAT_OFFICIAL_ACCOUNT_TOKEN', 'your-token'), // Token 'aes_key' => env('WECHAT_OFFICIAL_ACCOUNT_AES_KEY', ''), // EncodingAESKey /* * OAuth 配置 * * scopes:公众平台(snsapi_userinfo / snsapi_base),开放平台:snsapi_login * callback:OAuth授权完成后的回调页地址(如果使用中间件,则随便填写。。。) */ 'oauth' => [ 'scopes' => array_map('trim', explode(',', env('WECHAT_OFFICIAL_ACCOUNT_OAUTH_SCOPES', 'snsapi_userinfo'))), 'callback' => env('WECHAT_OFFICIAL_ACCOUNT_OAUTH_CALLBACK', '/login'), ], ],

通过easywechat在github中使用中间件的说明:

中间件支持指定配置名称:’wechat.oauth:default’,当然,你也可以在中间件参数指定当前的 scopes:中间件支持指定配置名称:’wechat.oauth:default’,当然,你也可以在中间件参数指定当前的 scopes:

Route::group(['middleware' => ['wechat.oauth:snsapi_userinfo']], function () { // ... }); // 或者指定账户的同时指定 scopes: Route::group(['middleware' => ['wechat.oauth:default,snsapi_userinfo']], function () { // ... });

尝试在中间件中使用中间件为:

[‘middleware’ => [‘wechat.oauth:test,snsapi_userinfo’]

如果这步成功,可以根据传入参数不同,判断使用default还是test配置。但是在开发者工具中,唤起授权的依然是default的信息。4.所以,查看了wechat.oauth中间件:

//\Overtrue\LaravelWeChat\Middleware\OAuthAuthenticate::class class OAuthAuthenticate { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @param string|null $scope * @param string|null $type : service(服务号), subscription(订阅号), work(企业微信) * * @return mixed */ public function handle($request, Closure $next, $account = 'default', $scope = null, $type = 'service') { }

可以看到,$account默认就是default,因为无论怎么改都没办法进行配置信息的切换(只讨论公众号)。因此,那可不可以通过路由传参,中间件获取参数,通过获取的参数不同,切换不同的配置参数。路由:

$router->get('/wechat/login/{project?}', 'WeChatController@login') ->middleware(['web','all_wechact_oauth']);

自定义中间件:

public function handle($request, Closure $next, $account = 'default', $scope = null, $type = 'service') { //暂时不做任何判断,可根据自己需求进行操作 $isNewSession = false; $project_id = $request->project; $config = WechatConfig::where('project_id',$project_id)->first(); $official_account = $config->officialAccount; //保证兼容性 $class = ('work' !== $type) ? 'wechat' : 'work'; $prefix = ('work' !== $type) ? 'official_account' : 'work'; switch ($official_account->id){ case 1: $account = 'default'; break; case 2: $account = 'test'; break; } $sessionKey = \sprintf($class.'.oauth_user.%s', $account); $config = config(\sprintf('wechat.'.$prefix.'.%s', $account), []); $officialAccount = app(\sprintf('wechat.'.$prefix.'.%s', $account)); $scope = $scope ?: Arr::get($config, 'oauth.scopes', ['snsapi_base']); if (is_string($scope)) { $scope = array_map('trim', explode(',', $scope)); } $session = session($sessionKey, []); if (!$session) { if ($request->has('code')) { session([$sessionKey => $officialAccount->oauth->user() ?? []]); $isNewSession = true; event(new WeChatUserAuthorized(session($sessionKey), $isNewSession, $account)); return redirect()->to($this->getTargetUrl($request)); } session()->forget($sessionKey); return $officialAccount->oauth->scopes($scope)->redirect($request->fullUrl()); } event(new WeChatUserAuthorized(session($sessionKey), $isNewSession, $account)); return $next($request); }

然后测试,根据传入不同的project,可以自由切换不同的配置。暂时想到这一步,后续有其他想法再进行更新!参考:

Laravel 使用 EasyWechat 管理多公众号EasyWechat在laravel中的使用文档——路由参数

后续更新:因为使用了laravelS,并且忽略了一点——在laravelS的文档中是这样写的:

单例问题传统FPM下,单例模式的对象的生命周期仅在每次请求中,请求开始=>实例化单例=>请求结束后=>单例对象资源回收。Swoole Server下,所有单例对象会常驻于内存,这个时候单例对象的生命周期与FPM不同,请求开始=>实例化单例=>请求结束=>单例对象依旧保留,需要开发者自己维护单例的状态。常见的解决方案:写一个XxxCleaner清理器类来清理单例对象状态,此类需实现接口Hhxsv5\LaravelS\Illuminate\Cleaners\CleanerInterface,然后注册到laravels.php的cleaners中。用一个中间件来重置单例对象的状态。如果是以ServiceProvider注册的单例对象,可添加该ServiceProvider到laravels.php的register_providers中,这样每次请求会重新注册该ServiceProvider,重新实例化单例对象,参考。LaravelS 已经内置了一些清理器。

所以,如果没有使用laravelS的,不需要清理,可以直接使用:

//中间件 $router->any('/wechat/login', 'WeChatController@login')->middleware(['wechat.oauth','web']);

因为easywechat的文档中说了,支持传参数

中间件支持指定配置名称:’wechat.oauth:default’,当然,你也可以在中间件参数指定当前的 scopes:中间件支持指定配置名称:’wechat.oauth:default’,当然,你也可以在中间件参数指定当前的 scopes:

Route::group(['middleware' => ['wechat.oauth:snsapi_userinfo']], function () { // ... }); // 或者指定账户的同时指定 scopes: Route::group(['middleware' => ['wechat.oauth:default,snsapi_userinfo']], function () { // ... });

但是此处有个小问题:例如公众号1为default,公众号2为test,session的key应该为:

session('wechat.oauth_user.default'); session('wechat.oauth_user.test'); 不应该按照文档中说的使用wechat.oauth_user:XXX传值! 本作品采用《CC 协议》,转载必须注明作者和本文链接


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭