微信公眾號入門筆記(一)啟用伺服器配置
最近研究了下微信公眾號開發,這幾篇文章是我的筆記。
首先你要有個公眾號,去https://mp.weixin.qq.com/註冊。現在個人只能註冊訂閱號,訂閱號有些介面是不開放的,沒辦法我們只好先看看它開放的介面了。
我們登入後臺,去看一下公眾平臺開發者文件,“開發者必讀”裡面的“接入指南”。我建議你認真讀一下這篇指南。
我簡單說一下微信公眾號開發是怎麼回事。在你有了個微信公眾號之後,你還要有個伺服器(你可以用百度bae,或者新浪sae或者阿里雲伺服器),登入微信公眾號後臺,在最左邊的選單“開發”—“基本配置”裡,你可以啟用伺服器配置。
在這裡,你填入伺服器地址url和token(具體看文件)。你要確保你填的url能夠響應。那麼,當別人向你的公眾號發訊息時,微信伺服器會將該訊息傳送到你配置的url,然後會將你的url的響應返回給別人。大致的流程就是這樣。
指南上寫的很清楚了,並提供有php程式碼示例,我們要做的就是把它翻譯成java版的。我參考了這篇部落格 http://m.blog.csdn.net/blog/bd_zengxinxin/19357163,第一篇接入的程式碼比較簡單,所以基本直接拷貝自它,特此說明,另外這篇部落格現在訪問不了了。
事實上,我們在這第一篇要做的就是配置提供一個能響應微信伺服器器的url。那麼,微信後臺怎麼確保你填的url有效呢?當你在伺服器配置中填上你的url點選確定後,微信伺服器將傳送GET請求到填寫的伺服器地址URL上,GET請求攜帶四個引數:
引數 |
描述 |
signature |
微信加密簽名,signature |
timestamp |
時間戳 |
nonce |
隨機數 |
echostr |
隨機字串 |
你的url要能響應這個請求,首先你要對其進行校驗,“若確認此次GET請求來自微信伺服器,請原樣返回echostr引數內容,則接入生效,成為開發者成功,否則接入失敗。”
校驗方法如下:
加密/校驗流程如下:
1. 將token、timestamp、nonce三個引數進行字典序排序
2. 將三個引數字串拼接成一個字串進行sha1加密
3. 開發者獲得加密後的字串可與signature對比,標識該請求來源於微信
不知你看到了這裡會不會有疑問?你是否會想:如果我不校驗,直接返回echostr引數內容呢?微信後臺允許我配置成功嗎?筆者親試過,答案是可以!為什麼呢?因為只要你配置的url返回了echostr,那麼微信後臺就認為你的url能正確響應,是可用的。至於你是否真的去做了校驗,微信伺服器並不知道。你之所以要校驗是為了確認請求是來自微信伺服器,反正微信告訴了你校驗方式,你不去校驗,由此帶來的安全問題就是你自己的事了。
處理get請求的controller類如下:
/**
*@ClassName: WeixinController
*@Description: 響應Controller
*@author zhutulang
*@date 2016年1月4日
*@version V1.0
*/
@Controller
@RequestMapping("/weixinCon")
public class WeixinController {
private Logger log =Logger.getLogger(WeixinController.class);
@RequestMapping(method =RequestMethod.GET)
public void get(HttpServletRequest request,HttpServletResponse response) {
log.info("請求進來了...");
// 微信加密簽名,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;
}
}
}
其它相關程式碼可檢視: