1. 程式人生 > >微信公眾號入門筆記(一)啟用伺服器配置

微信公眾號入門筆記(一)啟用伺服器配置

最近研究了下微信公眾號開發,這幾篇文章是我的筆記。

首先你要有個公眾號,去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

結合了開發者填寫的token引數和請求中的timestamp引數、nonce引數。

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; 
                 } 
             } 
}


 其它相關程式碼可檢視: