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