微信公众号管理欧宁泰php,EasySwoole搭建高效微信管理后台

Swoole协程已经发展到了4.0现在已经支持所有PHP函数。可以在生产环境直接使用。Swoole协程是通过减少IO阻塞来提速的一个项技术,统计协程调度减少IO阻塞,让你的程序飞起。微信公众号管理,小程序管理,这类程序对于IO操作相当频繁。所以使用Swoole协程能极大的提高程序负责,提升程序运行速度。

1、安装EasySwoole

EasySwoole是一个特别不错的项目,Swoole初学者直接的去阅读文档理解起来很困难,但是通过EasySwoole去学习去使用,然后加深对Swoole的认识,是快速理解协程技术的一个很不错的方法。EasySwoole提供了很多教学视频,案例,这些对于初学者很有帮助。

# 安装框架

composer require easyswoole/easyswoole

php vendor/bin/easyswoole install

# 启动框架

php easyswoole start

复制代码

2、安装微信SDK

EasySwoole有专门的微信SDK直接安装即可

# 安装Sdk

composer require easyswoole/wechat

#微信SDK

demo地址:https://github.com/RunsTp/EasySwooleWeChatDemo

复制代码

3、注册微信服务

注册服务对于新手来说理解起来有些别扭。其实对于EasySwoole的方式也很好理解,他是内存中的代码。什么是内存中的代码呢?最火的Laravel程序代码是写在文件存储的,程序每次会执行程序中的代码,EasySwoole是将代码存储在内存中的,运行后代码会一直在内存中贮存。Laravel当修改文件中的代码时你的程序将自动按照新代码进行执行。EasySwoole改变文件中的代码正在执行的程序不会进行改变,需要重新启动才能获得新的代码。对比按照的服务器大家也能直白的发现,Laravel的内存消耗比较小,CPU跳动比较大。EasySwoole则是CPU基本不怎么动,但是运行起来内存消耗会相对大一些。

下面是EasySwooleEvent.php 中的服务注册:

#拿到配置环境的公众号列

#注册服务时不能使用数据库连接

#从数据库获取数据的,

#这时数据库连接服务刚刚注册,并不能使用

$weChatList = Config::getInstance()->getConf('GONG_ZHONG_HAO');

if(count($weChatList)>0){

#对每一个公众号进行服务注册

foreach ($weChatList as $key => $value) {

$temp = WeChatManager::getInstance()->weChat($value['appId']);

#WeChatManager 是一个对象管理器,是为了快速获取公众号号对象的。

//创建服务

$weChat = $temp->officialAccount()->server();

Logger::getInstance()->console('debug', false);

#事件监听

// 注册收到文本消息事件

$weChat->onMessage()

->set(RequestConst::MSG_TYPE_TEXT, function (RequestMsg $requestMsg) {

#TextMessageHandler 监控类

return TextMessageHandler::handle($requestMsg);

});

//与常规消息不同,事件类的则通过 onEvent 方法来进行注册处理机制,这里是一个用户关注事件

$weChat->onEvent()

->onSubscribe(function (RequestMsg $requestMsg){

#EventMessageHandler 监控类

return EventMessageHandler::subscribe($requestMsg);

});

//也可以注册默认 和自定义事件处理

$weChat->onEvent()

->set(RequestConst::DEFAULT_ON_EVENT,function (RequestMsg $requestMsg){

#EventMessageHandler 监控类

return EventMessageHandler::handle($requestMsg);

});

}

}

复制代码

4、新建微信管理控件

微信管理控件其实是指的 WeChatManager类。当然如果你仅仅需要管理一个公众号的话其实不用这个类的。但是既然你是程序员,就不要低估自己的实力。搞定多公众号配置这个对你来说还是很简单的。

下面是类中的主要代码:

class WeChatManager

