前面的文章有讲到微信的一系列开发文章,包括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即可返回(昵称,图像、性别【其他参数可自行获取】),代码实现如下:

 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页面。

①在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>

②在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>

③在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类来对查到的用户信息进行封装,返回。

①添加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;
} }

②在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。

①首先我们添加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获取信息控制器,简单代码如下:

 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获取用户信息的实现就结束啦。

Java微信公众平台开发(十)--微信用户信息的获取的更多相关文章

  1. Java微信公众平台开发(十)--微信自定义菜单的创建实现

    转自:http://www.cuiyongzhi.com/post/48.html 自定义菜单这个功能在我们普通的编辑模式下是可以直接在后台编辑的,但是一旦我们进入开发模式之后我们的自定义菜单就需要自 ...

  2. php 微信公众平台开发之微信群发信息

    这篇文章主要为大家详细介绍了php微信公众平台开发之微信群发信息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.目的 完成在微信公众号中群发消息.这里只是完成简单的文字发送.也可以发送语音图片 ...

  3. Java微信公众平台开发(十二)--微信用户信息的获取

    转自:http://www.cuiyongzhi.com/post/56.html 前面的文章有讲到微信的一系列开发文章,包括token获取.菜单创建等,在这一篇将讲述在微信公众平台开发中如何获取微信 ...

  4. 微信公众平台开发(110) 微信连Wi-Fi

    关键字:微信公众平台 微信连Wi-Fi 微信 WiFi 硬件鉴权作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/p/weixin-wifi.html 微信连Wi- ...

  5. Java微信公众平台开发(十六)--微信网页授权(OAuth2.0授权)获取用户基本信息

    转自:http://www.cuiyongzhi.com/post/78.html 好长时间没有写文章了,主要是最近的工作和生活上的事情比较多而且繁琐,其实到现在我依然还是感觉有些迷茫,最后还是决定静 ...

  6. Java微信公众平台开发(十五)--微信JSSDK的使用

    转自:http://www.cuiyongzhi.com/post/63.html 在前面的文章中有介绍到我们在微信web开发过程中常常用到的 [微信JSSDK中Config配置] ,但是我们在真正的 ...

  7. Java微信公众平台开发(十二)--微信JSSDK的使用

    在前面的文章中有介绍到我们在微信web开发过程中常常用到的 [微信JSSDK中Config配置],但是我们在真正的使用中我们不仅仅只是为了配置Config而已,而是要在我们的项目中真正去使用微信JS- ...

  8. Java微信公众平台开发(十三)--微信JSSDK中Config配置

    转自:http://www.cuiyongzhi.com/post/57.html 前端开发工程师和关注前端开发的开发者们在2015年中肯定被腾讯的JSSDk引爆过,搞APP的.搞前端的甚至是是搞后端 ...

  9. Java微信公众平台开发_05_微信网页授权

    GitHub源码:https://github.com/shirayner/weixin_gz 一.本节要点 1.网页授权回调域名 登录微信公众平台后台, 开发 - 接口权限 - 网页服务 - 网页帐 ...

随机推荐

  1. 【转】 Pro Android学习笔记(四八):ActionBar(1):Home图标区

    目录(?)[-] Home Icon 源代码 TextView的滚动 返回主activity或指定activity     ActionBar在Android 3.0 SDK中为平板引入,在4.0中也 ...

  2. 人物-IT-张志东:张志东

    ylbtech-人物-IT-张志东:张志东 张志东,广东东莞人,腾讯创办人之一,腾讯高级副总裁兼科技总裁,于1993年取得深圳大学理学学士学位,并于1996年取得华南理工大学计算机应用及系统架构硕士学 ...

  3. qtp重定义数组大小

    a dim arr1() ) a  dim arr() ReDim arr(a) arr arr ) arr For each i in arr     print arr(i) Next

  4. MyBatis 学习总结(1)

    MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架,几乎消除了所有的 JDBC 代码和参数的手工设置以及结果集的处理,通过XML(sqlMapConfig)或注解配置数据源和 ...

  5. Unity添加自定义快捷键——UGUI快捷键

    在Editor下监听按键有以下几种方式: 自定义菜单栏功能: using UnityEngine; using UnityEditor; public static class MyMenuComma ...

  6. viewstate的基本用法

    转自:http://www.cnblogs.com/ooip/p/4743536.html 在web窗体将控件属性设置为runat=server时,这个控件会被添加一个隐藏属性_ViewState,_ ...

  7. hbase->Mapreduce->hbase

    Hbase对Mapreduce API进行了扩展,方便Mapreduce任务读写HTable数据. package taglib.customer; import java.io.IOExceptio ...

  8. Hadoop Reducer个数设置

    在默认情况下,一个MapReduce Job如果不设置Reducer的个数,那么Reducer的个数为1.具体,可以通过JobConf.setNumReduceTasks(int numOfReduc ...

  9. Leetcode: 67. Add Binary

    二进制加法 https://discuss.leetcode.com/topic/33693/another-simple-java public String addBinary(String a, ...

  10. kafka学习之相关命令

    1 分别启动zoo和kafka ./zkServer.sh start 然后需要使用./zkServer.sh status查看状态,会发现一个奇怪得问题,即使start启动的时候表示启动成功,但是s ...