安装easywechat

这里使用的是easywechat

  1. composer require overtrue/wechat

微信配置

先去公众号后台基本配置/ 填写服务器配置配置接口,需要是线上能正确收到微信推送消息的地址,关注如果有关注、扫码、收到消息等事件都会推送到该地址

创建二维码

首先创建一个临时二维码,ticket保存下来

  1. use EasyWeChat\Foundation\Application;
  2. // 生成随机数
  3. $unique = md5(password_hash(uniqid(true), PASSWORD_BCRYPT));
  4. // 二维码有效期600秒
  5. $expiry = 600;
  6. $app = new Application($options);
  7. $qrcode = $app->qrcode;
  8. $data = $qrcode->temporary($unique, $expiry);
  9. // 这个值保存下来,待会查询扫码状态可以用到
  10. $ticket = $data->ticket;
  11. // 二维码的地址
  12. $url = $qrcode->url($ticket);

拿到如下格式的链接地址,直接打开就是一张二维码

  1. https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQHA7zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyNmZudTBoOUJldUQxYWhhYXhBY1gAAgQ5iApkAwRYAg11

服务端接口

此接口地址需要对应微信后台配置的服务器地址,下面示例只添加了关注 扫码,更多方法参考微信官方文档

  1. use EasyWeChat\Foundation\Application;
  2. $app = new Application($options);
  3. // 从项目实例中得到服务端应用实例。
  4. $server = $app->server;
  5. $server->setMessageHandler(function ($message) {
  6. switch ($message->MsgType) {
  7. // 收到事件消息
  8. case 'event':
  9. switch (strtolower($message->Event)) {
  10. // 公众号关注
  11. case 'subscribe':
  12. // 可以拿到创建二维码时候的ticket值
  13. $ticket = $message->Ticket;
  14. // 关注用户的openid
  15. $openoid = $message->FromUserName;
  16. break;
  17. //二维码被扫
  18. case 'scan':
  19. break;
  20. // ...
  21. }
  22. break;
  23. }
  24. // ...
  25. });

上面方法可以拿到生成二维码时候的的ticket,和关注公众号用户的openid

前端

服务端需要返回二维码地址ticket过期时间
前端拿到二维码地址后,将二维码展示给页面,二维码过期需要刷新二维码或者提示已过期。
可以使用轮询或者长连接的方式通过ticket刷新用户扫码状态,检测到已扫描刷新登录状态,用户成功和公众号关联。

获取用户信息

通过获取到的openid就能获取到用户信息了

  1. use EasyWeChat\Foundation\Application;
  2. $app = new Application($options);
  3. $userService = $app->user;
  4. $openoid = '***';
  5. $user = $userService->get($openoid);