掃碼登陸微信公衆號平臺,此時默認的是編輯模式,需要修改爲開發者模式。
找到開發--->基本配置,
設置AppId以及APPSecret,並填寫IP白名單(在線ip查詢:http://www.ip138.com/)。
下面進行服務器配置,這裏需要進行token的驗證,會根據你填寫的url進行token的匹配驗證,官網描述的很清楚:https://mp.weixin.qq.com/wiki...
開發者提交信息後,微信服務器將發送GET請求到填寫的服務器地址URL上,GET請求攜帶參數如下表所示:
開發者通過檢驗signature對請求進行校驗(下面有校驗方式)。若確認此次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成爲開發者成功,否則接入失敗。加密/校驗流程如下:
1)將token、timestamp、nonce三個參數進行字典序排序
2)將三個參數字符串拼接成一個字符串進行sha1加密
3)開發者獲得加密後的字符串可與signature對比,標識該請求來源於微信
官網也給出了校驗實例,但是是php的,需要我們轉換成java。具體步驟如下:
創建springboot項目,添加依賴
<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.9</version>
</dependency>
創建WechatIndexController類,實現一個get請求方法:
@RestController
@RequestMapping("/index")
public class WechatIndexController {
private static final Logger LOGGER = LoggerFactory.getLogger(WechatIndexController.class);
@RequestMapping(method = RequestMethod.GET)
public void get(HttpServletRequest request, HttpServletResponse response) {
// 微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。
String signature = request.getParameter("signature");
// 時間戳
String timestamp = request.getParameter("timestamp");
// 隨機數
String nonce = request.getParameter("nonce");
// 隨機字符串
String echostr = request.getParameter("echostr");
PrintWriter out = null;
try {
out = response.getWriter();
// 通過檢驗signature對請求進行校驗,若校驗成功則原樣返回echostr,否則接入失敗
if (SignUtil.checkSignature(signature, timestamp, nonce)) {
out.print(echostr);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
out.close();
out = null;
}
}
}
SignUtil類:
public class SignUtil {
//token可以自己進行定義,必須爲英文或者是數字,長度爲3-32字符,這個token要跟服務器配置中的token一致
private static String token = "woshiyigetokenaaa123qqq";
/**
* 校驗簽名
* @param signature 簽名
* @param timestamp 時間戳
* @param nonce 隨機數
* @return 布爾值
*/
public static boolean checkSignature(String signature,String timestamp,String nonce){
String checktext = null;
if (null != signature) {
//對ToKen,timestamp,nonce 按字典排序
String[] paramArr = new String[]{token,timestamp,nonce};
Arrays.sort(paramArr);
//將排序後的結果拼成一個字符串
String content = paramArr[0].concat(paramArr[1]).concat(paramArr[2]);
try {
MessageDigest md = MessageDigest.getInstance("SHA-1");
//對接後的字符串進行sha1加密
byte[] digest = md.digest(content.toString().getBytes());
checktext = byteToStr(digest);
} catch (NoSuchAlgorithmException e){
e.printStackTrace();
}
}
//將加密後的字符串與signature進行對比
return checktext !=null ? checktext.equals(signature.toUpperCase()) : false;
}
/**
* 將字節數組轉化我16進制字符串
* @param byteArrays 字符數組
* @return 字符串
*/
private static String byteToStr(byte[] byteArrays){
String str = "";
for (int i = 0; i < byteArrays.length; i++) {
str += byteToHexStr(byteArrays[i]);
}
return str;
}
/**
* 將字節轉化爲十六進制字符串
* @param myByte 字節
* @return 字符串
*/
private static String byteToHexStr(byte myByte) {
char[] Digit = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char[] tampArr = new char[2];
tampArr[0] = Digit[(myByte >>> 4) & 0X0F];
tampArr[1] = Digit[myByte & 0X0F];
String str = new String(tampArr);
return str;
}
}
先啓動ngrok,再啓動tomcat項目,將外網地址/index填入對應url,token按照剛纔定義的書寫,加密祕鑰隨機生成即可:
提交成功!!
當然,如果有自己的外網服務器,只需要將項目打包發佈到外網,url和token根據自己定義的來書寫,也沒有什麼問題。注意,一定要保證切換到開發者模式。
服務器配置成功之後,就可以進行後續開發啦,下面會介紹如何訂閱回覆圖文消息。