最近,对微信公众号有点兴趣,就自己研究了研究里面的一些内容,发现还挺有意思的,而且通过微信公众号可以调用一些比较有意思的接口,就比如百度开发服务平台 点击进入 里面的很有接口,就比较常见的翻译,语音识别,地理位置等等,都挺好的。好了,不多说,进入正题好了。
我想,做微信公众号开发的,对于想获取关注了公众号的用户信息,或者说是当前与后台服务器进行交互的当前用户信息,这个功能是很重要的吧。因为,通过这个,可以直接获取到当前的用户信息,而不需要,每次都是进行自己输入信息,这个只会让用户感觉到很不适。。。所以,为了解决这个需求,那咱们来研究研究,如何获取微信的个人信息~!
大家可以关注我的微信公众号:Java菜鸟进阶之路。便于日常阅读哦!
目录
(一)思路
我们来研究一下,要想获取到个人信息,是如何一个流程呢?
路线图:
上面,画了一个简单的一个流程图,我想,看着这个应该觉得不难吧。是的,确实思路很简单,但是,,里面的坑也不少。接下来,我对两种情况都进行讲解。
(二)情况一:通过用户与服务器进行消息交互,来获取用户信息
思路:针对这种情况的话,比较简单,因为,我们在做用户与服务器进行消息交互的时候,我们可以知道,用户发送的内容是以XML的形式进行发送的,然后服务器,首先接受到XML,然后再把XML转为Map对象,再从Map对象中获取对应的内容即可。那么,发送的XML的字段是个怎么样呢?
字段信息:
ToUserName:发送给谁的ID
FromUserName:发消息方的ID(其实也就是用户的OpenId)
CreateTime:消息发送时间,时间戳
MsgType:消息类似,有文本,图片,音频,视频,事件推送等
Content:发送的内容
通过这个,我想大家,再结合上面给的流程图,是不是发现了什么呢?是的,这个OpenId,我们已经获取了呀,那是不是可以直接获取到用户信息了呢?。。。。emmmmmm,这样说吧。差不多是可以的,那具体是怎么做呢?紧接着往下看,仔细看我其中的注释
步骤:
1:解析发送过来的XML信息格式,将其转为Map格式
/**
* XML格式转为map格式
* @param request
* @return
*/
public static Map<String , String> xmlToMap(HttpServletRequest request){
Map<String ,String> map = new HashMap<String , String>();
try {
InputStream inputStream =null;
inputStream = request.getInputStream();
SAXReader reader = new SAXReader();
Document doc = reader.read(inputStream);
Element rootElement = doc.getRootElement();
List<Element> elements = rootElement.elements();
for (Element el:elements) {
map.put(el.getName() , el.getText());
}
inputStream.close();
return map ;
} catch (Exception e) {
e.printStackTrace();
return null ;
}
}
备注:记得导入相应的包哦。。比如dom4j还有xsreader。。
2:获取用户的个人信息
package com.hnu.scw.utils;
import com.hnu.scw.model.AccessToken;
import net.sf.json.JSONObject;
/**
* @author scw
* @create 2018-01-18 16:42
* @desc 用于获取微信用户的信息
**/
public class WeiXinUserInfoUtils {
private static final String GET_USERINFO_URL = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
/**
* 获取微信用户账号的相关信息
* @param opendID 用户的openId,这个通过当用户进行了消息交互的时候,才有
* @return
*/
public static String getUserInfo(String opendID){
AccessToken accessToken = WeiXinUtils.getAccessToken();
//获取access_token
String token = accessToken.getToken();
String url = GET_USERINFO_URL.replace("ACCESS_TOKEN" , token);
url = url.replace("OPENID" ,opendID);
JSONObject jsonObject = WeiXinUtils.doGetStr(url);
return jsonObject.toString();
}
}
备注:传入的参数就是咱们之前说过的,FromUserName的值,这个应该不用多解释吧。因为,对于传入的XML,我们已经存入了Map中,那么直接从Map取出对应的字段信息就可以了,
String fromUserName = map.get("FromUserName");
3:通过上面,我们就得到了具体的用户信息的Json格式了,当然,我上面的方法将Json内容转为了String,我这里只是用于查看是否获取到信息了而已,所以,你们就根据各自的需求进行处理就可以了,该解析的就解析即可。。
总结:
上面的这种方法是不是很简单,这个没什么难的,而且这个根据微信公众号的开发手册也可以分析出来。
缺点:我们发现了,这种方法,只有当用户进行了消息交互,才会有FromUserName(这时候可以等价看成是OpenId),那么我们在实际开发中,肯定遇到了一种情况,就是用户没有进行消息交互,直接点击一个菜单按钮,然后就把用户信息自动显示到了一个页面中,那这样是怎么做,方法是一样吗?不多说,继续看下面~~~~~~~~~