前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java微信公众平台开发(十)--微信用户信息的获取 (一)关注被动回复图文消息的实现。(二)pc界面显示用户

Java微信公众平台开发(十)--微信用户信息的获取 (一)关注被动回复图文消息的实现。(二)pc界面显示用户

作者头像
用户2417870
发布2019-09-18 11:32:19
1.1K0
发布2019-09-18 11:32:19
举报
文章被收录于专栏:g歌德a

前面的文章有讲到微信的一系列开发文章,包括token获取、菜单创建等,在这一篇将讲述在微信公众平台开发中如何获取微信用户的信息,在上一篇我们有说道微信用户和微信公众账号之间的联系可以通过Openid关联,所以在这里我们就采用openid去获取用户微信信息。并实现两个个简单场景应用:(一)当微信新用户关注我们的微信公众平台的时候我们自动回复一篇图文消息,然后在图文消息中标题为:【尊敬的:XXX,你好!】,而且在图文消息中的图片就是用户的微信头像,如下图:(二)pc界面显示用户的昵称,性别,头像

(一)关注被动回复图文消息的实现。

有关获取微信用户信息的文档我们可以参照:http://mp.weixin.qq.com/wiki/1/8a5ce6257f1d3b2afb20f83e72b72ce9.html

(一)用户微信消息的获取实现

在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同)。公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。

代码语言:javascript
复制
http请求方式: GET https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

在这里我写了一个方法类GetUseInfo.java,在方法中我们只需要传入openid即可返回(昵称,图像、性别【其他参数可自行获取】),代码实现如下:

代码语言:javascript
复制
 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以及图片,回复给关注者;

简单代码实现如下:

代码语言:javascript
复制
 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跳转界面,之所以不直接使用跳转后界面是为了添加代码的友好性。

代码语言:javascript
复制
 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,所以这里来一个简单的表单提交。

代码语言:javascript
复制
 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。这个界面是用来请求成功以后,展示用户信息的界面。

代码语言:javascript
复制
 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实体类

代码语言:javascript
复制
 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方法,简单代码如下:

代码语言:javascript
复制
 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,里面有详解。

代码语言:javascript
复制
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获取信息控制器,简单代码如下:

代码语言:javascript
复制
 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获取用户信息的实现就结束啦。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • (一)关注被动回复图文消息的实现。
  • (二)pc界面显示用户
相关产品与服务
访问管理
访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档