程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java微信開辟API第二步 獲得和答復新聞

java微信開辟API第二步 獲得和答復新聞

編輯:關於JAVA

java微信開辟API第二步 獲得和答復新聞。本站提示廣大學習愛好者:(java微信開辟API第二步 獲得和答復新聞)文章只能為提供參考,不一定能成為您想要的結果。以下是java微信開辟API第二步 獲得和答復新聞正文


微信開辟API若何獲得和答復新聞,上面就為年夜家停止引見

1、解釋
* 本示例依據微信開辟文檔:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/2016 5:34:36 PM )停止開辟演示。
* 編纂平台:myeclipse10.7+win32+jdk1.7+tomcat7.0 
* 辦事器:阿裡雲 windows server 2008 64bits
* 平台請求:servlet應用注解方法,平台請求:j2ee6.0+、jdk6.0+、tomcat7.0+
* 演示加倍重視於api解析。
* 為了便於測試解釋,每一個測試用例為自力,不依附於其它辦法。關於封裝,不多加斟酌。
* 演示盡量依照API請求停止,目標:懂得文檔應用方法,到達觸類旁通的後果。
* 常識請求:穩固的java基本、懂得http收集通訊常識、關於javaweb有足夠懂得、json解析
* 在每篇文章停止會給出該部門演示源碼。在剖析完API以後,會以源碼包的情勢給出一切演示源碼。
* 以後時光:4/3/2016 5:32:57 PM ,以該時光為准。

2、文檔原文-新聞治理(摘要)
 •文檔地址:http://mp.weixin.qq.com/wiki/17/f298879f8fb29ab98b2f2971d42552fd.html
 •新聞治理
 ◦吸收新聞-吸收通俗新聞
 ◦吸收新聞-吸收事宜推送
 ◦發送新聞-主動答復新聞
 ◦發送新聞-主動答復時的加解密
 ◦發送新聞-客服新聞
 ◦發送新聞-群發接口
 ◦發送新聞-模板新聞接口
 ◦發送新聞-模板新聞運營標准
 ◦獲得"號主動答復設置裝備擺設

 3、文檔懂得
•吸收新聞
◦文檔如許說明:​當通俗微信譽戶向"賬號發新聞時,微佩服務器將POST新聞的XML數據包到開辟者填寫的URL上。
 ◦懂得:微佩服務器將用戶發送的新聞經由過程Post流的情勢前往給req。當我們想要獲得用戶發送的新聞時,可以經由過程req.getInputStream()獲得。固然,我們可以依據文檔上關於新聞的前往的xml格局,停止需要的解析。
 ◦
完成:

/*
 * 該部門我們獲得用戶發送的信息,而且解析成<K,V>的情勢停止顯示
 */
// 解析用戶發送過去的信息
InputStream is = req.getInputStream();// 拿取要求流
// 將解析成果存儲在HashMap中
Map<String, String> map = new HashMap<String, String>();
// 解析xml,將獲得到的前往成果xml停止解析成我們習氣的文字信息
SAXReader reader = new SAXReader();// 第三方jar:dom4j【百度:saxreader解析xml】
Document document = null;
try {
 document = reader.read(is);
} catch (DocumentException e1) {
 // TODO Auto-generated catch block
 e1.printStackTrace();
}
// 獲得xml根元素
Element root = document.getRootElement();
// 獲得根元素的一切子節點
List<Element> elementList = root.elements();

// 遍歷一切子節點
for (Element e : elementList)
 map.put(e.getName(), e.getText());

// 測試輸入
Set<String> keySet = map.keySet();
// 測試輸入解析後用戶發過去的信息
System.out.println(TAG + ":解析用戶發送過去的信息開端");
for (String key : keySet) {
 System.out.println(key + ":" + map.get(key));
}
System.out.println(TAG + ":解析用戶發送過去的信息停止"); 

