实现微信扫描二维码,并关注公众号自动登录

阅读1432评论0

看到别人登录不再是微信授权登录,而是关注公众号登录,是不是很心动哈。

这种吸粉的神操作你想不想也拥有?


一、准备工作

实现这种操作需要你拥有微信公众号(认证服务号值得拥有),再在公众号上配置好数据(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 位网友评论:

欢迎来评论

请填写验证码