微信公众号

微信公众号沙箱: https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

初始化配置

  1. $wechat->officialAccount()->getConfig()->setAppId('your appid')->setAppSecret('your aoo secret')->setToken('your token');

服务端

  1. use EasySwoole\WeChat\WeChat;
  2. use EasySwoole\WeChat\Bean\OfficialAccount\AccessCheck;
  3. use EasySwoole\WeChat\Bean\OfficialAccount\Message\Text;
  4. use EasySwoole\WeChat\Bean\OfficialAccount\RequestMsg;
  5. use EasySwoole\WeChat\Bean\OfficialAccount\RequestedReplyMsg;
  6. use EasySwoole\WeChat\Bean\OfficialAccount\RequestConst;
  7. $wechat = new WeChat();
  8. $wechat->officialAccount()->getConfig()
  9. ->setAppId('setAppId')
  10. ->setAppSecret('setAppSecret')
  11. ->setToken('setToken');
  12. /*
  13. * 每个请求到达时将会调用 preCall 方法,这是一个前置操作方法,类似 onRequest 如果你返回false,则表示中断后续流程。
  14. * 如果你返回一个 RequestedReplyMsg 对象,则会响应微信对象中的消息并中断后续流程
  15. * 如果你什么都不返回,则会继续执行后续流程
  16. */
  17. $wechat->officialAccount()->server()->preCall(function (RequestMsg $msg){
  18. // var_dump($msg->__toString());
  19. });
  20. /*
  21. * onMessage 方法是 注册每个消息到达时的事件处理,你可以通过set(消息类型, 处理方法) 来注册
  22. */
  23. $wechat->officialAccount()->server()->onMessage()->set('text',function (RequestMsg $msg){
  24. $reply = new Text();
  25. $reply->setMsgType(RequestConst::MSG_TYPE_TEXT);
  26. $reply->setContent('hello from server');
  27. return $reply;
  28. });
  29. /*
  30. * 更为精确和规范的方式则是使用 RequestConst 类中提供的类常量来进行注册
  31. */
  32. $wechat->officialAccount()->server()->onMessage()->set(RequestConst::DEFAULT_ON_MESSAGE,function (RequestMsg $msg){
  33. $reply = new RequestedReplyMsg();
  34. $reply->setMsgType(RequestConst::MSG_TYPE_TEXT);
  35. $reply->setContent('you say :'.$msg->getContent());
  36. return $reply;
  37. });
  38. /*
  39. * 与常规消息不同,事件类的则通过 onEvent 方法来进行注册处理机制,这里是一个用户关注事件
  40. */
  41. $wechat->officialAccount()->server()->onEvent()->onSubscribe(function (RequestMsg $msg){
  42. var_dump("{$msg->getFromUserName()} has SUBSCRIBE");
  43. $reply = new RequestedReplyMsg();
  44. $reply->setMsgType(RequestConst::MSG_TYPE_TEXT);
  45. $reply->setContent('Welcome to EasySwoole');
  46. return $reply;
  47. });
  48. /*
  49. * 用户取消关注事件
  50. */
  51. $wechat->officialAccount()->server()->onEvent()->onUnSubscribe(function (RequestMsg $msg){
  52. var_dump("{$msg->getFromUserName()} has UBSCRIBE");
  53. });
  54. /*
  55. * 也可以注册默认 和自定义事件处理
  56. */
  57. $wechat->officialAccount()->server()->onEvent()->set(RequestConst::DEFAULT_ON_EVENT,function (){
  58. $reply = new RequestedReplyMsg();
  59. $reply->setMsgType(RequestConst::MSG_TYPE_TEXT);
  60. $reply->setContent('this is event default reply');
  61. return $reply;
  62. });
  63. /*
  64. * 下面是一个简单示例,EasySwoole/Wechat 并不依赖EasySwoole框架本身,即时是原生swoole也可以轻易使用。
  65. * 如果你框架用户,只需要预先注册事件并正确的将微信请求交给Wechat处理即可
  66. */
  67. $http = new swoole_http_server("127.0.0.1", 9501);
  68. $http->on("request", function ($request, $response)use($wechat){
  69. if($request->server['request_method'] == 'GET'){
  70. $bean = new AccessCheck($request->get);
  71. $verify = $wechat->officialAccount()->server()->accessCheck($bean);
  72. if($verify){
  73. $response->write($bean->getEchostr());
  74. }
  75. }else{
  76. $res = $wechat->officialAccount()->server()->parserRequest($request->rawContent());
  77. if(is_string($res)){
  78. $response->write($res);
  79. }
  80. }
  81. $response->end();
  82. });
  83. $http->start();

Access Token

  1. // 刷新token 如果成功会返回token
  2. $wechat->officialAccount()->accessToken()->refresh();
  3. // 获取token
  4. $wechat->officialAccount()->accessToken()->getToken();

获取微信公众号服务器 ip 列表

如果公众号基于安全等考虑,需要获知微信服务器的IP地址列表,以便进行相关限制,可以通过该接口获得微信服务器IP地址列表或者IP网段信息。

  1. $wechat->officialAccount()->ipList()

NetWork Check

为了帮助开发者排查回调连接失败的问题,提供这个网络检测的API。它可以对开发者URL做域名解析,然后对所有IP进行一次ping操作,得到丢包率和耗时。

  1. use EasySwoole\WeChat\Bean\OfficialAccount\NetCheckRequest;
  2. $req = new NetCheckRequest();
  3. $wechat->officialAccount()->netCheck($req);

生成二维码

  1. namespace EasySwoole\WeChat;
  2. use EasySwoole\WeChat\Bean\OfficialAccount\QrCodeRequest;
  3. $qrRequest = new QrCodeRequest;
  4. $qrRequest->setActionName($qrRequest::QR_LIMIT_SCENE);
  5. $qrRequest->setSceneId(1);
  6. $qrCode = $wechat->officialAccount()->qrCode();
  7. $tick = $qrCode->getTick($qrRequest);
  8. $url = $qrCode::tickToImageUrl($tick);

微信菜单

  1. $buttons = [
  2. [
  3. "type" => "click",
  4. "name" => "今日歌曲",
  5. "key" => "V1001_TODAY_MUSIC"
  6. ],
  7. [
  8. "name" => "菜单",
  9. "sub_button" => [
  10. [
  11. "type" => "view",
  12. "name" => "搜索",
  13. "url" => "http://www.soso.com/"
  14. ],
  15. [
  16. "type" => "view",
  17. "name" => "视频",
  18. "url" => "http://v.qq.com/"
  19. ],
  20. [
  21. "type" => "click",
  22. "name" => "赞一下我们",
  23. "key" => "V1001_GOOD"
  24. ],
  25. ],
  26. ],
  27. ];
  28. $matchRule = [
  29. "tag_id" => "2",
  30. "sex" => "1",
  31. "country" => "中国",
  32. "province" => "广东",
  33. "city" => "广州",
  34. "client_platform_type" => "2",
  35. "language" => "zh_CN"
  36. ];
  37. // 创建菜单
  38. $wechat->officialAccount()->menu()->create($buttons);
  39. // 创建个性化菜单
  40. $menuId = $wechat->officialAccount()->menu()->create($buttons, $matchRule);
  41. // 查询现在生效的菜单
  42. $wechat->officialAccount()->menu()->query();
  43. // 测试个性化菜单
  44. $wechat->officialAccount()->menu()->match('openid OR wechat ID');
  45. // 删除全部菜单
  46. $wechat->officialAccount()->menu()->delete();
  47. // 删除指定的个性化菜单
  48. $wechat->officialAccount()->menu()->delete($menuId);

JSAPI

  1. // 获取JsApi对象
  2. $jsApi = $wechat->officialAccount()->jsApi();
  3. // 创建微信授权跳转连接
  4. $jsAuthRequest = new JsAuthRequest;
  5. // 设置授权后回调地址
  6. $jsAuthRequest->setRedirectUri('http://m.evalor.cn');
  7. // 设置 state
  8. $jsAuthRequest->setState('test');
  9. // 设置授权类型
  10. $jsAuthRequest->setType($jsAuthRequest::TYPE_USER_INFO);
  11. // 返回生成地址 需要开发者自行重定向用户
  12. $link = $jsApi->auth()->generateURL($jsAuthRequest);
  13. /* 使用微信回调时提供的 code 获取AccessToken
  14. * 从微信回调时 附带在 url的get参数上 前端或者后端获取都可以
  15. */
  16. $code = ''
  17. $snsAuthBean = $jsApi->auth()->codeToToken($code);
  18. $snsAuthBean->getScope();
  19. $snsAuthBean->getOpenid();
  20. $snsAuthBean->getAccessToken();
  21. $snsAuthBean->getRefreshToken();
  22. // 使用上面提供的 $snsAuthBean对象 获取用户信息
  23. $user = $jsApi->auth()->tokenToUser($snsAuthBean);
  24. $user->getOpenid();
  25. $user->getHeadimgurl();
  26. $user->getNickname();
  27. // 更多信息自行阅读源码
  28. // 直接使用 code 获取用户信息,是上述操作的快捷封装
  29. $user = $jsApi->auth()->codeToUser($code);
  30. // 刷新 AccessToken,refresh token 需要自行存储
  31. $token = $snsAuthBean->getRefreshToken();
  32. $snsAuthBean = $jsApi->auth()->refreshToken($token);
  33. // ckeck token (openid and access token is required)
  34. $snsAuthBean->setOpenid();
  35. $snsAuthBean->setAccessToken();
  36. $check = $jsApi->auth()->authCheck($snsAuthBean);
  37. $url = ''; // current request url given by yourself
  38. // jsApi signature (this is the information wx.config needs)
  39. $jsApiSignaturePack = $jsApi->jsApi()->sdk()->signature($url);
  40. $jsApiSignaturePack->getAppId();
  41. $jsApiSignaturePack->getNonceStr();
  42. $jsApiSignaturePack->getSignature();
  43. $jsApiSignaturePack->getTimestamp();

