微信公众平台如何获取用户的OpenID
如何获取用户的OpenID,对于微信开发模式下的开发来说,那就是一个非常简单的小功能了。简单介绍一下我是怎样去获取OpenID的。
微信服务器与公众账号服务器交互的信息可以分为3类:请求消息、事件和响应消息。
(1)请求消息指用户发送给公众账号的信息包含: 文本消息、图片消息、语音消息、视频消息、小视频消息、 地理位置消息、链接消息
(2)事件指用户对公众账号的做出的某种操作时,会使得微信服务器通过事件推送的形式通知到公众账号服务器,从而开发者可以获取到该信息。包含:关注/取消关注事件、扫描带参数二维码事件、 上报地理位置事件、 自定义菜单事件、 点击菜单拉取消息时的事件推送、 点击菜单跳转链接时的事件推送
消息触发时无论请求消息还是事件,公众账号服务器都会获得一个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(取消订阅) |
FromUserName指用户的openID,对于当前公众号来说是唯一的。我们就可以通过用户openID,在公众账号服务器上创建我们自己的用户数据或者获取用户在我们自己数据库中的数据,进行处理。
我们当时做就是通过用户关注时,利用openID在自己的数据库中自动创建一个用户。这里我没有提到获取用户的基本信息如用户昵称、头像等。
下面是一些Java代码片段:
Map<String ,String > requestMap = MessageUtil.parseXml(request);
String fromUserName = requestMap.get("FromUserName");
String toUserName = requestMap.get("ToUserName");
String msgType = requestMap.get("MsgType");
if(msgType.equals(Constant.REQ_MESSAGE_TYPE_EVENT)){//判断消息类型是否是事件消息类型
String eventType = requestMap.get("Event");//获取具体的事件类型
if(eventType.equals(Constant.EVENT_TYPE_SUBSCRIBE)){ //判断事件是否是关注事件
/* 利用openID在自己的数据库中自动创建一个用户 */
}
}
以上就是通过用户关注时,利用openID在自己的数据库中自动创建一个用户,给大家提供一个思路吧,共同进步。
附:
/**
* 解析微信发来的请求
* @param request
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
public static Map<String , String> parseXml(HttpServletRequest request) throws Exception{
Map<String,String> map = new HashMap<String , String >();
InputStream inputStream = request.getInputStream();
SAXReader reader = new SAXReader();
Document document = reader.read(inputStream);
Element root = document.getRootElement();
List<Element> elementList = root.elements();
for (Element element : elementList) {
map.put(element.getName(),element.getText());
}
inputStream.close();
inputStream = null;
return map;
}