•發送新聞
◦文檔如許說明:​當用戶發送新聞給"號時(或某些特定的用戶操作激發的事宜推送時),會發生一個POST要求,開辟者可以在呼應包(Get)中前往特定XML構造,來對該新聞停止呼應(現支撐答復文本、圖片、圖文、語音、視頻、音樂)。嚴厲來講,發送主動呼應新聞其實其實不是一種接口,而是對微佩服務器發過去新聞的一次答復。
 ◦懂得:用戶發送要求,會發生一個POST要求,我們可以經由過程Respone停止答復新聞。然則,答復的內容有嚴厲的格局請求,只要知足格局請求,微佩服務器才會停止處置前往給用戶。經由過程檢查文檔“新聞治理”模塊,我們可以看到微信中有各類各樣的新聞,每類新聞都有本身特定的格局請求,我們必需依照請求才可以正常的給用戶前往特定的信息。我們測驗考試依照文檔的請求格局給用戶答復文本信息、圖文新聞。重點:依照文檔請求結構須要的參數。特殊留意:參數辨別年夜小寫。
 ◦完成1-答復通俗文本新聞:

//實例1:發送通俗文本新聞,請檢查文檔關於“答復文本新聞”的xml格局

// 第一步:依照答復文本信息結構須要的參數
TextMsg textMsg = new TextMsg();
textMsg.setToUserName(map.get("FromUserName"));// 發送和吸收信息“User”恰好相反
textMsg.setFromUserName(map.get("ToUserName"));
textMsg.setCreateTime(new Date().getTime());// 新聞創立時光 (整型)
textMsg.setMsgType("text");// 文本類型新聞
textMsg.setContent("我是辦事器答復給用戶的信息");

// // 第二步,將結構的信息轉化為微信辨認的xml格局【百度:xstream bean轉xml】
XStream xStream = new XStream();
xStream.alias("xml", textMsg.getClass());
String textMsg2Xml = xStream.toXML(textMsg);
System.out.println(textMsg2Xml);

// // 第三步,發送xml的格局信息給微佩服務器,辦事器轉發給用戶
PrintWriter printWriter = resp.getWriter();
printWriter.print(textMsg2Xml);

 ◦完成2-答復圖文新聞:

//實例2,發送圖文新聞。請檢查文檔關於“答復圖文新聞”的xml格局

// 第一步:依照答復圖文信息結構須要的參數
List<Article> articles = new ArrayList<Article>();
Article a = new Article();
a.setTitle("我是圖片題目");
a.setUrl("www.百度.com");// 該地址是點擊圖片跳轉後
a.setPicUrl("http://b.hiphotos.百度.com/image/pic/item/08f790529822720ea5d058ba7ccb0a46f21fab50.jpg");// 該地址是一個有用的圖片地址
a.setDescription("我是圖片的描寫");
articles.add(a);
PicAndTextMsg picAndTextMsg = new PicAndTextMsg();
picAndTextMsg.setToUserName(map.get("FromUserName"));// 發送和吸收信息“User”恰好相反
picAndTextMsg.setFromUserName(map.get("ToUserName"));
picAndTextMsg.setCreateTime(new Date().getTime());// 新聞創立時光 (整型)
picAndTextMsg.setMsgType("news");// 圖文類型新聞
picAndTextMsg.setArticleCount(1);
picAndTextMsg.setArticles(articles);
// 第二步,將結構的信息轉化為微信辨認的xml格局【百度:xstream bean轉xml】
XStream xStream = new XStream();
xStream.alias("xml", picAndTextMsg.getClass());
xStream.alias("item", a.getClass());
String picAndTextMsg2Xml = xStream.toXML(picAndTextMsg);
System.out.println(picAndTextMsg2Xml);
// 第三步,發送xml的格局信息給微佩服務器,辦事器轉發給用戶
PrintWriter printWriter = resp.getWriter();
printWriter.print(picAndTextMsg2Xml);

該部門一切操作源碼,可以直接應用
 •CoreServlet.java(包含辦事器接入、吸收用戶發送新聞、答復通俗文字新聞、答復圖文新聞。須要第三方jar:dom4j、xstream)

package com.gist.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.gist.bean.Article;
import com.gist.bean.PicAndTextMsg;
import com.thoughtworks.xstream.XStream;

/**
 * @author 高遠</n> 郵箱:[email protected]</n> 博客 http://blog.csdn.net/wgyscsf</n>
 *  編寫時代 2016-4-3 下晝4:34:05
 */
