返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >hyperf中使用w7corp/easywechat
  • 351
分享到

hyperf中使用w7corp/easywechat

php微信 2023-08-31 14:08:39 351人浏览 安东尼
摘要

​ EasyWeChat 是一个开源的微信非官方 SDK。安装非常简单,因为它是一个标准的Composer包,这意味着任何满足下列安装条件的 PHP 项目支持Composer都可以使用它。在php-f


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

--结束END--

本文标题: hyperf中使用w7corp/easywechat

本文链接: https://lsjlt.com/news/385956.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • hyperf中使用w7corp/easywechat
    ​ EasyWeChat 是一个开源的微信非官方 SDK。安装非常简单,因为它是一个标准的Composer包,这意味着任何满足下列安装条件的 PHP 项目支持Composer都可以使用它。在php-f...
    99+
    2023-08-31
    php 微信
  • thinkphp 使用 easypay 和 easywechat
    easypay  是3.x easywechat 是6.x 引入:  use Yansongda\Pay\Pay;//easypayuse EasyWeChat\MiniApp\Application as MiniApp;//easywe...
    99+
    2023-09-09
    数据库 redis android
  • Hyperf下Swoole Tracker的使用
    Hyperf下免费版Swoole Tracker使用 公司使用hyperf框架搭建的微服务平台,内存泄露问题十分严重,在排查期间也使用了gc_mem_caches回收内存,但是作用不大,所以后面还...
    99+
    2023-09-04
    swoole php
  • PHP微服务 hyperf+nacos使用
    PHP微服务 hyperf+nacos使用 这里简单说下微服务,及架构方面东西 1:微服务对php +fpm 模式意义不是很大,原因就是php+fpm 天生支持模块拆分,热更新,如果只是性能上的考虑,...
    99+
    2023-09-04
    微服务 php nacos hyperf
  • hyperf 自定义验证器的使用
    引入组件包 composer require hyperf/validation 添加中间键 您需要为使用到验证器组件的 Server 在 config/autoload/middlewares.php 配置文件加上一个全局中间件 Hype...
    99+
    2023-09-04
    php java 数据库
  • hyperf使用curl产生的超时问题
    业务场景 每天晚上系统需要同步第三方接口的数据,我们的系统要做的就是使用多个协程调用api接口获取数据(一批单号需要调用多个不同的接口),然后写入数据库。 出现的问题 在设置了超时时间为5分钟的情况...
    99+
    2023-09-11
    php
  • 一步一步教你在windows电脑是使用phpstorm配置,连接docker desktop,以达到开发swoole框架 hyperf的效果的完整教程!
    前言: 这是一篇php进阶的文档,可能不适合所有phper,但是如果你想学hyperf,又没有Mac,又不想拿电脑装个ubuntu桌面,而你又想学swoole最牛逼的框架hyperf,且你具备docker基础知识,那这篇文章将引导你使用ph...
    99+
    2023-09-05
    phpstorm docker swoole php
  • Android中使用OpenCV
    目标  集成OpenCV 注:Android studio需要安装NDK和 CMake​​​​​​​ CMake这里没有版本号,在配置build.gradle时候也不需要写版本...
    99+
    2022-06-06
    opencv Android
  • ASP.NETCore中使用Swagger
    一、什么是Swagger 随着技术的不断方法,现在的网站开发基本都是使用前后端分离的模式,这样使前端开发者和后端开发者只需要专注自己擅长的即可。但这种方式会存在一种问题:前后端通过A...
    99+
    2024-04-02
  • apache中使用php
    一、模块模式 此模式下,php以apache模块形式运行 AddHandler aplication/x-httpd-php .php 设置后并未起作用;需要先引入php模块。 LoadModel ...
    99+
    2023-09-01
    apache php 开发语言
  • MySQL 中 Delete 使用
    一、关于 MySQL 中 Delete 使用 1.1 Delete 简介 Delete 是 SQL 中用于删除表格中记录的命令。通过使用 Delete 命令,您可以删除表格中的一行或多行记录,并将它们从表格中删除。在执行 Dele...
    99+
    2023-09-04
    数据库 mysql sql
  • Python中使用Redis
    安装Redis的有3种方式https://github.com/andymccurdy/redis-py第一种:进⼊虚拟环境py_django,联⽹安装包redispip install redis第二种:进⼊虚拟环境py_django,联...
    99+
    2023-01-31
    Python Redis
  • python中使用subprocess
    可以执行shell命令的相关模块和函数有: os.system os.spawn os.popen --废弃 popen --废弃 commands --废弃,3.x中被移除 以上执行shell命令的相关的模...
    99+
    2023-01-31
    python subprocess
  • Python中使用GFlags
    在整理我的python代码时,用到getopt,突然想起来我会Gflags,那么还是废弃getopt好了,研究一下gflags在ubuntu+python中的使用,嘻嘻。 一. 一般python代码结构 二. 主程序main函...
    99+
    2023-01-31
    Python GFlags
  • Python中的*使用
    Python中的*使用   在为函数传递参数和函数定义时使用参数的时候,时常会看到有和 *和**,下面分别讲解其作用。 调用函数时使用*和 ** 假设有函数 def test(a, b, c) test(*args):* 的作...
    99+
    2023-01-31
    Python
  • PHP 中使用 JQuery
    我们可以在我们的 PHP 应用程序中使用不同的 JavaScript 库,jQuery 很流行。 尽管现在人们更多地使用 React 或 Vue,但仍有超过 150,262,730 个网站使用 jQue...
    99+
    2024-02-27
  • python中如何使用中文
    小编给大家分享一下python中如何使用中文,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!使用中文(以及其它非ASCII编码)在...
    99+
    2024-04-02
  • mysql中in使不使用索引
    今天小编给大家分享一下mysql中in使不使用索引的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一...
    99+
    2024-04-02
  • Oracle中怎么使用使用滚动游标
    Oracle中怎么使用使用滚动游标,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 #include <stdio.h> ...
    99+
    2024-04-02
  • vue中使用mockjs配置和使用方式
    目录mockjs配置和使用方式需求步骤mock使用及mock无侵入的解决什么是mock?为什么要用到mock?如何使用mock?mock无侵入式配置mockjs配置和使用方式 需求 ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作