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...
第一步,安装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
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0