实现微信扫描二维码,并关注公众号自动登录
看到别人登录不再是微信授权登录,而是关注公众号登录,是不是很心动哈。
这种吸粉的神操作你想不想也拥有?
一、准备工作
实现这种操作需要你拥有微信公众号(认证服务号值得拥有),再在公众号上配置好数据(IP白名单,服务器配置)
二、实现思路
其实,实现这个功能也不复杂,理清思路了就能轻松上手。
第一步:获取二维码
这里需要用到“生成带参数的二维码”接口,使用一个唯一的标识码作为参数,生成二维码,再把二维码的链接返回给前端显示。
如demo(代码片段):
$accessToken = $this->getAccessToken(); $url='https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token='.$accessToken; $data=array( 'expire_seconds'=>3600, 'action_name'=>'QR_STR_SCENE', 'action_info'=>array( 'scene'=>array( 'scene_str'=>唯一标识码, ), ), ); $res=json_decode($this->httpPost($url,json_encode($data)),true); return $res['url'];
第二步:前端轮询或socket
在获取登录二维码后,我们需要检测用户是否扫码并关注公众号了,可以在前端用轮询的方式查询,也可以用socket的方式获取通知,这里就简单的以轮询作为demo了。
demo(代码片段):
//获取生成的唯一标识码 $code=input('post.code'); //获取用户关注后保存的userinfo数据 $userInfo=cache('user_'.$code); if(empty($userInfo)){ return json(['code'=>-1,'msg'=>'未扫码成功']); } //删除数据 cache('user_'.$code, NULL); //根据openid判断是否在数据库中 $data=Db::name('user')->where('wx_openid',$userInfo['openid'])->field('id')->find(); if(empty($data)){ //不在数据库中,表示首次关注 //可以直接自动注册用户数据,可以让用户自己注册,根据你的需求实现就可以 return json(['code'=>10,'msg'=>'扫码成功,未注册账号,跳转注册中...']); }else{ //存在数据库中,执行自动登录操作 /* *这里是你的登录业务逻辑代码 */ return json(['code'=>11,'msg'=>'扫码成功,登录成功']); }
第三步:关注操作,也是重要的一步
在用户关注公众号的时候,微信会向填写的服务器地址中下发event通知,根据实际情况可以分为两种:已关注(subscribe)和未关注(scan),这两种情况都需要去获取“EventKey”(即带参数二维码的scene_str,也就是我们自定义的唯一标识码)。
这里需要注意了,subscribe场景的时候,获取的EventKey是“qrscene_aaabbccdd”这种形式的字符串,而SCAN场景获取的EventKey则是“aaabbccdd”这种形式的字符串。
在我们的获取到微信通知的时候,通过“FromUserName”(也就是openid了)获取用户的基本信息,并和获取到的唯一标识码组合保存起来,保存方式可以是Redis或者其他方式,例如thinphp的cache。
demo(代码片段):
switch(strtolower($val)){ /*扫码-已关注*/ case 'scan': if(isset($this->postStr['EventKey']) && !empty($this->postStr['EventKey'])){ $codeId = $this->postStr['EventKey']; if(!empty($codeId)){ $userInfo=$this->getUserInfo($this->postStr["FromUserName"]); cache('user_'.$codeId,$userInfo); } } break; /*关注*/ case "subscribe": if(isset($this->postStr['EventKey']) && !empty($this->postStr['EventKey'])){ $codeId = substr($this->postStr['EventKey'],8); if(!empty($codeId)){ $userInfo=$this->getUserInfo($this->postStr["FromUserName"]); cache('user_'.$codeId,$userInfo); } } break; default: break; }
到这里,我们一整套就完成了,小伙伴们,你学废了吗?
有 0 位网友评论: