微信服务号 关注服务号自动登录

之前微信登录的需求,通常都是在微信开放平台(open.weixin.qq.com)申请网站应用后实现获取用户OpenId和UnionId,之前登录WPS看到另一种方案,扫码会提示关注公众号,关注后(或已经关注直接进入聊天窗口),会直接登录成功,在实现微信登录的同时也相当于增加一个粉丝。

最近的工作上,刚好也遇到相同的需求,简单记录一下代码,基本思路就是微信的:生成带参数二维码功能。

首先 微信后台设置开发者基本配置,此处不多讲了,基本操作,如果搞不定也没有看下去的必要了。

1 获取Token

access_token有效期7200秒,需要自行添加缓存,保存token,超出有效期需要重新获取

private function getToken(){
        $url = 'https://api.weixin.qq.com/cgi-bin/token';
        $data = [
            'grant_type'    => 'client_credential',
            'appid'         => '1111',
            'secret'        => '2222'
        ];
        $param = array();
        foreach ($data as $k=>$v){
            $param[] = $k.'='.$v;
        }
        $param = implode('&',$data);

        $url = $url.'?'.$param;
        $res = file_get_contents($url);
        $res = json_decode($res,true);
        if($res['access_token'] && $res['expires_in']){
            return $res['access_token'];
        }else{
            return false;
        }
    }

2 申请二维码

public function getQr($token){
        $url = 'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token='.$token;
        $param = array(
            'expire_seconds'    => 86400,
            'action_name'       => 'QR_SCENE',
            'action_info'       => array(
                'scene'         => array(
                    'scene_str'  => 'login_'.time().'_'.rand(100,999)
                )
            )
        );
        $param = json_encode($param);
        $res = $this->request_by_curl($url,$param,'post');
        $res = json_decode($res['content'],true);
        return $res['ticket'];
    }

申请好的ticket是二维码凭据,凭借ticket去直接换取二维码,用户扫码后微信也会把ticket返回给开发者。

3 生成二维码

生成二维码是最简单的,微信提供了一个不限制调用次数的接口,直接返回图片数据流,也就是该链接就是一个图片: https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket='.$ticket

4 获取通知

用户扫码后,微信会将扫码事件推送给后台配置的通知地址,其中$res['FromUserName']就是用户OpenId:

public function callback(){
        $res = file_get_contents("php://input");
        $res = $this->xml2array($res);
        if(
            $res['MsgType'] == 'event'
            || $res['Event'] == 'SCAN'
            || $res['Ticket']
        ){
            //处理你的用户绑定事件
        }
    }

5 前台检测用户是否绑定成功

后端:

public function check(){
        $ticket = $_GET['ticket']
        //检测是否扫码 并返回用户信息
        //$res = db()->where()->find();
        return json($res);
    }

前端:

window.setInterval(getState,1500);
function getState(){
        $.get("http://xxx.com/api?ticket="+ticket,function(data){
            data = JSON.parse(data);
            if(data.open_id.length > 0 ){
               //处理你的登录事件
            }
        });
    }
评论
  • 小俊 2019-07-10 21:33:47 回复
    惊现博主更新文章
    • repostone 2019-08-07 16:38:44 回复
      博主不如再更新一下吧。
      • Tokin 2019-11-30 22:43:25 回复
        卧槽,这个主题真不错
        • 关关 2019-12-01 20:19:30 回复
          还行吧【狗头】
          • 大雄 2019-12-01 23:18:34 回复
            靓仔,我最近也更新了,看看怎么样。
            • Tokin 2019-12-03 12:12:26 回复
              牛批,比之前的舒服太多。你老婆给你设计的嘛,哈哈哈哈
          • 杨景文 2019-12-04 21:55:26 回复
            这个 二维码 的接口,竟然做了处理,不能将网址转换为二维码,没法薅羊毛了。 新主题,比之前的有调调多了,赞
            • 杨景文 2019-12-04 21:55:26 回复
              这个 二维码 的接口,竟然做了处理,不能将网址转换为二维码,没法薅羊毛了。 新主题,比之前的有调调多了,赞
              • 大缺缺 2020-04-10 09:38:19 回复
                好想必须是服务号吧
                • 有集成插件吗
                  • TonyHe 2020-04-14 22:36:38 回复
                    dalao 我来换友链啦~ 名称:TonyHe 描述:Just A Poor Lifesinger 地址:https://www.ouorz.com 头像:https://static.ouorz.com/t.jpg
                  • -ViJia 2020-04-29 17:01:06 回复
                    你的博客不错啊有机会交流下啊
                    • -ViJia 2020-04-30 11:21:30 回复
                      我也来链接一下啊。http://fvijia.cn/,头像http://api.fvijia.cn/public/data/uploads/20200414/23e5d9b3c4432ff03f8a0968c4bee00c.jpg
                  • 成人之美 2020-05-26 21:50:19 回复
                    很久没有更新了。
                    • Neal 2020-07-31 10:49:29 回复
                      好气自己代码能力不够,这个功能很好,即满足网站登录的便捷也怎个家公众号的关注与导流,先收藏了 慢慢研究。
                      • 武炼巅峰 2020-12-04 01:00:21 回复
                        博客不错啊有机会交流下啊
                        • 七上九下 2020-12-08 01:35:44 回复
                          很久没有更新了
                          • 夏目贵志 2021-02-10 13:38:10 回复
                            以为我打开B站了。。
                          • 我的人生模拟器 2021-04-30 23:21:59 回复
                            很久没有更新了
                            • 仙宫 2021-05-02 00:16:48 回复
                              博客不错啊有机会交流下啊
                              • 唐家三少 2021-06-06 13:42:50 回复
                                我记不住
                                • 我的帝国无双 2021-06-06 13:44:04 回复
                                  有集成插件吗
                                  • 豪门狂婿 2021-06-06 13:47:37 回复
                                    这个 二维码 的接口,竟然做了处理
                                    • 斗罗大陆 2021-06-06 13:48:47 回复
                                      必须是服务号吧
                                      • Duseus 2022-02-09 19:44:51 回复
                                        哎,我怎么又打开b站了??
                                        • 发表评论