EasyWechat

EasyWeChat 是一个开源的微信 SDK (非微信官方 SDK)。

因为组件默认使用 Curl,所以我们需要修改对应的 GuzzleClient 为协程客户端,或者修改常量 SWOOLE_HOOK_FLAGSSWOOLE_HOOK_ALL | SWOOLE_HOOK_CURL

替换 Handler

以下以小程序为例,

  1. <?php
  2. use Hyperf\Utils\ApplicationContext;
  3. use EasyWeChat\Factory;
  4. use EasyWeChat\Kernel\ServiceContainer;
  5. use GuzzleHttp\Client;
  6. use GuzzleHttp\HandlerStack;
  7. use Hyperf\Guzzle\CoroutineHandler;
  8. use Hyperf\Guzzle\HandlerStackFactory;
  9. use Overtrue\Socialite\Providers\AbstractProvider;
  10. use Symfony\Component\HttpFoundation\ParameterBag;
  11. use Symfony\Component\HttpFoundation\RedirectResponse;
  12. $container = ApplicationContext::getContainer();
  13. $app = Factory::miniProgram($config);
  14. // 设置 HttpClient,当前设置没有实际效果,在数据请求时会被 guzzle_handler 覆盖,但不保证 EasyWeChat 后面会修改这里。
  15. $config = $app['config']->get('http', []);
  16. $config['handler'] = $container->get(HandlerStackFactory::class)->create();
  17. $app->rebind('http_client', new Client($config));
  18. // 重写 Handler
  19. $app['guzzle_handler'] = new CoroutineHandler();
  20. // 设置 OAuth 授权的 Guzzle 配置
  21. AbstractProvider::setGuzzleOptions([
  22. 'http_errors' => false,
  23. 'handler' => HandlerStack::create(new CoroutineHandler()),
  24. ]);

修改 SWOOLE_HOOK_FLAGS

修改入口文件 bin/hyperf.php,以下忽略不需要修改的代码。

  1. <?php
  2. ! defined('SWOOLE_HOOK_FLAGS') && define('SWOOLE_HOOK_FLAGS', SWOOLE_HOOK_ALL);