@WebServlet("/CoreServlet")
public class CoreServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
 String TAG = "CoreServlet";

 /*
 * 第二步:驗證辦事器地址的有用性 開辟者提交信息後,微佩服務器將發送GET要求到填寫的辦事器地址URL上,
 * GET要求攜帶四個參數:signature、timestamp、nonce、echostr
 * 開辟者經由過程磨練signature對要求停止校驗(上面有校驗方法)。 若確認此次GET要求來自微佩服務器,請原樣前往echostr參數內容,
 * 則接入失效, 成為開辟者勝利,不然接入掉敗。
 * 
 * 加密/校驗流程以下: 1. 將token、timestamp、nonce三個參數停止字典序排序 2.
 * 將三個參數字符串拼接成一個字符串停止sha1加密 3. 開辟者取得加密後的字符串可與signature比較,標識該要求起源於微信
 */
 /*
 * 字典排序(lexicographical
 * order)是一種關於隨機變量構成序列的排序辦法。其辦法是,依照字母次序,或許數字小年夜次序,由小到年夜的構成序列。
 */
 @Override
 protected void doGet(HttpServletRequest req, HttpServletResponse resp)
  throws ServletException, IOException {

 // 設置編碼
 req.setCharacterEncoding("utf-8");
 resp.setContentType("html/text;charset=utf-8");
 resp.setCharacterEncoding("utf-8");
 // 獲得輸入流
 PrintWriter printWriter = resp.getWriter();

 // 設置一個全局的token,開辟者本身設置。api如許說明:Token可由開辟者可以隨意率性填寫,
 // 用作生成簽名(該Token會和接口URL中包括的Token停止比對,從而驗證平安性)
 String token = "wgyscsf";
 // 依據api解釋,獲得上述四個參數
 String signature = req.getParameter("signature");
 String timestamp = req.getParameter("timestamp");
 String nonce = req.getParameter("nonce");
 String echostr = req.getParameter("echostr");
 // // temp:暫時打印,不雅看前往參數情形
 // System.out.println(TAG + ":signature:" + signature + ",timestamp:"
 // + timestamp + ",nonce:" + nonce + ",echostr:" + echostr);
 // 依據api所說的“加密/校驗流程”停止接入。合計三步

 // 第一步:將token、timestamp、nonce三個參數停止字典序排序
 String[] parms = new String[] { token, timestamp, nonce };// 將須要字典序分列的字符串放到數組中
 Arrays.sort(parms);// 依照api請求停止字典序排序
 // 第二步:將三個參數字符串拼接成一個字符串停止sha1加密
 // 拼接字符串
 String parmsString = "";// 留意,此處不克不及=null。
 for (int i = 0; i < parms.length; i++) {
  parmsString += parms[i];
 }
 // sha1加密
 String mParms = null;// 加密後的成果
 MessageDigest digest = null;
 try {
  digest = java.security.MessageDigest.getInstance("SHA");
 } catch (NoSuchAlgorithmException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
 digest.update(parmsString.getBytes());
 byte messageDigest[] = digest.digest();
 // Create Hex String
 StringBuffer hexString = new StringBuffer();
 // 字節數組轉換為 十六進制 數
 for (int i = 0; i < messageDigest.length; i++) {
  String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
  if (shaHex.length() < 2) {
  hexString.append(0);
  }
  hexString.append(shaHex);
 }
 mParms = hexString.toString();// 加密成果

 /*
  * api請求: 若確認此次GET要求來自微佩服務器,請原樣前往echostr參數內容, 則接入失效, 成為開辟者勝利,不然接入掉敗。
  */
 // 第三步: 開辟者取得加密後的字符串可與signature比較,標識該要求起源於微信接入勝利。
 // System.out.println(TAG + ":" + mParms + "---->" + signature);
 if (mParms.equals(signature)) {
  // System.out.println(TAG + ":" + mParms + "---->" + signature);
  printWriter.write(echostr);
 } else {
  // 接入掉敗,不消回寫
  // System.out.println(TAG + "接入掉敗");
 }
 }

 /*
 * 檢查api文檔關於收發新聞推送的新聞格局根本分歧。 如以下格局: <xml>
 * <ToUserName><![CDATA[toUser]]></ToUserName>
 * <FromUserName><![CDATA[fromUser]]></FromUserName>
 * <CreateTime>1348831860</CreateTime> <MsgType><![CDATA[text]]></MsgType>
 * <Content><![CDATA[this is a test]]></Content>
 * <MsgId>1234567890123456</MsgId> </xml> 那末,我們便可以停止同一處置。
 */
 /*
 * 我們先獲得輸出流,看輸出流外面的信息。經由過程測試打印輸入流,我們可以看到每次用戶要求,都邑收到req要求,要求格局是xml格局,該信息在文檔中有解釋。
 */
 /*
 * 特殊留意,req.getInputStream()只能獲得一次,而且只能讀取一次。假如想要屢次讀取,須要別的想方法。為了簡略起見,
 * 我們只獲得一次req.getInputStream(),不再打印輸入流信息。直接打印解析後的信息。
 */
 @Override
 protected void doPost(HttpServletRequest req, HttpServletResponse resp)
  throws ServletException, IOException {
 // 設置編碼
 req.setCharacterEncoding("utf-8");
 resp.setContentType("html/text;charset=utf-8");
 resp.setCharacterEncoding("utf-8");

 /*
  * 該部門我們獲得用戶發送的信息,而且解析成<K,V>的情勢停止顯示
  */
 // 解析用戶發送過去的信息
 InputStream is = req.getInputStream();// 拿取要求流
 // 將解析成果存儲在HashMap中
 Map<String, String> map = new HashMap<String, String>();
 // 解析xml,將獲得到的前往成果xml停止解析成我們習氣的文字信息
 SAXReader reader = new SAXReader();// 第三方jar:dom4j【百度:saxreader解析xml】
 Document document = null;
 try {
  document = reader.read(is);
 } catch (DocumentException e1) {
  // TODO Auto-generated catch block
  e1.printStackTrace();
 }
 // 獲得xml根元素
 Element root = document.getRootElement();
 // 獲得根元素的一切子節點
 List<Element> elementList = root.elements();

 // 遍歷一切子節點
 for (Element e : elementList)
  map.put(e.getName(), e.getText());

 // 測試輸入
 Set<String> keySet = map.keySet();
 // 測試輸入解析後用戶發過去的信息
 System.out.println(TAG + ":解析用戶發送過去的信息開端");
 for (String key : keySet) {
  System.out.println(key + ":" + map.get(key));
 }
 System.out.println(TAG + ":解析用戶發送過去的信息停止");

 /*
  * 該部門我們測驗考試依照文檔的請求格局給用戶答復文本信息、圖文新聞。重點:依照文檔請求結構須要的參數。特殊留意:參數辨別年夜小寫。
  */

 // //實例1:發送通俗文本新聞,請檢查文檔關於“答復文本新聞”的xml格局
 //
 // // 第一步:依照答復文本信息結構須要的參數
 // TextMsg textMsg = new TextMsg();
 // textMsg.setToUserName(map.get("FromUserName"));// 發送和吸收信息“User”恰好相反
 // textMsg.setFromUserName(map.get("ToUserName"));
 // textMsg.setCreateTime(new Date().getTime());// 新聞創立時光 (整型)
 // textMsg.setMsgType("text");// 文本類型新聞
 // textMsg.setContent("我是辦事器答復給用戶的信息");
 //
 // // // 第二步,將結構的信息轉化為微信辨認的xml格局【百度:xstream bean轉xml】
 // XStream xStream = new XStream();
 // xStream.alias("xml", textMsg.getClass());
 // String textMsg2Xml = xStream.toXML(textMsg);
 // System.out.println(textMsg2Xml);
 //
 // // // 第三步,發送xml的格局信息給微佩服務器,辦事器轉發給用戶
 // PrintWriter printWriter = resp.getWriter();
 // printWriter.print(textMsg2Xml);

 // //實例2,發送圖文新聞。請檢查文檔關於“答復圖文新聞”的xml格局

 // 第一步:依照答復圖文信息結構須要的參數
 List<Article> articles = new ArrayList<Article>();
 Article a = new Article();
 a.setTitle("我是圖片題目");
 a.setUrl("www.百度.com");// 該地址是點擊圖片跳轉後
 a.setPicUrl("http://b.hiphotos.百度.com/image/pic/item/08f790529822720ea5d058ba7ccb0a46f21fab50.jpg");// 該地址是一個有用的圖片地址
 a.setDescription("我是圖片的描寫");
 articles.add(a);
 PicAndTextMsg picAndTextMsg = new PicAndTextMsg();
 picAndTextMsg.setToUserName(map.get("FromUserName"));// 發送和吸收信息“User”恰好相反
 picAndTextMsg.setFromUserName(map.get("ToUserName"));
 picAndTextMsg.setCreateTime(new Date().getTime());// 新聞創立時光 (整型)
 picAndTextMsg.setMsgType("news");// 圖文類型新聞
 picAndTextMsg.setArticleCount(1);
 picAndTextMsg.setArticles(articles);
 // 第二步,將結構的信息轉化為微信辨認的xml格局【百度:xstream bean轉xml】
 XStream xStream = new XStream();
 xStream.alias("xml", picAndTextMsg.getClass());
 xStream.alias("item", a.getClass());
 String picAndTextMsg2Xml = xStream.toXML(picAndTextMsg);
 System.out.println(picAndTextMsg2Xml);
 // 第三步,發送xml的格局信息給微佩服務器,辦事器轉發給用戶
 PrintWriter printWriter = resp.getWriter();
 printWriter.print(picAndTextMsg2Xml);
 }
}

 •TestMsg.java(通俗文字新聞bean)