{

// 单例化 进程内共享

use Singleton;

/** @var array 存储全部WeChat对象 */

private $weChatList = [];

//实例自动注册

private function register(string $appId): WeChat

{

$weChatList = Config::getInstance()->getConf('GONG_ZHONG_HAO');

$configArray = false;

foreach ($weChatList as $key => $value) {

if($appId == $value['appId']){

$configArray = [

'appId' => $value['appId'],

'appSecret' => $value['appSecret'],

'token' => $value['token'],

'AesKey' => $value['AesKey'],

];

}

}

if(!$configArray){

throw new RuntimeException('公众号不存在.');

}

$weChatConfig = new \EasySwoole\WeChat\Config();

$weChatConfig->setTempDir(Config::getInstance()

->getConf('TEMP_DIR'));

$weChatConfig->officialAccount($configArray);

$weChat = new WeChat($weChatConfig);

$this->weChatList[$appId] = $weChat;

return $weChat;

}

//实例获取

public function weChat(string $appId): WeChat

{

if (isset($this->weChatList[$appId])) {

return $this->weChatList[$appId];

}else{

return $this->register($appId);

}

}

}

复制代码

5、创建微信交互接口

服务注册完,管理控件完成,只能说系统可以使用SDK处理微信消息了。但是大家都知道,我们需要两个接口和微信进行通讯。

#创建路由

$routeCollector->get('/token/{appId}', '/WeChat/Index/token');

$routeCollector->post('/token/{appId}', '/WeChat/Index/message');

复制代码

路由中有两个接口GET和POST。一个是消息验证,一个是数据交互。

数据验证:

public function token()

{

// 将微信发来的 params 参数创建为 AccessCheck Bean对象

$accessCheckBean = new AccessCheck($this->request()->getRequestParam());

$weChat = WeChatManager::getInstance()

->weChat($this->request()->getRequestParam('appId'));

$verify = $weChat->officialAccount()

->server()

->accessCheck($accessCheckBean);

// 如果验证为真(来自于微信服务器的请求)

if ($verify) {

// 按照微信约定 响应 Code 200 并在 Body 输出计算出的值

$this->response()->withStatus(Status::CODE_OK);

$this->response()->write($accessCheckBean->getEchostr());

}

// 结束此响应

$this->response()->end();

}

复制代码

数据交互:

// 此 API 主要服务 微信公众平台的 消息事件

public function message()

{

// 将微信发来的 params 参数创建为 AccessCheck Bean对象

$accessCheckBean = new AccessCheck($this->request()->getRequestParam());

$weChat = WeChatManager::getInstance()

->weChat($this->request()->getRequestParam('appId'));

/** @var string 微信发送的Body体 $rawContent */

$rawContent = $this->request()

->getBody();

// 将请求转发给名为 'default' WeChat接管 会返回 XML string 或者 null

try {

$XML = $weChat->officialAccount()

->server()

->parserRequest($rawContent);

} catch (Throwable $throwable) {

// 这里我建议开发者 catch 住异常 无论如何给用户响应友好的提示 防止出现公众号异常的问题

// TODO: 这里实现一个异常记录 和发送服务器异常通知给开发者的代码

Logger::getInstance()

->log('DEBUG-F',Logger::LOG_LEVEL_INFO,'DEBUG');

}

$this->response()->withStatus(Status::CODE_OK);

$this->response()->write($XML ?? 'success');

}

复制代码

6、业务逻辑处理类(监控类)

token函数用于验证微信第三方服务器真实性,主要交互还在message函数中。这时一个完整的微信三方管理循环已经搭建完成。信息从微信服务器,通过请求到message函数中。通过已经注册的服务,会交还给监控类。大家只要去编辑监控类进行数据处理和回调就可以咯。

下面先添加关注事件:EventMessageHandler::subscribe($requestMsg);

public static function subscribe(RequestMsg $requestMsg)

{

$openid = $requestMsg->getFromUserName();

Logger::getInstance()->console('---subscribe---', false);

//关注

$reply = new Text();

$reply->setContent(self::$return);

$user = WechatModel::create()

->where('openid',$openid)

->get();

if(!$user){

WechatModel::create()->data([

'openid'=>$openid,

'keyword'=>uniqid(),

'update_time'=>time(),

'create_time'=>time()

], false)->save();

}

return $reply;

}

复制代码

7、对接测试

将公众号第三方入口改成自己的服务器地址:https://127.23.132.89/token/{appId} 然后关注一下看看自己的数据表吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值