文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

hyperf中使用w7corp/easywechat

2023-08-31 14:21

关注


EasyWeChat 是一个开源的微信非官方 SDK。安装非常简单,因为它是一个标准的Composer包,这意味着任何满足下列安装条件的 PHP 项目支持Composer都可以使用它。在php-fpm模式下使用是没有任何问题的,但是在swoole框架(例如:hyperf等)的项目中使用就会存在一些问题。

问题:

Swoole框架每个请求都是协程处理的,所以在使用Request对象的使用就会出错。例如Hyperf就有重写的过的Request对象,而EasyWechat4、5版本所用的请求组件为GuzzleHttp包,hyperf官方文档给出了解决方案:
第一步,替换Handler。

use Hyperf\Utils\ApplicationContext;use EasyWeChat\Factory;use GuzzleHttp\Client;use GuzzleHttp\HandlerStack;use Hyperf\Guzzle\CoroutineHandler;$container = ApplicationContext::getContainer();$app = Factory::officialAccount($config);$handler = new CoroutineHandler();// 设置 HttpClient,部分接口直接使用了 http_client。$config = $app['config']->get('http', []);$config['handler'] = $stack = HandlerStack::create($handler);$app->rebind('http_client', new Client($config));// 部分接口在请求数据时,会根据 guzzle_handler 重置 Handler$app['guzzle_handler'] = $handler;// 如果使用的是 OfficialAccount,则还需要设置以下参数$app->oauth->setGuzzleOptions([    'http_errors' => false,    'handler' => $stack,]);

第二步,将 XML 数据放到 EasyWeChat 的 Request 中。

use Symfony\Component\HttpFoundation\HeaderBag;use Symfony\Component\HttpFoundation\Request;$get = $this->request->getQueryParams();$post = $this->request->getParsedBody();$cookie = $this->request->getCookieParams();$uploadFiles = $this->request->getUploadedFiles() ?? [];$server = $this->request->getServerParams();$xml = $this->request->getBody()->getContents();$files = [];foreach ($uploadFiles as $k => $v) {    $files[$k] = $v->toArray();}$request = new Request($get, $post, [], $cookie, $files, $server, $xml);$request->headers = new HeaderBag($this->request->getHeaders());$app->rebind('request', $request);// Do something...

当我们使用easywechat6时,该SDK进行全新的重构,easywechat6用symfony/http-client相关组件,替换了之前4、5版本的GuzzleHttp/Client请求组件,Symfony Http Client在常驻内存的服务中使用时,HttpClient会因为多个协程共用而报错,而pengxuxu/hyperf-easywechat6包使用hyperf的ClassMap替换了InteractWithHttpClient中的HttpClient对象实例,使得不同协程为不同的请求实例,同一协程上下文中获取到的为同一请求实例。而且pengxuxu/hyperf-easywechat6包用hyperf的容器获得Hyperf\HttpServer\Contract\RequestInterface对应的Hyperf\HttpServer\Request,替换了easywechat6中的同样基于PSR-7规范request;获得Psr\SimpleCache\CacheInterface对应的缓存类,替换easywechat6中同样基于PSR-16规范的cache。让用户像在php-fpm模式下一样使用easywechat包进行微信开发。

第一步,安装composer包。

composer require pengxuxu/hyperf-easywechat6 

第二步,注册路由。(注意:一定是 Router::addRoute, 因为微信服务端认证的时候是 GET, 接收用户消息时是 POST !)

Router::addRoute(['GET', 'POST', 'HEAD'], '/wechat', 'App\Controller\WeChatController@serve');

第三步,使用外观,以公众号为例。

declare(strict_types=1);namespace App\Controller;use EasyWeChat\Kernel\Exceptions\BadRequestException;use EasyWeChat\Kernel\Exceptions\InvalidArgumentException;use EasyWeChat\Kernel\Exceptions\InvalidConfigException;use Pengxuxu\HyperfWechat\EasyWechat;use Pengxuxu\HyperfWechat\Helper;use ReflectionException;class WeChatController{        public function serve()    {        $app = EasyWechat::officialAccount();                $server = $app->getServer();                $server->with(function ($message, \Closure $next) {            return '谢谢关注!';                        // 你的自定义逻辑            // return $next($message);        });        // 一定要用Helper::Response去转换        return Helper::Response($server->serve());    }}

来源地址:https://blog.csdn.net/pengxu0807/article/details/127666671

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