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

之前微信登录的需求,通常都是在微信开放平台(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
惊现博主更新文章
repostone回复2019-08-07 16:38
博主不如再更新一下吧。
Tokin回复2019-11-30 22:43
卧槽,这个主题真不错
关关2019-12-01 20:19
还行吧【狗头】
大雄2019-12-01 23:18
靓仔,我最近也更新了,看看怎么样。
杨景文回复2019-12-04 21:55
这个 二维码 的接口,竟然做了处理,不能将网址转换为二维码,没法薅羊毛了。 新主题,比之前的有调调多了,赞
杨景文回复2019-12-04 21:55
这个 二维码 的接口,竟然做了处理,不能将网址转换为二维码,没法薅羊毛了。 新主题,比之前的有调调多了,赞
大缺缺回复2020-04-10 09:38
好想必须是服务号吧
师兄今天想开了吗回复2020-04-14 00:21
有集成插件吗
TonyHe回复2020-04-14 22:36
dalao 我来换友链啦~ 名称:TonyHe 描述:Just A Poor Lifesinger 地址:https://www.ouorz.com 头像:https://static.ouorz.com/t.jpg
关关2020-04-20 23:46
已经添加了哦 大佬
-ViJia回复2020-04-29 17:01
你的博客不错啊有机会交流下啊
-ViJia2020-04-30 11:21
我也来链接一下啊。http://fvijia.cn/,头像http://api.fvijia.cn/public/data/uploads/20200414/23e5d9b3c4432ff03f8a0968c4bee00c.jpg
成人之美回复2020-05-26 21:50
很久没有更新了。
Neal回复2020-07-31 10:49
好气自己代码能力不够,这个功能很好,即满足网站登录的便捷也怎个家公众号的关注与导流,先收藏了 慢慢研究。
武炼巅峰回复2020-12-04 01:00
博客不错啊有机会交流下啊
七上九下回复2020-12-08 01:35
很久没有更新了
夏目贵志回复2021-02-10 13:38
以为我打开B站了。。
这灯光漂白了四壁2021-04-01 00:20
哈哈哈我也是
我的人生模拟器回复2021-04-30 23:21
很久没有更新了
仙宫回复2021-05-02 00:16
博客不错啊有机会交流下啊
唐家三少回复2021-06-06 13:42
我记不住
我的帝国无双回复2021-06-06 13:44
有集成插件吗
豪门狂婿回复2021-06-06 13:47
这个 二维码 的接口,竟然做了处理
斗罗大陆回复2021-06-06 13:48
必须是服务号吧
Duseus回复2022-02-09 19:44
哎,我怎么又打开b站了??