我的编程空间,编程开发者的网络收藏夹
学习永远不晚

hyperf中使用w7corp/easywechat

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

hyperf中使用w7corp/easywechat


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

hyperf中使用w7corp/easywechat

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python中使用Redis

安装Redis的有3种方式https://github.com/andymccurdy/redis-py第一种:进⼊虚拟环境py_django,联⽹安装包redispip install redis第二种:进⼊虚拟环境py_django,联
2023-01-31

Python中的*使用

Python中的*使用  在为函数传递参数和函数定义时使用参数的时候,时常会看到有和 *和**,下面分别讲解其作用。调用函数时使用*和 ** 假设有函数 def test(a, b, c)test(*args):* 的作用其实就是把序列 a
2023-01-31

Python中使用GFlags

在整理我的python代码时,用到getopt,突然想起来我会Gflags,那么还是废弃getopt好了,研究一下gflags在ubuntu+python中的使用,嘻嘻。一. 一般python代码结构二. 主程序main函数上图中,主程序和
2023-01-31

Android中使用OpenCV

目标  集成OpenCV 注:Android studio需要安装NDK和 CMake​​​​​​​ CMake这里没有版本号,在配置build.gradle时候也不需要写版本号一、集成OpenCV  OpenCV集成还是很简单的,不需要我
2022-06-06

python中使用subprocess

可以执行shell命令的相关模块和函数有:os.systemos.spawnos.popen --废弃popen --废弃commands --废弃,3.x中被移除以上执行shell命令的相关的模块和函数的功能均在
2023-01-31

PHP 中使用 JQuery

我们可以在我们的 PHP 应用程序中使用不同的 JavaScript 库,jQuery 很流行。 尽管现在人们更多地使用 React 或 Vue,但仍有超过 150,262,730 个网站使用 jQuery。对于某些 DOM 操作,jQue
PHP 中使用 JQuery
2024-02-27

Dialog中Android应用中的使用方法

Dialog中Android应用中的使用方法?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Android开发中最常用的就是Dialog类,除了自定义dialog
2023-05-31

在Python3中使用ssh

在python3中使用密钥文件方式的ssh。#encoding: utf-8#author: walker#date: 2017-03-29#summary: 在python代码中使用ssh#Python sys.version 3.6.1
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录