package com.gist.bean;

/**
 * @author 高遠</n> 郵箱:[email protected]</n> 博客 http://blog.csdn.net/wgyscsf</n>
 *  編寫時代 2016-4-4 下晝2:09:27
 */
public class TextMsg {
 private String ToUserName;
 private String FromUserName;
 private long CreateTime;
 private String MsgType;

 @Override
 public String toString() {
 return "TextMsg [ToUserName=" + ToUserName + ", FromUserName="
  + FromUserName + ", CreateTime=" + CreateTime + ", MsgType="
  + MsgType + ", Content=" + Content + "]";
 }

 private String Content;

 public TextMsg(String toUserName, String fromUserName, long createTime,
  String msgType, String content) {
 super();
 ToUserName = toUserName;
 FromUserName = fromUserName;
 CreateTime = createTime;
 MsgType = msgType;
 Content = content;
 }

 public TextMsg() {
 super();
 }

 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 String getContent() {
 return Content;
 }

 public void setContent(String content) {
 Content = content;
 }
}

 •Article.java(圖文新聞外部Article bean)

package com.gist.bean;

/**
 * @author 高遠</n> 郵箱:[email protected]</n> 博客 http://blog.csdn.net/wgyscsf</n>
 *  編寫時代 2016-4-4 下晝2:47:08
 */
