实现微信扫描二维码,并关注公众号自动登录
看到别人登录不再是微信授权登录,而是关注公众号登录,是不是很心动哈。
这种吸粉的神操作你想不想也拥有?
一、准备工作
实现这种操作需要你拥有微信公众号(认证服务号值得拥有),再在公众号上配置好数据(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 位网友评论: