# 微信公衆號自動回覆功能開發html
本篇主要講解 微信公衆號自動回覆功能開發,讓咱們本身去託管公衆號回覆的功能,這樣能夠更加靈活的根據公衆號收到的信息來制定特定的回覆信息,一塊兒來了解吧!服務器
###  1.註冊公衆號微信
 若是你歷來沒建立過請先註冊 [微信公衆平臺](https://mp.weixin.qq.com/)app
 請選擇訂閱號,而後填寫一些基本信息便可 ,具體註冊流程這裏就展開說了。微信公衆平臺
 **注意 郵箱做爲登陸賬號,請填寫未被微信公衆平臺註冊,未被微信開放平臺註冊,未被我的微信號綁定的郵箱 建議直接註冊一個新郵箱使用**ide
![Xnip20191220_225433.png](http://q1xacbncg.bkt.clouddn.com/Xnip2019-12-20_22-54-33.png)工具
###  2.微信託管自動回覆功能post
 微信提供了自動回覆功能,也就是直接在微信上配置this
 **分別提供了3種配置 1.關鍵詞回覆 2.收到消息回覆 3.被關注回覆**加密
 使用方法很簡單 只須要在對應的回覆類型上面配置便可 這裏不作詳細說明
![Xnip20191220_233937.png](http://q1xacbncg.bkt.clouddn.com/Xnip2019-12-20_23-39-37.png)
![Xnip20191220_230059.png](http://q1xacbncg.bkt.clouddn.com/Xnip2019-12-20_23-00-59.png)
###  3.本身開發服務託管自動回覆功能
 本篇重點講解本身去託管自動回覆功能,微信只作轉發
####   3.1 關閉微信的自動回覆功能
  要想本身託管自動回覆功能首先要講微信的自動回覆功能關閉 關閉方式以下
![Xnip20191220_230557.png](http://q1xacbncg.bkt.clouddn.com/Xnip2019-12-20_23-05-57.png)
####   3.2 開發者中心配置託管的服務器信息
  **在開始服務器端開發以前,我先介紹一個natapp 內網穿透工具**,有了它你能夠直接將其本地映射一個地址配置到該URL地址上面,那麼方便你調試 具體關於natapp的使用 請看我另外一篇博客 [natapp 內網穿透工具](https://www.askajohnny.com/#/blog/111)
  主要配置URL地址 和Token信息 EncodingAESKey 能夠隨機生成
![Xnip20191220_232540.png](http://q1xacbncg.bkt.clouddn.com/Xnip2019-12-20_23-25-40.png)
####   3.3 服務端開發(驗證消息來來自微信服務器)
  開發者提交信息後,微信服務器將發送GET請求到填寫的服務器地址URL上,GET請求攜帶參數以下表所示:
參數 描述
signature 微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。
timestamp 時間戳
nonce 隨機數
echostr 隨機字符串
  開發者經過檢驗signature對請求進行校驗(下面有校驗方式)。若確認這次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成爲開發者成功,不然接入失敗。加密/校驗流程以下:
1)將token、timestamp、nonce三個參數進行字典序排序 2)將三個參數字符串拼接成一個字符串進行sha1加密 3)開發者得到加密後的字符串可與signature對比,標識該請求來源於微信
**你也能夠簡單粗暴的直接返回echostr 我暫時就是這樣作的**
/**
* 微信成爲開發者 接口
* @param signature : 簽名
* @param timestamp : 時間戳
* @param nonce : 隨機數
* @param echostr : 隨機字符串
* @return
*/
@GetMapping("/authorize")
public String authorize(@RequestParam("signature") String signature,
@RequestParam("timestamp") Long timestamp,
@RequestParam("nonce") String nonce,
@RequestParam("echostr") String echostr) {
log.info("【signature:{}】", signature);
log.info("【timestamp:{}】", timestamp);
log.info("【nonce:{}】", nonce);
log.info("【echostr:{}】", echostr);
return echostr;
}
  在上圖中點擊提交微信會發送請求到該接口 只要該接口正確返回了echostr,微信公衆號管理平臺就會以下顯示 提交成功
![Xnip20191220_233937.png](http://q1xacbncg.bkt.clouddn.com/Xnip2019-12-20_23-39-37.png)
  微信驗證 開發者成功後點擊 啓用 服務器配置信息
![Xnip20191220_234124.png](http://q1xacbncg.bkt.clouddn.com/Xnip2019-12-20_23-41-24.png)
####   3.4 服務器端開發 (接收消息)
  附上微信關於消息的開發文檔 [微信公衆平臺開發文檔](https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html)
  當普通微信用戶向公衆帳號發消息時,微信服務器將POST消息的XML數據包到開發者填寫的URL上,也就是你剛剛配置的驗證接口的URL地址,只不過是POST方式提交,因此你須要寫一個POST接口
文本消息
<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>
參數 描述
ToUserName 開發者微信號
FromUserName 發送方賬號(一個OpenID)
CreateTime 消息建立時間 (整型)
MsgType 消息類型,文本爲text
Content 文本消息內容
MsgId
  **接受到的消息格式:**
![Xnip20191220_233959.png](http://q1xacbncg.bkt.clouddn.com/Xnip2019-12-15_13-20-59.png)
  **封裝接收微信消息的實體**
  **這裏我使用了 XStream 來解析XML** 它很是好用,不瞭解的自行百度 後期可能會寫一篇關於XStream的用法
@Data
@XStreamAlias("xml")
public class WxXmlData implements Serializable {
@XStreamAlias("ToUserName")
private String toUserName;
@XStreamAlias("FromUserName")
private String fromUserName;
@XStreamAlias("CreateTime")
private Long createTime;
@XStreamAlias("MsgType")
private String msgType;
@XStreamAlias("Content")
private String content;
@XStreamAlias("MsgId")
private String msgId;
//
@XStreamAlias("Title")
private String title;
@XStreamAlias("Description")
private String description;
@XStreamAlias("Url")
private String url;
/**
* 訂閱或者取消訂閱的事件
*/
@XStreamAlias("Event")
private String event;
@XStreamAlias("EventKey")
private String eventkey;
}
  從InputStream流中讀取到xml字符串(inputstream從 post接口的 request.getInputStream()獲取),而後經過XStream解析到封裝的實體對象WxXmlData中
@Override
public WxXmlData resolveXmlData(InputStream in) throws IOException {
String xmlData = FileUtils.getInputToString(in);
log.info("【receive xmlData str : {}】", xmlData);
WxXmlData wxXmlData = null;
try {
XStream xstream = new XStream();
//這個必需要加 否則沒法轉換成WxXmlData對象
xstream.setClassLoader(WxXmlData.class.getClassLoader());
xstream.processAnnotations(WxXmlData.class);
xstream.alias("xml", WxXmlData.class);
wxXmlData = (WxXmlData) xstream.fromXML(xmlData);
log.info("【wxXmlData: {}】 ", wxXmlData);
} catch (Exception e) {
log.error("【error】{}", e.getMessage());
}
return wxXmlData;
}
  **編寫自動回覆接口,這裏有判斷 event,若是是訂閱能夠作相應的回覆,若是是 普通消息能夠作相應的回覆等等。。具體怎麼實現回覆邏輯看你本身的需求**
  **注意:你的回覆的人是 發送給你消息的人**
@Override
public String autoResponse(WxXmlData wxData) {
WxXmlData resultXmlData = new WxXmlData();
resultXmlData.setToUserName(wxData.getFromUserName()); //收到的消息是誰發來的再發給誰
resultXmlData.setFromUserName(wxData.getToUserName()); //
if (!StringUtils.isEmpty(wxData.getEvent())) {
if (WxSubscribeEnum.SUBSCRIBE.getValue().equals(wxData.getEvent())) {
resultXmlData.setMsgType("text");
resultXmlData.setCreateTime(System.currentTimeMillis());
resultXmlData.setContent("歡迎來到Johnny屋,本公衆號會按期更新技術乾貨,願與 讀者共同成長。\n\n" +
"-<a href=\"https://www.askajohnny.com\">個人博客(建議PC端打開,移動端適配正在緊張開發中)</a>");
}
} else if(wxData.getContent().equalsIgnoreCase("vip")){
resultXmlData.setMsgType("text");
resultXmlData.setCreateTime(System.currentTimeMillis());
resultXmlData.setContent("<a href=\"https://my.openwrite.cn/code/generate?blogId=18931-1576559666626-322\">點擊該連接,獲取博客解鎖驗證碼</a>");
} else {
resultXmlData.setMsgType("text");
resultXmlData.setCreateTime(System.currentTimeMillis());
resultXmlData.setContent("公衆號正在開發中。後期請多多關注!");
}
XStream xstream = new XStream();
xstream.processAnnotations(WxXmlData.class);
xstream.setClassLoader(WxXmlData.class.getClassLoader());
return xstream.toXML(resultXmlData); //XStream的方法,直接將對象轉換成 xml數據
**效果以下:**
![Xnip20191220_23395119.png](http://q1xacbncg.bkt.clouddn.com/Xnip2019-12-17_09-22-56.png)
### <a id="4_235"></a>4.總結
**本篇主要講解微信公衆號自動回覆功能的開發,實現本身託管消息回覆,可以更加靈活的根據不一樣的消息進行回覆,主要就是對XML的報文解析而且發送對應的報文便可,後期可能會有其餘關於微信公衆號開發的文章包括 自定義菜單 等等 多多關注**