微信公众号后台开发总结之二
第二个部分、公众号后台实现获取用户信息
其实获取用户信息和简单,但是在这个过程中有比较多的坑,只要把这些坑跳过了,真是很简单,下面我就简单介绍几种获取用户信息的方式:
(1) 网页授权获取用户的信息分为授权登录和静默授权,授权登录个人觉得该方法可能会影响用户的体验,用户需要确认后才能继续访问相应的内容,过程相对耗时;但基于用户对个人信息安全的考虑来讲还是值得推荐。但网页授权还有一个问题便是在开发的时候需要一个授权回调页面域名,而该域名目前更新了一些新的要求,比如该域名必须要进行过备案等等……让开发的难度和时间都增加了不少。
(2) 在用户跟公众号产生交互(关注、取消关注、发送消息)时获取用户信息,因为在用户跟公众号产生交互后,微信服务器向公众号配置的服务器地址(URL)推送相应额消息,而在消息中会有该用户的OpenID,获取用户的信息的接口是:
"https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
所以我们只要有用户的OpenID和Access_Token就可以通过访问改接口从而和获取用户的信息。下面就详细介绍详细的步骤;
一、查看微信的官方文档可以看到我们可以通过OpenID来获取用户的信息,但在网上居多的是通过网页授权的方式来获得用户的信息,开发过程较复杂耗时较长,并且可能影响用户的体验,所在本次的开发过程中我采用了在用户与公众号产生交互时获取用户的信息,具体讲我是采用了当用户在关注公众号时便获取了用户的信息,当然也可在用户给公众号发送消息时获取用户的信息,这个获取的过程对用户是不可见的。具体的操作如下:
(1)首先获取Access_Token,官方文档给的获取Access_Token访问的接口为:
https请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
其中grant_type =client_credential不用改变,appid和secret需要换成自己公众号相应的值。通过请求该接口我们可以得到Access_Token,但在这里需要注意的是公众号开发信息中IP白名单,在最初由于没有设置好该IP白名单始终不能成功获取到Access_Token,并且报错,获取微信公众号授权失败, 请稍后重试!公众平台返回原始数据为: 错误代码-40164,错误信息-invalid ip, not in whitelist hint。我们来看看官方文档的解释
图1
所以在获取Access_Token前一定要确认自己的IP白名单是否已经设置好了,大家可以通过微信提供的方法进行检测,访问下面的网址,填写公众号相应的信息便可测试。
同时也可以自己直接访问下面的接口,将appid和secret替换成自己公众号的相应的值就可以了。
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
(3)
由于用户在关注公众号时,微信会向后台推送一则XML数据包<xml><ToUserName>< ![CDATA[toUser] ]></ToUserName>
<FromUserName>< ![CDATA[FromUser] ]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType>< ![CDATA[event] ]></MsgType>
<Event>< ![CDATA[subscribe] ]></Event>
</xml>
参数说明:ToUserName
:
开发者微信号
FromUserName
:
发送方帐号(一个OpenID)
CreateTime
:
消息创建时间(整型)
MsgType
:
消息类型,event
Event
:
事件类型,subscribe(订阅)、unsubscribe(取消订阅)
因此该数据包中已经有用户的OpenID了,我们拿来直接用就可以了,通过OpenID和Access_Token来获取用户信息调用的接口如下:
接口调用请求说明
http
请求方式
: GET
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
通过调用改接口我们便可以得到用户信息的JSON数据包:
{
"subscribe": 1,
"openid":"o6_bmjrPTlm6_2sgVt7hMZOPfL2M",
"nickname":"Band",
"sex": 1,
"language":"zh_CN",
"city": "广州",
"province": "广东",
"country": "中国",
"headimgurl":"http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
"subscribe_time":1382694957,
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
"remark": "",
"groupid": 0,
"tagid_list":[128,2],
"subscribe_scene":"ADD_SCENE_QR_CODE",
"qr_scene": 98765,
"qr_scene_str":""
}
数据包中具体的含义我就不多做解释了,大家可以自己查阅资料得知。在获得数据包后大家还要进行解析,然后在后台的程序中,将对应的实体类的信息进行相应的赋值,然后再保存,这中间的具体过程大家熟悉后台开发的人来讲都应该很熟悉就不赘述了。
最后还需要说明的一点是:微信返回用户信息的JSON包中,subscribe_time是一个整形,但是没有提及到该数据是以秒(S)为单位的时间,所以在转换的时候一定要注意,否则时间不会对。