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

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