微信公众号开发中,获取用户资料的两种方式

微信公众号的开发主要是在服务号环境下进行,订阅号是拿不到用户的资料的,所以,下文的讨论都基于微信服务号。html

微信公众号的两个access_token

在微信的开发文档中,存在两个access_token,须要对它们加以区别。为了区分这两个token,我把它们从新命名为core_token和user_token。数据库

core_token就是微信公众号本身的access token,是你拥有的微信公众号做为众多公众号中的一个,向微信服务器申请的惟一凭证。这个token只须要你使用公众号的appid和appsceret就能够拿到了,文档在这里。可是注意,这个token的有效期只有7200秒,也就是说,微信会认为你不多用到这个token,并且它的安全级别也比较高,因此有效期比较短,天天可以申请该token的次数也被限制了。固然,微信也作了建议,若是你确实须要常用,那么在你的服务器上面保存它,这样避免反复的调用上面那篇文档里面的接口,消耗掉你的接口请求次数。可是有效期怎么办呢?在你的服务器上面跑一个定时任务,每隔一段时间就去检查一下这个token产生的时间与当前时间的差值,若是小于7200秒,说明还在有效期范围内,还能够继续使用,不然,就去申请一个新的替换掉老的。api

core_token具体都有哪些用呢?好比建立自定义菜单接口、客服消息接口、素材管理等等。这里面还包括用户管理接口,这里先不表,它和咱们下面所提到的用户接口有区别。总之,core_token是做为一个独立的公众号(把它当作一个用户)向微信进行操做,上传、修改、删除属于公众号本身的内容的凭证。浏览器

user_token就是用户本身的access token。公众号和用户是两种不一样的对象,若是在没有core_token的状况下,开发过微博、QQ等开放平台的开发者应该都能理解这个access token的做用。也就是说,你拿到了这个token,那么你就能够操做用户,好比在微博开放平台,能够用这个token在微博帮助用户发微博、关注好友、删除好友等等。而在微信里面,这个access token仅能实现获取用户相关信息,并且其实它不属于公众号的范畴,而是属于网页受权Oauth2.0的范畴。也就是说,这个token不须要用户关注公众号,也能够经过Oauth2.0受权后获取(须要点击一个受权按钮)。它其实跟微信公众号一点关系都扯不上。安全

知道了这个关系,咱们就能够知道,在微信里面要获取用户的昵称等信息,有两种途径,一种是依靠core_token,一种是依靠user_token,到底应该用哪种呢?服务器

使用公众号的access_token获取用户信息

若是你要求你的用户必须关注公众号(服务号)才能使用你提供的功能,那请选择这种方式。并且这种方式能够实现用户无需点击受权按钮,只须要通过几个跳转,就能够安静的进入你的系统。固然,缺点就是access token的每日获取次数有上限,没有安排好的小白开发者会致使这个access token获取次数用光。微信

好了,接下来咱们进入开发阶段。如今你并不知道你的用户是否已经关注了你的公众号,你在你的网页上放置了一个按钮,用于登陆网站,你但愿实现以下逻辑:app

if(用户关注了你的公众号,并且以前用公众号登陆过你的系统) 直接登陆;else if(用户关注了你的公众号,可是并无在你的系统中注册成为用户) 用户登陆,同时自动为他建立用户信息;else if(用户没有关注你的公众号) 要求用户必须关注;网站

1. 获取access token(core token)

首先,你须要获取core token,而且保存在服务器上面,注意,其实不少信息都须要保存在服务器上面,并且不能被任何用户本身拥有。可以公开的信息仅包括:APPID, openid。经过下面这个接口就能够拿到core token:url

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

只须要替换蓝色字为你本身的公众号的私有信息。在结果中就能够看到你须要的token信息了,注意只有7200秒的有效期。

2. 拿到openid

把你的页面中的登陆按钮连接直接设置为:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=URL&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect

固然,你须要把上面蓝色的字改成你本身的信息。注意,URL必须是在网页受权的地方填写的域名下的地址。这在我前面的一篇文章讲过了。这个连接的做用是什么呢?是进入网页受权的环节。等一下,我前面不是说了只有user token才跟受权有关系啊,如今咱们讨论的是core token,怎么又跟受权扯上关系了?骚年,你不要急。在微信全部的接口中,只有这个接口能够实如今你的网页中点击一个连接而得到openid,只有拿到了openid才能拿到用户的信息。另外一种拿到openid的方法,是用户在微信公众号里面,向你发消息,可是这个时候你无法在网页里面用啊。