素材管理(临时)

  1. use Swoole\Coroutine;
  2. use EasySwoole\WeChat\Bean\OfficialAccount\MediaRequest;
  3. use EasySwoole\WeChat\Bean\OfficialAccount\MediaResponse;
  4. // 上传文件路径
  5. $path = 'image.jpg';
  6. // 上传文件类型
  7. $type = MediaRequest::TYPE_IMAGE;
  8. // 你也可以使用new 时候传递关联数组来直接完成创建 new MediaRequest(['path' => $path, 'type' => $type);
  9. $mediaBean = new MediaRequest();
  10. $mediaBean->setPath($path);
  11. $mediaBean->setType($type);
  12. $response = $wechat->officialAccount()->media()->upload($mediaBean);
  13. // 或者也可以直接通过 流来进行上传
  14. $stream = Coroutine::readFile($path);
  15. $mediaBean = new MediaRequest();
  16. $mediaBean->setType($type);
  17. $mediaBean->setData($stream);
  18. $response = $wechat->officialAccount()->media()->upload($mediaBean);
  19. // 使用mediaId 获取素材
  20. $response = $wechat->officialAccount()->media()->get($mediaId);
  21. if($response instanceof MediaResponse) {
  22. // Response对象提供了快捷保存方法 只需要传递存储文件目录地址即可名字会自动通过文件获取
  23. $response->save($directory);
  24. // 如果你想自定义文件名称, 可以使用这个方法
  25. $response->saveAs($directory, $filename)
  26. }
  27. // 如果是 video 素材则需要开发者自行下载
  28. $response = [
  29. 'video_url': $downUrl
  30. ]

素材管理(永久)

  1. // upload
  2. use EasySwoole\WeChat\Bean\OfficialAccount\MediaRequest;
  3. use EasySwoole\WeChat\Bean\OfficialAccount\MediaArticle;
  4. $mediaBean = new MediaRequest();
  5. $mediaBean->setPath('thumb.jpg');
  6. $mediaBean->setType(MediaRequest::TYPE_THUMB);
  7. // 如果你的素材类型是 video 必须设置标题和简介
  8. // $mediaBean->setTitle('title');
  9. // $mediaBean->setIntroduction('introduction');
  10. $mediaUploadResponse = $wechat->officialAccount()->material()->upload($mediaBean)['media_id'];
  11. $thumbMediaId = $mediaUploadResponse['media_id'];
  12. // 上传图文消息
  13. $article = [
  14. 'title' => 'EasySwoole/Wechat!',
  15. 'thumb_media_id' => $thumbMediaId,
  16. 'author' => 'EasySwoole/Wechat',
  17. 'show_cover' => 1,
  18. 'digest' => 'digest',
  19. 'content' => 'content',
  20. 'source_url' => 'https://www.easyswoole.com',
  21. ];
  22. $mediaArticle_0 = new MediaArticle($article);
  23. $mediaArticle_1 = new MediaArticle($article);
  24. // uploadArticle 方法的参数是一个 可变参数,但是每一个参数都必须是MediaArticle类的实例 [可变参数](https://www.php.net/manual/zh/functions.arguments.php#functions.variable-arg-list)
  25. $uploadArticleResponse = $wechat->officialAccount()->material()->uploadArticle($mediaArticle_0, $mediaArticle_1);
  26. // 获取素材
  27. $materialGetResponse = $wechat->officialAccount()->material()->get($uploadArticleResponse['media_id']);
  28. // 上传图文素材的图片
  29. $mediaBean = new MediaRequest();
  30. $mediaBean->setPath('image.jpg');
  31. $mediaBean->setType(MediaRequest::TYPE_IMAGE);
  32. // uploadArticleImage 方法并不会返回 media_id 而是url
  33. $imageUrl = $wechat->officialAccount()->material()->uploadArticleImage($mediaBean)['url'];
  34. // 上传图文素材
  35. $newMediaArticle_0 = new MediaArticle($materialGetResponse['news_item'][0]);
  36. $newMediaArticle_0->setContent("<img src='{$imageUrl}' alt='image alt'>");
  37. $updateArticleResponse = $wechat->officialAccount()->material()->updateArticle($uploadArticleResponse['media_id'], $newMediaArticle_0, 0);
  38. // 删除素材
  39. $materialDeleteResponse = $wechat->officialAccount()->material()->delete($uploadArticleResponse['media_id']);