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

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

微信公众号的两个access_token

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

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

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获取次数用光。

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

if(用户关注了你的公众号,而且之前用公众号登录过你的系统) 直接登录;
else if(用户关注了你的公众号,但是并没有在你的系统中注册成为用户) 用户登录,同时自动为他创建用户信息;
else if(用户没有关注你的公众号) 要求用户必须关注;

1. 获取access token(core token)

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

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都托管在第三方平台上,这样第三方平台可以保持一直连接你的微信公众号。当然,第三方平台有些功能比较好,比如可视化的统计等功能。

2016-04-22