1. 程式人生 > >微信公眾號開發紀要(2)-微信公眾號接入

微信公眾號開發紀要(2)-微信公眾號接入

來源 mes Once tle RoCE ech 技術 odin exceptio

當搭建好微信公眾號開發環境後,先要和微信公眾號建立聯系。從本質上來說,微信公眾號開發就是如何讓自己的服務器與微信服務器進行交互的一個過程。

微信服務器就相當於一個轉發服務器,終端(手機、Pad等)發起請求至微信服務器,微信服務器然後將請求轉發給我們的應用服務器。應用服務器處理完畢後,將響應數據回發給微信服務器,微信服務器再將具體響應信息回復到微信App終端。

  通信協議為:HTTP

  數據傳輸格式為:XML

  具體的流程如下圖所示:

技術分享圖片

  來一張更加直觀的圖吧:

技術分享圖片

  我們需要做的事情,就是對微信服務器轉發的HTTP請求做出響應。具體的請求內容,我們按照特定的XML格式去解析,處理完畢後,也要按照特定的XML格式返回。

關於公眾號接入這一節內容在接入指南上寫的比較詳細的,文檔中說接入公眾號需要3個步驟,分別是:

  1、填寫服務器配置
  2、驗證服務器地址的有效性
  3、依據接口文檔實現業務邏輯

第1步中服務器配置包含服務器地址(URL)、Token和EncodingAESKey。

服務器地址即公眾號後臺提供業務邏輯的入口地址,目前只支持80端口,之後包括接入驗證以及任何其它的操作的請求(例如消息的發送、菜單管理、素材管理等)都要從這個地址進入。接入驗證和 其它請求的區別就是,接入驗證時是get請求,其它時候是post請求;

  Token可由開發者可以任意填寫,用作生成簽名(該Token會和接口URL中包含的Token進行比對,從而驗證安全性);

  EncodingAESKey由開發者手動填寫或隨機生成,將用作消息體加解密密鑰。如果你不加密,已明文消息方式,這個選項可以不配置。

第2步,驗證服務器地址的有效性,當點擊“提交”按鈕後,微信服務器將發送一個http的get請求到剛剛填寫的服務器地址,並且攜帶四個參數:


  接到請求後,我們需要做如下三步,若確認此次GET請求來自微信服務器,原樣返回echostr參數內容,則接入生效,否則接入失敗。

  1. 將token、timestamp、nonce三個參數進行字典序排序
  2. 將三個參數字符串拼接成一個字符串進行sha1加密
  3. 開發者獲得加密後的字符串可與signature對比,標識該請求來源於微信。如果與微信加密簽名一致,則將echostr原樣返回給微信服務器。

技術分享圖片

技術分享圖片

技術分享圖片

驗證微信加密簽名可以寫成一個方法,放到一個工具類中,現將該方法貼出來。

public static boolean checkSignature(String token, String signature, String timestamp, String nonce) {
String[] arr = new String[] { token, timestamp, nonce };
// 將token、timestamp、nonce三個參數進行字典序排序
Arrays.sort(arr);
StringBuilder content = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
content.append(arr[i]);
}
MessageDigest md = null;
String tmpStr = null;

try {
md = MessageDigest.getInstance("SHA-1");
// 將三個參數字符串拼接成一個字符串進行sha1加密
byte[] digest = md.digest(content.toString().getBytes());
tmpStr = byteToStr(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}

content = null;
// 將sha1加密後的字符串可與signature對比,標識該請求來源於微信
return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
}

/**
* 將字節數組轉換為十六進制字符串
*
* @param byteArray
* @return
*/
private static String byteToStr(byte[] byteArray) {
String strDigest = "";
for (int i = 0; i < byteArray.length; i++) {
strDigest += byteToHexStr(byteArray[i]);
}
return strDigest;
}

/**
* 將字節轉換為十六進制字符串
*
* @param mByte
* @return
*/
private static String byteToHexStr(byte mByte) {

char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
char[] tempArr = new char[2];
tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
tempArr[1] = Digit[mByte & 0X0F];

String s = new String(tempArr);
return s;
}

如果checkSignature方法結果為true,則將echostr原樣寫回微信服務器。

如果一切順利,在微信接口配置頁面輸入我們配置好的url和token,點擊提交,就會顯示配置成功的提示。這樣我們自己的服務器就與微信服務器成功對接上了。這樣就能開始自己的業務邏輯開發了。

微信公眾號開發紀要(2)-微信公眾號接入