Java微信公众平台开发(十)--微信用户信息的获取
前面的文章有讲到微信的一系列开发文章,包括token获取、菜单创建等,在这一篇将讲述在微信公众平台开发中如何获取微信用户的信息,在上一篇我们有说道微信用户和微信公众账号之间的联系可以通过Openid关联,所以在这里我们就采用openid去获取用户微信信息。并实现两个个简单场景应用:(一)当微信新用户关注我们的微信公众平台的时候我们自动回复一篇图文消息,然后在图文消息中标题为:【尊敬的:XXX,你好!】,而且在图文消息中的图片就是用户的微信头像,如下图:(二)pc界面显示用户的昵称,性别,头像
(一)关注被动回复图文消息的实现。
有关获取微信用户信息的文档我们可以参照:http://mp.weixin.qq.com/wiki/1/8a5ce6257f1d3b2afb20f83e72b72ce9.html 。
(一)用户微信消息的获取实现
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同)。公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。
http请求方式: GET https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
在这里我写了一个方法类GetUseInfo.java,在方法中我们只需要传入openid即可返回(昵称,图像、性别【其他参数可自行获取】),代码实现如下:
1 package com.gede.wechat.common; 2 import java.util.HashMap; 3 import com.gede.web.util.GlobalConstants; 4 import com.gede.wechat.response.UserInfo; 5 import com.gede.wechat.util.HttpUtils; 6 7 import net.sf.json.JSONObject; 8 /** 9 * @author gede 10 * @version date:2019年5月29日 上午11:52:26 11 * @description : 12 */ 13 public class GetUseInfo { 14 /** 15 * @Description: 通过openid获取用户微信信息 16 * @param @param openid 17 * @param @return 18 * @param @throws Exception 19 * @author dapengniao 20 * @date 2016年3月18日 下午2:01:30 21 */ 22 public static HashMap<String, String> Openid_userinfo(String openid) 23 throws Exception { 24 HashMap<String, String> params = new HashMap<String, String>(); 25 UserInfo ui=null; 26 params.put("access_token", 27 GlobalConstants.getInterfaceUrl("access_token")); //定时器中获取到的token 28 params.put("openid", openid); //需要获取的用户的openid 29 params.put("lang", "zh_CN"); 30 String subscribers = HttpUtils.sendGet( 31 GlobalConstants.getInterfaceUrl("OpenidUserinfoUrl"), params); 32 System.out.println(subscribers); 33 params.clear(); 34 //这里返回参数只取了昵称、头像、和性别 35 String nickname=JSONObject.fromObject(subscribers).getString("nickname"); 36 String headimgurl=JSONObject.fromObject(subscribers).getString("headimgurl"); 37 String sex=JSONObject.fromObject(subscribers).getString("sex"); 38 39 ui=new UserInfo(nickname,headimgurl,sex); 40 params.put("nickname", 41 nickname); //昵称 42 params.put("headimgurl", 43 headimgurl); //图像 44 params.put("sex", sex); //性别 45 46 return params; 47 } 48 }
(二)关注回复图文消息实现
在第一部分中有说道【在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID】,在我们的场景中获取关注者openid的事件就是用户的关注事件,同时我们也是在关注事件中给关注者被动回复图文消息,其实现过程:
-
通过关注事件获取到openid,调用获取用户信息接口获取关注者相关接口;
-
在关注事件被动回复中设置图文消息的title以及图片,回复给关注者;
简单代码实现如下:
1 NewsMessage newmsg = new NewsMessage(); 2 newmsg.setToUserName(openid); 3 newmsg.setFromUserName(mpid); 4 newmsg.setCreateTime(new Date().getTime()); 5 newmsg.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_NEWS); 6 if (map.get("Event").equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) { // 关注事件 7 System.out.println("==============这是关注事件!"); 8 try { 9 HashMap<String, String> userinfo = GetUseInfo.Openid_userinfo(openid); 10 Article article = new Article(); 11 article.setDescription("欢迎来到歌德的个人博客:菜鸟程序员成长之路!"); // 图文消息的描述 12 article.setPicUrl(userinfo.get("headimgurl")); // 图文消息图片地址 13 article.setTitle("尊敬的:" + userinfo.get("nickname") + ",你好!"); // 图文消息标题 14 article.setUrl("https://www.cnblogs.com/gede"); // 图文url链接 15 List<Article> list = new ArrayList<Article>(); 16 list.add(article); // 这里发送的是单图文,如果需要发送多图文则在这里list中加入多个Article即可! 17 newmsg.setArticleCount(list.size()); 18 newmsg.setArticles(list); 19 return MessageUtil.newsMessageToXml(newmsg); 20 } catch (Exception e) { 21 // TODO Auto-generated catch block 22 System.out.println("====代码有问题额☺!"); 23 } 24 25 }
最终我们可以来看看我们的成果,这里为了看到效果很直观我先取消关注然后再次关注的,如下图:
(二)pc界面显示用户
(一)添加需要用到的jsp页面。
①在webi-nfo目录下添加home.jsp。简单的home跳转界面,之所以不直接使用跳转后界面是为了添加代码的友好性。
1 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 2 <%@ page session="false" %> 3 <html> 4 <head> 5 </head> 6 <body> 7 <h1>Welcome to Mychat</h1> 8 <a href="<c:url value="/userinfo" />">UserInfo</a> | 9 </body> 10 </html>
②在webi-nfo目录下添加userinfo.jsp。 通过上面被动回复我们不难发现,获取用户信息最重要的是要得到相关公众号对应的openid,所以这里来一个简单的表单提交。
1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 3 <html> 4 <head> 5 <title>输入OppenId</title> 6 </head> 7 <body> 8 <form action="userinfo/register" > 9 <h1>请输入用户openid:<input name="openid" type="text"></h1> 10 <input type="submit"> 11 </form> 12 </body> 13 </html>
③在webi-nfo目录下添加user.jsp。这个界面是用来请求成功以后,展示用户信息的界面。
1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 3 <html> 4 <head> 5 <title>User</title> 6 </head> 7 <body> 8 <div class="userView"> 9 <div class="spittleMessage"><c:out value="${gui.nickname}" /></div> 10 <div> 11 <span class="spittleTime"><c:out value="${gui.sex}" /></span> 12 </div> 13 <img alt="" width="300" height="300" src="${gui.headimgurl}"> 14 </div> 15 </body> 16 </html>
(二)在GetUseInfo中添加Openid_userinfo1方法。这里起名比较随便。之前我们获取用户信息是定义了一个静态static final类,但是当放在mvc中时,就有点突兀。所以我们重新写了一个名为Openid_userinfo1的类方法。其返回类型时一个userinfo类。这里我们使用userinfo类来对查到的用户信息进行封装,返回。
①添加UserInfo实体类
1 package com.gede.wechat.message.response; 2 /** 3 * @author gede 4 * @version date:2019年5月29日 上午11:54:03 5 * @description : 6 */ 7 public class UserInfo { 8 public String nickname; //用户昵称 9 public String headimgurl; //头像 10 public String sex; //性别 11 public UserInfo(String nickname, String headimgurl, String sex) { 12 super(); 13 this.nickname = nickname; 14 this.headimgurl = headimgurl; 15 this.sex = sex; 16 } 17 public String getNickname() { 18 return nickname; 19 } 20 public void setNickname(String nickname) { 21 this.nickname = nickname; 22 } 23 public String getHeadimgurl() { 24 return headimgurl; 25 } 26 public void setHeadimgurl(String headimgurl) { 27 this.headimgurl = headimgurl; 28 } 29 public String getSex() { 30 return sex; 31 } 32 public void setSex(String sex) { 33 this.sex = sex; 34 } 35 36 }
②在GetUseInfo中添加Openid_userinfo1方法,简单代码如下:
1 public UserInfo Openid_userinfo1(String openid) 2 throws Exception { 3 HashMap<String, String> params = new HashMap<String, String>(); 4 UserInfo ui=null; 5 params.put("access_token", 6 GlobalConstants.getInterfaceUrl("access_token")); //定时器中获取到的token 7 params.put("openid", openid); //需要获取的用户的openid 8 params.put("lang", "zh_CN"); 9 String subscribers = HttpUtils.sendGet( 10 GlobalConstants.getInterfaceUrl("OpenidUserinfoUrl"), params); 11 System.out.println(subscribers); 12 params.clear(); 13 //这里返回参数只取了昵称、头像、和性别 14 String nickname=JSONObject.fromObject(subscribers).getString("nickname"); 15 String headimgurl=JSONObject.fromObject(subscribers).getString("headimgurl"); 16 String sex=JSONObject.fromObject(subscribers).getString("sex"); 17 18 ui=new UserInfo(nickname,headimgurl,sex); 19 params.put("nickname", 20 nickname); //昵称 21 params.put("headimgurl", 22 headimgurl); //图像 23 params.put("sex", sex); //性别 24 25 return ui; 26 }
(三)配置我们相关的controller。
①首先我们添加houme解析试图。简单代码如下,有不懂的可以去看我下的Spring,里面有详解。
package com.gede.wechat.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import static org.springframework.web.bind.annotation.RequestMethod.*; @Controller public class HomeController { @RequestMapping(value="/",method=GET) public String home(){ //首页解析为home.jsp return "home"; } }
①再定义我们的GetUserControllerh获取信息控制器,简单代码如下:
1 package com.gede.wechat.controller; 2 import javax.servlet.http.HttpServletRequest; 3 import static org.springframework.web.bind.annotation.RequestMethod.GET; 4 import org.springframework.beans.factory.annotation.Autowired; 5 import org.springframework.stereotype.Controller; 6 import org.springframework.ui.Model; 7 import org.springframework.web.bind.annotation.PathVariable; 8 import org.springframework.web.bind.annotation.RequestMapping; 9 import org.springframework.web.bind.annotation.RequestMethod; 10 11 import com.gede.wechat.common.GetUseInfo; 12 import com.gede.wechat.menu.MenuMain; 13 14 15 /** 16 * @author gede 17 * @version date:2019年5月29日 下午12:04:08 18 * @description : 19 */ 20 @Controller 21 @RequestMapping("/userinfo") 22 public class GetUserController { 23 private GetUseInfo gui; 24 @RequestMapping(method=RequestMethod.GET) 25 public String userinfo(){ 26 //响应超链接,返回userinfo.jsp 27 return "userinfo"; 28 } 29 @RequestMapping(value="/register",method=RequestMethod.GET) 30 public String register(HttpServletRequest request){ 31 //通过request获取input中提交的openid 32 String openid=request.getParameter("openid"); 33 //openid为参数的重定向转发 34 return "redirect:/userinfo/"+openid; 35 } 36 @RequestMapping(value="/{openid}") 37 public String search(@PathVariable("openid") String openid,Model model) throws Exception{ 38 //@PathVariable通过路径解析来获取传过来的openid 39 gui=new GetUseInfo(); 40 model.addAttribute("gui", gui.Openid_userinfo1(openid)); 41 return "user"; 42 } 43 }
这个时候我们的PC界面配置也就完成了。运行项目。在浏览器地址栏中输入:http://zqfbk.iok.la/mychat.就可以访问到了。
到这里通过openid获取用户信息的实现就结束啦。