微信公眾平臺開發者模式(2)JAVA自動回覆文字訊息及多圖文訊息
資料流向
使用者<———–>微信端 <———–>後臺伺服器
成功接入微信端後
接受微信端傳送的xml訊息,解析為實體物件,處理後再轉成xml格式的資料傳送給微信端
servlet程式碼
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// /** 請求獲取token*/
// String token = new WechatUtil().getToken();
// logger.error("----->獲取token------->"+token);
// 設定utf-8編碼防止中文亂碼
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = null;
// 傳送給微信端的的xml資料
String respXmlMsg = null;
// 返回xml資料物件
ResponseXml responseXml = new ResponseXml();
// xml請求解析
Map<String, String> requestMap;
try {
requestMap = MessageUtil.parseXml(request);// 解析xml物件
String fromUserName = requestMap.get("FromUserName");// 傳送方帳號(open_id)
String toUserName = requestMap.get("ToUserName");// 公眾帳號
String creatTime = requestMap.get("CreateTime");
String msgType = requestMap.get("MsgType");// 訊息型別
String content = requestMap.get("Content");// text內容
String event = requestMap.get("Event");// event內容
String eventKey = requestMap.get("EventKey");
logger.error("!-!-!-!-!:" + eventKey);
// 輸出log日誌
logger.error("----->req msgType:" + msgType);
logger.error("----->req event:" + event);
logger.error("----->req content:" + content);
String sql = "insert into receivetextMsg values('" + toUserName + "','" + fromUserName + "'," + creatTime + ",'" + msgType + "','" + content + "')";
new DBUtil(sql);// 儲存到資料庫中
// 根據使用者輸入回覆不同內容
if (msgType.equals("text")) {
if (content.equals("1")) {
respXmlMsg = responseXml.respTextXml(fromUserName, toUserName, "1是極好");
} else if (content.equals("2")) {
respXmlMsg = responseXml.respTextXml(fromUserName, toUserName, "2nice");
} else {
respXmlMsg = responseXml.respTextXml(fromUserName, toUserName, "既不是1也不是2/::D");
}
} else if (msgType.equals("image")) {
respXmlMsg = responseXml.respNewsXml(fromUserName, toUserName);
}
if (msgType.equals("event")) {
if (event.equals("subscribe")) {
// 訂閱時 返回訊息
respXmlMsg = responseXml.respTextXml(fromUserName, toUserName, "輸入1、2、3...試試看/::D\n或者發個圖片/::D");
} else if (event.equals("CLICK")) {
if (eventKey.equals("V1001_GOOD")) {
logger.error("!-!-!-!-!-!-->click事件");
respXmlMsg = responseXml.respTextXml(fromUserName, toUserName, "謝謝支援/:rose");
}
}
}
// 輸出日誌
logger.error("logpost----respXmlMsg----->:" + respXmlMsg);
out = response.getWriter();
out.print(respXmlMsg);
} catch (Exception e) {
e.printStackTrace();
} finally {
out.close();
out = null;
}
}
解析xml 及string轉xml方法
需導包 dom4j.jar xstream.jar(依賴xmlpull.jar)
/**
* 解析微信發來的請求(XML)
* 返回string轉成的xml
* @author admin
*
*/
public class MessageUtil {
/**
* 解析微信發來的請求(XML)
* @param request
* @return
*/
public static Map<String, String> parseXml(HttpServletRequest request)
throws Exception {
// 將解析結果儲存在HashMap中
Map<String, String> map = new HashMap<String, String>();
// 從request中取得輸入流
InputStream inputStream = request.getInputStream();
// 讀取輸入流
SAXReader reader = new SAXReader();
Document document = reader.read(inputStream);
// 得到xml根元素
Element root = document.getRootElement();
// 得到根元素的所有子節點
@SuppressWarnings("unchecked")
List<Element> elementList = root.elements();
// 遍歷所有子節點
for (Element e : elementList)
map.put(e.getName(), e.getText());
// 釋放資源
inputStream.close();
inputStream = null;
return map;
}
/**
* 文字訊息物件轉換成xml
* @param textMessage 文字訊息物件
* @return xml
*/
public static String textMessageToXml(TextMessage textMessage) {
xstream.alias("xml", textMessage.getClass());
return xstream.toXML(textMessage);
}
/**
* 音樂訊息物件轉換成xml
*
* @param musicMessage 音樂訊息物件
* @return xml
*/
public static String musicMessageToXml(MusicMessage musicMessage) {
xstream.alias("xml", musicMessage.getClass());
return xstream.toXML(musicMessage);
}
/**
* 圖文訊息物件轉換成xml
*
* @param newsMessage 圖文訊息物件
* @return xml
*/
public static String newsMessageToXml(NewsMessage newsMessage) {
xstream.alias("xml", newsMessage.getClass());
xstream.alias("item", new Article().getClass());
return xstream.toXML(newsMessage);
}
/**
* 擴充套件xstream,使其支援CDATA塊
* xstream 還依賴xmlpull_1_0_5.jar許引入
*/
private static XStream xstream = new XStream(new XppDriver() {
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out) {
// 對所有xml節點的轉換都增加CDATA標記
boolean cdata = true;
protected void writeText(QuickWriter writer, String text) {
if (cdata) {
writer.write("<![CDATA[");
writer.write(text);
writer.write("]]>");
} else {
writer.write(text);
}
}
};
}
});
}
響應的實體物件類
public class BaseMessage {
/**
* 接收方帳號(收到的OpenID)
*/
private String ToUserName;
/**
* 開發者微訊號
*/
private String FromUserName;
/**
* 訊息建立時間 (整型)
*/
private long CreateTime;
/**
* 訊息型別
*/
private String MsgType;
/**
* 位0x0001被標誌時,星標剛收到的訊息
*/
private int FuncFlag;
public String getToUserName() {
return ToUserName;
}
public void setToUserName(String toUserName) {
ToUserName = toUserName;
}
public String getFromUserName() {
return FromUserName;
}
public void setFromUserName(String fromUserName) {
FromUserName = fromUserName;
}
public long getCreateTime() {
return CreateTime;
}
public void setCreateTime(long createTime) {
CreateTime = createTime;
}
public String getMsgType() {
return MsgType;
}
public void setMsgType(String msgType) {
MsgType = msgType;
}
public int getFuncFlag() {
return FuncFlag;
}
public void setFuncFlag(int funcFlag) {
FuncFlag = funcFlag;
}
@Override
public String toString() {
return "BaseMessage [ToUserName=" + ToUserName + ", FromUserName="
+ FromUserName + ", CreateTime=" + CreateTime + ", MsgType="
+ MsgType + ", FuncFlag=" + FuncFlag + "]";
}
}
public class TextMessage extends BaseMessage {
/**
* 回覆的訊息內容
*/
private String Content;
public String getContent() {
return Content;
}
public void setContent(String content) {
Content = content;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return super.toString()+"[Content:"+this.Content+"]";
}
}
public class NewsMessage extends BaseMessage {
// 圖文訊息個數,限制為10條以內
private int ArticleCount;
// 多條圖文訊息資訊,預設第一個item為大圖
private List<Article> Articles;
public int getArticleCount() {
return ArticleCount;
}
public void setArticleCount(int articleCount) {
ArticleCount = articleCount;
}
public List<Article> getArticles() {
return Articles;
}
public void setArticles(List<Article> articles) {
Articles = articles;
}
@Override
public String toString() {
return "NewsMessage [ArticleCount=" + ArticleCount + ", Articles="
+ Articles + "]";
}
}
相關推薦
微信公眾平臺開發者模式(2)JAVA自動回覆文字訊息及多圖文訊息
資料流向 使用者<———–>微信端 <———–>後臺伺服器 成功接入微信端後 接受微信端傳送的xml訊息,解析為實體物件,處理後再轉成xml格式的資料傳送給微信端 servlet程式碼 public void doPost
微信公眾平臺開發者模式的啟用並自動回覆
首先,什麼是開發者模式?開發者模式,就是先驗證你的伺服器地址,驗證完成之後,使用者一旦給微信公眾號發訊息,微信的就會把微信使用者的訊息轉發到這個地址上。你的伺服器接到資料後,然後你自己設計一套程式,輸出一個結果,再由微信伺服器返回給使用者。個人學習開發建議使用測試號 登入後,
微信公眾平臺開發教程(三) 基礎框架搭建
開發 images wxs user 設計實現 bytes trre 來源 app 上一章,我們已經初步講解了微信公眾賬號開發的基本原理,今天我們來探索設計實現。 首先我們設計了模塊層次圖,當然圖中只是給出一種實現方式,不局限於此。具體見下圖。 主要功能介紹如下: 1)請求
微信公眾平臺開發教程(一) 微信公眾賬號註冊流程
身份證 logs 政府 提交 註意 bsp 訪問服務器 定義 htm 具體的操作步驟 1、註冊公眾賬號 註冊地址:http://mp.weixin.qq.com/ 1)首先需要郵箱註冊: 2)郵箱激活。郵箱將會收到激活郵件,點擊激活鏈接即可。 3)需要登記個人信息。這裏需
微信公眾平臺開發教程(八)Session處理
class 如果 obj returns name ref car opera 信用 在微信窗口,輸入的信息有限,我們需要將一些信息分多次請求。 比如:在進行用戶綁定時,我們需要輸入用戶的相關信息,比如:用戶名、密碼,或者姓名、電話號碼,服務端驗證通過,即可將系統用戶與微信
微信公眾平臺開發教程(十) 訂閱號與服務號的區別
接口文檔 lpad 手機 全部 oauth2.0 spa 上傳 ima lsp 為了消除大家對訂閱號與服務號的疑問,特總結如下: 功能點 介紹 訂閱號 服務號 註冊 註冊賬號 個人信息 個人信息和企業相關信息 展示 在
微信公眾平臺開發教程(二) 基本原理及消息接口
username 普通用戶 縮放 地理位置 cfb 位置 註意 獲得 基本 一、基本原理 在開始做之前,大家可能對這個很感興趣,但是又比較茫然。是不是很復雜?很難學啊? 其實恰恰相反,很簡單。為了打消大家的顧慮,先簡單介紹了微信公眾平臺的基本原理。 微信服務器就相當於一個轉
微信公眾平臺開發教程(五)自定義菜單
打開鏈接 delete toolbar 推送 優化 pcl reader 接口查詢 robot 應大家強烈要求,將自定義菜單功能課程提前。 一、概述: 如果只有輸入框,可能太簡單,感覺像命令行。自定義菜單,給我們提供了很大的靈活性,更符合用戶的操作習慣。在一個小小的微信對話
結合百度雲平臺和微信公眾平臺進行開發(一)
套話大話我就不說了,網上一大堆,我們就直接進入正題吧,相信對百度雲平臺和微信公眾平臺沒有了解的也不會關注這篇文章。 上面的標題到底是個什麼意思呢?下面讓我們一步一步來完成一個測試小專案。 兩者是怎樣結合的? 利用百度雲平臺執行我們自己的服務端專案,在平臺上線執行。利
微信公眾平臺開發歷程(五)
關於微信accesstoken的有效時間問題 雖然微信官方給的說法是微信accesstoken的有效時間是2小時,重新獲取之後原來的accesstoken的有效時間是5分鐘,但是最近發現,accesstoken真正的有效時間不是2小時,看了論壇上大家的討論發現access
微信公眾平臺開發歷程(一)
前言 我的微信開發是根據部落格專家柳峰老師的文章寫出來的,這裡感謝柳峰老師文章的指導,柳峰老師的微博飛機票請點選這裡。 正文 柳峰老師的部落格有很多東西已經寫的很清楚了,我的文章的作用用來解讀微信開
微信公眾號-開發者模式接入配置(簡單介紹)
首先,按照微信公眾號開發文件提示,進行公眾號申請: 申請完成後,登入該公眾號進行相關配置, 在左側選單欄:開發-基本配置 點選修改配置: 其中,url代表微信要和我們服務端互動的http介面controller,token可以根據
Senparc.Weixin.MP SDK 微信公眾平臺開發教程(二十二):在 .NET Core 2.0/3.0 中使用 MessageHandler 中介軟體
概述 在 《Senparc.Weixin.MP SDK 微信公眾平臺開發教程(六):瞭解MessageHandler》 中我們已經瞭解了 MessageHandler 的執行原理和使用方法,從我設計了這種處理方式到現在已經 6 年多的時間,這是一種非常穩定而且(在如此複雜環境下)相對易於維護的
《微信公眾平臺開發教程(含java程式碼)》下載
2018年11月02日 14:23:40 茹粿鰅莧丨你 閱讀數:7 標籤: 程式設計 資料 區
關於微信公眾號開發者模式獲取access_token的方法
首先用瀏覽器訪問下面的地址:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=secret其中APPID和secret分別是自己設定然
微信公眾號開發筆記(一):配置公眾號開發模式
寫部落格向來是直接乾貨走起,廢話不多說: 1.註冊微信公眾號就不多說了, 2.在進行配置公眾號之前先成為開發者,成為開發者需要進行身份驗證 3.進行微信公眾號的配置 1.微信AppId和AppSecret直接可以在控制平臺拿到
微信公眾平臺開發者文件
微信公眾平臺開發概述 微信公眾平臺是運營者通過公眾號為微信使用者提供資訊和服務的平臺,而公眾平臺開發介面則是提供服務的基礎,開發者在公眾平臺網站中建立公眾號、獲取介面許可權後,可以通過閱讀本介面文件來幫助開發。 為了識別使用者,每個使用者針對每個公眾號會產生
微信公眾平臺網頁開發實戰--2.從手機相簿中選照片然後分享
通過對需求的瞭解,可以將其分解為: (1)微信端手機使用者,可以使用微信的JSSDK。 (2)選取圖片,使用JSSDK的“chooseImage”,由於分享圖片時本地地址無法分享,因此還需要JSSDK的“uploadImage”。 (3)分享到朋友圈,需要JSSDK的“o
微信公眾平臺開發者中心配置--token驗證失敗
問題:開發者中心配置時,一直提示 token驗證失敗: 1、檢查url是否和伺服器部署的一致,token是否和程式碼中的TOKEN一致。 2、在伺服器程式碼中valid()方法中 echo $echoStr; 前面增加 header('content-ty
微信公眾平臺授權登入(java版)
微信公眾平臺授權登入獲取使用者openid。 微信公眾平臺地址:https://mp.weixin.qq.com/ 微信平臺配置: 2、修改配置 2.1 業務域名配置 JS介面安全域名、網頁授權域名 同理操作就可以了,正常操作業務域名就完成了,剩下兩個步驟直