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

发布于 代码

之前微信登录的需求,通常都是在微信开放平台(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 回复
      博主不如再更新一下吧。
      • 发表评论