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獲取使用者資訊的實現就結束啦。