不过可怜的是,上面这个连接并不能直接拿到openid,而拿到的是一个code,并且是在网页跳转过程当中,经过url参数的形式返回。

拿到这个code以后,再请求下面这个接口,才能拿到openid:

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

把上面这个URL中的蓝色字替换,其中CODE就是上面那个接口拿到的code。这个时候,才能成功拿到openid。

3. 判断用户是否关注公众号

接下来就是利用上面拿到的access token和openid作事情的时候了。首先来判断用户是否关注公众号,经过下面这个接口:

https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

蓝色字就是咱们前两步拿到的信息,经过这个接口的结果中的subscribe字段,就能够判断用户是否已经关注了公众号。若是用没有关注,那么该字段掉值为0,关注过了则为1.

4. 获取用户的信息

咱们不须要再去请求另外的接口,在第3步的结果中,若是subscribe字段的值为1,那么用户的其它信息会同时显示出来。拿到用户信息了怎么办呢?去你的数据库去查询咯,用openid做为该用户对应的微信信息的字段去查,若是数据库里面有这个用户,说明以前登陆过了,若是没有,那注册一个新用户吧。

如今,让这个登陆,而且用用户的昵称做为系统内的昵称吧。

使用Oauth2.0受权的access_token获取用户信息

另一种状况是,你不须要用户关注你的微信公众号,甚至,你根本没有公众号,而只须要用户使用微信登陆你的系统。若是你没有公众号,你必须去微信开放平台注册一个应用。从这个角度讲,一个微信公众号其实就是一个应用。一旦你有了一个应用以后,就能够像在开发微博登陆网站同样,实现一个微信登陆网站的功能。固然,由于微信只有手机端才能受权,所以受权形式上比以往的PC网页受权又稍微复杂一点。不过本文讲述的,都是假设用户在微信浏览器中进行登陆的操做,而不是PC网页端。

1. 拿到openid和access_token

和上一节的方法如出一辙。并且,其实上一节原本就是用了受权方法拿到的code。可是有一点不同,上一节的方法中,你发现整个页面没有任何中止,页面跳转了几下就完成了。如今,你必需要求用户点击一个微信官方的受权按钮,就像微博、QQ登陆网站同样,要求用户去一个官方受权页面进行受权。

因此,在获取openid的第一步的scope参数和上一节不同:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=URL&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect

其它的就真的是如出一辙的。受权完,经过code得到的结果中,同时包含了openid和access_token(user token),还有一个refresh_token,这个咱们不讲,请阅读前面一篇《微信服务号用户受权接口》。

2.获取用户信息

咱们立刻就能够进入获取用户信息的步骤,上一步咱们已经拿到了openid和access token,访问下面这个接口:

https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

这样就拿到了用户的昵称和头像信息。后面的操做也都和上面的同样咯。

总结

这是目前微信提供的两种能够获取微信用户信息的方式,只有这两种,其实咱们的主要考虑的问题在于:到底应该用哪一种方式?其实在前面的阐述中已经提到过了。

若是你要求你的用户必须关注你的微信公众号,那么只能使用第一种方法。这里面有一个地方能够节省时间。在微信中开启开发者模式后,当用户关注、向公众号发消息、取消关注时,微信服务器都会发一条消息到你指定的服务器上面。而在用户关注你的那一刻,你能够得到该用户的openid,同时,你能够本身去拿到core token,因此,在用户关注你的那一刻,你就能够先在系统中注册好这个用户。当他登陆的时候,就无需再去判断是否已经注册过。

Oauth2.0受权这一块,微信和微博、QQ有很大的区别。用户受权后,第三方只能获取用户的信息,而不能对用户进行任何操做(好比在用户的朋友圈儿发消息),所以实际上这个受权没多大用处,因此微信里面也没有任何一个地方可让用户去取消受权。

不过微信公众号的第三方却比较危险。什么是微信公众号第三方平台呢?就是你把core token交给第三方平台,让第三方平台能够操做你的公众号,甚至给关注公众号的用户发推送消息(须要管理员刷二维码)。可是core token只有7200秒的有效期怎么办?因此,你必须把APPID和APPSECRET都托管在第三方平台上,这样第三方平台能够保持一直链接你的微信公众号。固然,第三方平台有些功能比较好,好比可视化的统计等功能。

相关文章
相关标签/搜索