public class Article {
 private String Title;

 @Override
 public String toString() {
 return "item [Title=" + Title + ", Description=" + Description
  + ", PicUrl=" + PicUrl + ", Url=" + Url + "]";
 }

 public String getTitle() {
 return Title;
 }

 public void setTitle(String title) {
 Title = title;
 }

 public String getDescription() {
 return Description;
 }

 public void setDescription(String description) {
 Description = description;
 }

 public String getPicUrl() {
 return PicUrl;
 }

 public void setPicUrl(String picUrl) {
 PicUrl = picUrl;
 }

 public String getUrl() {
 return Url;
 }

 public void setUrl(String url) {
 Url = url;
 }

 private String Description;
 private String PicUrl;
 private String Url;

}

 •PicAndTextMsg.java(圖文新聞 bean)

package com.gist.bean;

import java.util.List;

/**
 * @author 高遠</n> 郵箱:[email protected]</n> 博客 http://blog.csdn.net/wgyscsf</n>
 *  編寫時代 2016-4-4 下晝2:47:08
 */
public class PicAndTextMsg {
 private String ToUserName;
 private String FromUserName;
 private long CreateTime;
 private String MsgType;
 private int ArticleCount;
 private List<Article> Articles;

 @Override
 public String toString() {
 return "PicAndTextMsg [ToUserName=" + ToUserName + ", FromUserName="
  + FromUserName + ", CreateTime=" + CreateTime + ", MsgType="
  + MsgType + ", ArticleCount=" + ArticleCount + ", Articles="
  + Articles + "]";
 }

 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 getArticleCount() {
 return ArticleCount;
 }

 public void setArticleCount(int articleCount) {
 ArticleCount = articleCount;
 }

 public List<Article> getArticles() {
 return Articles;
 }

 public void setArticles(List<Article> articles) {
 Articles = articles;
 }

}

以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved