鍍金池/ 教程/ Java/  Java 微信公眾平臺(tái)開發(fā)(十二)--微信用戶信息的獲取
Java 微信公眾平臺(tái)開發(fā)(八)--多媒體消息回復(fù)
Java 微信公眾平臺(tái)開發(fā)(四)--回復(fù)消息的分類及實(shí)體的創(chuàng)建
Mybatis 工具 Generator
Java 微信公眾平臺(tái)開發(fā)(十一)--開發(fā)中微信公眾平臺(tái)/開放平臺(tái)/商戶平臺(tái)的關(guān)聯(lián)
微信開發(fā)準(zhǔn)備(二)--springmvc+mybatis 項(xiàng)目結(jié)構(gòu)的搭建
 Java 微信公眾平臺(tái)開發(fā)(十二)--微信用戶信息的獲取
Java 微信公眾平臺(tái)開發(fā)(十五)--微信 JSSDK 的使用
微信開發(fā)準(zhǔn)備(三)--框架以及工具的基本使用
Java 微信公眾平臺(tái)開發(fā)(十三)--微信 JSSDK 中 Config 配置
Java 微信公眾平臺(tái)開發(fā)(一)--接入微信公眾平臺(tái)
Java 微信公眾平臺(tái)開發(fā)(十四)【番外篇】--微信 web 開發(fā)者工具使用
Java 微信公眾平臺(tái)開發(fā)【番外篇】(七)--公眾平臺(tái)測試帳號的申請
微信開發(fā)準(zhǔn)備(一)--Maven 倉庫管理新建 WEB 項(xiàng)目
Java 微信公眾平臺(tái)開發(fā)(三)--接收消息的分類及實(shí)體的創(chuàng)建
Java 微信公眾平臺(tái)開發(fā)(九)--關(guān)鍵字回復(fù)以及客服接口實(shí)現(xiàn)(該公眾號暫時(shí)無法提供服務(wù)解決方案)
微信開發(fā)準(zhǔn)備(四)--nat123 內(nèi)網(wǎng)地址公網(wǎng)映射實(shí)現(xiàn)
Java 微信公眾平臺(tái)開發(fā)(五)--文本及圖文消息回復(fù)的實(shí)現(xiàn)
Java 微信公眾平臺(tái)開發(fā)(十)--微信自定義菜單的創(chuàng)建實(shí)現(xiàn)
Java 微信公眾平臺(tái)開發(fā)(六)--微信開發(fā)中的 token 獲取
Java 微信公眾平臺(tái)開發(fā)(二)--微信服務(wù)器 post 消息體的接收

 Java 微信公眾平臺(tái)開發(fā)(十二)--微信用戶信息的獲取

前面的文章有講到微信的一系列開發(fā)文章,包括 token 獲取、菜單創(chuàng)建等,在這一篇將講述在微信公眾平臺(tái)開發(fā)中如何獲取微信用戶的信息,在上一篇我們有說道微信用戶和微信公眾賬號之間的聯(lián)系可以通過 Openid 關(guān)聯(lián),所以在這里我們就采用 openid 去獲取用戶微信信息,并實(shí)現(xiàn)一個(gè)簡單場景應(yīng)用:當(dāng)微信新用戶關(guān)注我們的微信公眾平臺(tái)的時(shí)候我們自動(dòng)回復(fù)一篇圖文消息,然后在圖文消息中標(biāo)題為:【尊敬的:XXX,你好!】,而且在圖文消息中的圖片就是用戶的微信頭像,如下圖:

http://wiki.jikexueyuan.com/project/java-wechat/images/41.png" alt="" />

有關(guān)獲取微信用戶信息的文檔我們可以參照:http://mp.weixin.qq.com/wiki/1/8a5ce6257f1d3b2afb20f83e72b72ce9.html 。

(一)用戶微信消息的獲取實(shí)現(xiàn)

