最近接到新需求,为将用户引流到公众号,官网实现微信扫码关注公众号并登陆官网。由于第一次需求没有说清楚,只是说了微信登陆,所以想到微信开放平台实现微信登陆,后来做完后发现是为了向公众号引流,需要关注公众号。
经过查看文档想到了两种实现方式:
1、微信扫码进入微信关注页面,若关注微信向之服务器配置中的接口发送一条信息,说明用户已经关注,这时就可以根据拿到到openid去获取用户信息实现登陆。
2、结果想法是美好的,然而现实是残酷到,登陆公众号后台后发现公众号服务器配置已经被别的系统占用,第一种方法不可用。后来查看文档发现获取用户信息的时候微信会同时告诉系统用户是否关注公众号。由此衍生了第二种方案,首先获取用户信息,根据获取用户是否关注公众号判断,若未关注跳转让用户关注,若已经关注则直接登陆。
开发前配置:
在公众号后台->接口权限->网页授权中填写网页接口。
在公众号设置->功能设置中填写你的域名(注意,此处是域名,而不是http链接,所以不用添加http或者https前缀)。
第一种方法实现
1、获取关注二维码,此二维码用户扫码后若没关注会跳转到公众号详情页,若已经关注则会跳转到公众号聊天页。以下写的小demo:
//获取access_token$file = file_get_contents("https://api./cgi-bin/token?grant_type=client_credential&appid=APPID&secret=AppSecret");$acc_token = json_decode($a)->access_token;$url = "https://api./cgi-bin/qrcode/create?access_token=$acc_token";$result = array('expire_seconds' => 1800,'action_name' => 'QR_SCENE','action_info' => ["scene" => ["scene_id" => 123]]);$result = json_encode($result);$ch = curl_init();//初始化curlcurl_setopt($ch, CURLOPT_URL,$url);//抓取指定网页curl_setopt($ch, CURLOPT_HEADER, 0);//设置headercurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上curl_setopt($ch, CURLOPT_POST, 1);//post提交方式curl_setopt($ch, CURLOPT_POSTFIELDS, $result);$data = curl_exec($ch);//运行curlcurl_close($ch);$data = json_decode($data);$tick = $data->ticket; //拿到tick$tick = urlencode($tick);//换取二维码$img = file_get_contents("https://mp./cgi-bin/showqrcode?ticket=$tick");file_put_contents("./test.jpg",$img);
之后用户关注后会向你之前配置的接口中发送用户关注公众号信息。接下来各位可以根据自己的业务进行开发了。
第二种实现
注:此方法是在无法配置网页授权接口时候使用
首先说明我的思路,自己本地生成一个二维码,二维码中应该包含一个网址,一个自定义的code,一个二维码用户过期的时间(这个时间根据各位业务,也可以不配置)。当用户扫描二维码的时候会打开我们我们之前在二维码配置的网址,而这个网址是在微信中打开,这样我们就可以根据微信网页授权接口去调用微信接口。详情请查看:
微信网页授权
此方法不需要获取网页授权中的用户信息,只需要获取到用户openid即可。用户授权需要到获取用户信息(注意:此接口中的access_token和之前的网页授权的access_token不是同一个,而应该到以下网址获取:获取access_token,关于两个access_token下方会进行讲解。)获取。此时就可以根据返回的用户信息中subscribe字段查看用户是否关注公众号,若关注则保存信息登陆,否则则跳转到关注页。
此时大家都会有一个问题,网页是在微信中打开的,那我怎么第三方网站该怎么确定用户是否登陆呢?其实我们前面扫码的时候传过来一个code,此时我们就可以将获取到到用户信息和code绑定,您可以将这部分信息放入数据或者redis中,然后在我们的网站中根据这code循环获取这部分信息,若查询到了网站则登陆。
以下是具体步骤
1、生成二维码,二维码中包含信息为http://域名/接口?code=CODE&time=TIME。同时将code放入session,方便循环接口到时候使用。当然也可以根据用户ip放入redis,设置过期时间。
2、用户微信扫码,打开上步骤到链接,此时会获取到code和过期时间,code应该保存进session,下方会用到。
3、此时页面是在微信中打开,我们就可以可以根据网页授权接口进行接下来步骤了。
3.1、用户同意授权,获取code
3.2、通过code换取网页授权access_token和用户openid
此时通过以上两步我们已经获取到了用户openid,此时有人问了,文档接下来就是就是获取用户信息了,为什么我们不获取了呢?因为接下来获取到用户信息没有subscribe(用户是否关注)字段,也就是我们无法判断用户是否关注公众号。
3.3、访问获取用户信息接口。此时我们就可以获取到了用户是否关注公众号信息。
3.4、根据获取到的用户信息判断用户是否关注公众号,若关注则将获取到的用户信息和之前的code绑定,然后保存,否则则跳转到获取公众号关注页链接。这个链接有一个问题,就是跳转到的公众号关注页面关注按钮会一闪而逝,我这里并没有解决办法,此时用户需要点击页面上公众号名称才可以关注。
3.5、此时回到咱们的第三方网站,此时用户还没有登陆,这时候我们应该写一个接口,根据之前生成二维码时候的code循环获取用户信息,若信息存在则登陆,此时code相当于用户openid的作用。
关于网页授权中的access_token和获取用户基本信息中的access_token不同之处
网页授权中的access_token是一次性的,只在当前网页授权中使用,并且是可以无限制获取的,每次code都可以获取一次。而获取用户基本信息中的access_token是全局的,有获取次数限制,两小时后过期,微信开发中使用的access_token基本都是指这个。
如果觉得《第三方网站实现微信扫码关注公众号并登陆》对你有帮助,请点赞、收藏,并留下你的观点哦!