在關(guān)注者與公眾號產(chǎn)生消息交互后,公眾號可獲得關(guān)注者的 OpenID(加密后的微信號,每個(gè)用戶對每個(gè)公眾號的 OpenID 是唯一的。對于不同公眾號,同一用戶的 openid 不同)。公眾號可通過本接口來根據(jù) OpenID 獲取用戶基本信息,包括昵稱、頭像、性別、所在城市、語言和關(guān)注時(shí)間。

http 請求方式: GET https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

在這里我寫了一個(gè)方法類 GetUseInfo.java,在方法中我們只需要傳入 openid 即可返回(昵稱,圖像、性別【其他參數(shù)可自行獲取】),代碼實(shí)現(xiàn)如下:

package com.cuiyongzhi.wechat.common;

import java.util.HashMap;
import com.cuiyongzhi.web.util.GlobalConstants;
import com.cuiyongzhi.wechat.util.HttpUtils;

import net.sf.json.JSONObject;

/**
 * ClassName: GetUseInfo
 * @Description: 獲取微信用戶信息
 * @author dapengniao
 * @date 2016 年 3 月 18 日 下午 2:00:52
 */
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>();
        params.put("access_token",
                GlobalConstants.getInterfaceUrl("access_token"));  //定時(shí)器中獲取到的 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();
        //這里返回參數(shù)只取了昵稱、頭像、和性別
        params.put("nickname",
                JSONObject.fromObject(subscribers).getString("nickname")); //昵稱
        params.put("headimgurl",
                JSONObject.fromObject(subscribers).getString("headimgurl"));  //圖像
        params.put("sex", JSONObject.fromObject(subscribers).getString("sex"));  //性別
        return params;
    }

}

(二)關(guān)注回復(fù)圖文消息實(shí)現(xiàn)

在第一部分中有說道【在關(guān)注者與公眾號產(chǎn)生消息交互后,公眾號可獲得關(guān)注者的 OpenID】,在我們的場景中獲取關(guān)注者 openid 的事件就是用戶的關(guān)注事件,同時(shí)我們也是在關(guān)注事件中給關(guān)注者被動(dòng)回復(fù)圖文消息(圖文消息的回復(fù)實(shí)現(xiàn)可參照:http://www.cuiyongzhi.com/?id=43 ),其實(shí)現(xiàn)過程:

通過關(guān)注事件獲取到 openid,調(diào)用獲取用戶信息接口獲取關(guān)注者相關(guān)接口; 在關(guān)注事件被動(dòng)回復(fù)中設(shè)置圖文消息的 title 以及圖片,回復(fù)給關(guān)注者; 簡單代碼實(shí)現(xiàn)如下:

//對圖文消息
    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)) { // 關(guān)注事件
        System.out.println("==============這是關(guān)注事件!");
        try {
                HashMap<String, String> userinfo=GetUseInfo.Openid_userinfo(openid);
                Article article=new Article();
                article.setDescription("歡迎來到崔用志的個(gè)人博客:菜鳥程序員成長之路!"); //圖文消息的描述
                article.setPicUrl(userinfo.get("headimgurl")); //圖文消息圖片地址
                article.setTitle("尊敬的:"+userinfo.get("nickname")+",你好!");  //圖文消息標(biāo)題
                article.setUrl("http://www.cuiyongzhi.com");  //圖文 url 鏈接
                List<Article> list=new ArrayList<Article>();
                list.add(article);     //這里發(fā)送的是單圖文,如果需要發(fā)送多圖文則在這里 list 中加入多個(gè) Article 即可!
                newmsg.setArticleCount(list.size());
                newmsg.setArticles(list);
                return MessageUtil.newsMessageToXml(newmsg);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            System.out.println("====代碼有問題額?!");
            logger.error(e,e);
        }

    }

最終我們可以來看看我們的成果,這里為了看到效果很直觀我先取消關(guān)注然后再次關(guān)注的,如下圖:

http://wiki.jikexueyuan.com/project/java-wechat/images/42.png" alt="" />

到這里通過 openid 過去關(guān)注者信息的實(shí)現(xiàn)就基本結(jié)束了,以一篇將講述【微信 web 中 JSSDK 的開發(fā)配置】,感謝你的翻閱,如有疑問可以留言討論!