隨着移動互聯網越來越普及,眾多企業都注冊了微信公眾號,於是微信公眾號的開發也越來越多,為了不被世界所淘汰,特地學習下微信公眾號的開發,已備不時之需!
按照慣例,學習一門新技術或者新框架,咱們還是從官方提供的文檔開始,於是找到微信公眾平台開發者文檔(http://mp.weixin.qq.com/wiki/home/index.html)
1、微信公眾平台接口測試號申請
按照文檔指引,咱們得先申請一個微信公眾平台接口測試賬號(http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login),使用自己個人的微信掃一掃授權即可申請成功,申請成功后發現微信會為我們自動分配一個微信號、appID和appsecret(如下圖所示)。
2、本地服務器地址外網映射
開發基於微信公眾號的應用最大的痛苦之處就是調試問題,每次實現一個功能后都需要部署到一個公網服務器進行測試,因為微信用戶每次向公眾號發起請求時,微信服務器會先接收到用戶的請求,然后再轉發到我們的服務器上,也就是說,微信服務器是要和我們的服務器進行網絡交互,所以我們必須保證我們的服務器外網可以訪問到,這種部署到公網服務器進行測試的做法對於我們開發者來說簡直是噩夢。所以我們要想一個辦法可以做到本地部署,本地調試代碼,而要做到這一點,那么我們要解決的問題就是將內網的部署服務器映射到外網,讓微信服務器可以正常訪問到,幸運的是,借助於第三方軟件Ngrok,我們就可以做得到。Ngrok是一個免費的軟件Ngrok,使用Ngrok后,我們就可以實現內網穿透,也就是說我們可以將內網的服務器映射到外網給別人訪問,這對於我們在本地開發環境中調試微信代碼是以及給用戶演示一些東西非常快速和有幫助的,因為可以直接使用我們自己的內網的電腦作為服務器。
國內提供Ngrok服務比較好的網站是:http://natapp.cn/,下載到本地解壓后運行natapp.exe文件即可。當然,由於使用的是免費版,這里默認映射地址為:127.0.0.1:80,外網地址則隨機生成,如果選擇付費可以自定義二級域名,下面是我映射的情況:
3、接入微信公眾平台開發
按照文檔指引,接下來可以進行微信公眾平台開發接入了,接入步驟如下:
第一步:填寫服務器配置,也就是URL和Token,URL就是服務器接口地址,Token自定義
第二步:驗證服務器地址的有效性,當點擊“提交”按鈕后,微信服務器將發送一個http的get請求到剛剛填寫的服務器地址,並且攜帶四個參數及加密/校驗流程:
第三步:依據接口文檔實現業務邏輯,如下所示:
@RequestMapping("/token") public void token(ModelMap modelMap, HttpServletRequest request, HttpServletResponse response) throws IOException{ //微信加密簽名signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。 String signature = request.getParameter("signature"); //時間戳 String timestamp = request.getParameter("timestamp"); //隨機數 String nonce = request.getParameter("nonce"); //隨機字符串 String echostr = request.getParameter("echostr"); //排序 String sortString = WechatUtil.sort(TOKEN, timestamp, nonce); //加密 String mySignature = WechatUtil.sha1(sortString); //校驗簽名 if (mySignature != null && mySignature != "" && mySignature.equals(signature)) { System.out.println("success"); //如果檢驗成功輸出echostr,微信服務器接收到此輸出,才會確認檢驗完成。 response.getWriter().write(echostr); } else { System.out.println("fail"); } } /** * 排序 * @param token * @param timestamp * @param nonce * @return */ public static String sort(String token, String timestamp, String nonce) { String[] strArray = {token, timestamp, nonce}; Arrays.sort(strArray); StringBuilder sb = new StringBuilder(); for (String str : strArray) { sb.append(str); } return sb.toString(); } /** * sha1加密 * @param str * @return */ public static String sha1(String str) { try { MessageDigest digest = MessageDigest.getInstance("SHA-1"); digest.update(str.getBytes()); byte messageDigest[] = digest.digest(); // Create Hex String StringBuffer hexString = new StringBuffer(); // 字節數組轉換為 十六進制 數 for (int i = 0; i < messageDigest.length; i++) { String shaHex = Integer.toHexString(messageDigest[i] & 0xFF); if (shaHex.length() < 2) { hexString.append(0); } hexString.append(shaHex); } return hexString.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return ""; }
按要求填寫URL和Token,點擊“提交”按鈕后即可配置成功:
4、access_token管理
關於access_token的獲取方式,在微信公眾平台開發者文檔上有說明,公眾號可以調用一個叫"獲取access token"的接口來獲取access_token。
獲取access token接口調用請求說明
http請求方式: GET
請求的URL地址:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
由於access_token每天最多請求2000次,每次超時時間為7200秒,因此必須采取每種策略來獲取access_token,方法有很多種,這里我采取的是借助redis服務器來緩存access_token的方式(利用redis緩存服務器緩存數據時可以設置超時時間的特性),具體代碼如下:
public String obtain() { String accessToken = ""; String url = MessageFormat.format(baseUrl, appId, appSecret); String responseStr = HttpClientUtil.get(url); Jedis jedis = redisService.borrow(); try { if(jedis.exists(WechatConst.WECHAT_ACCESS_TOKEN)){ accessToken = jedis.get(WechatConst.WECHAT_ACCESS_TOKEN); }else{ AccessTokenResponseDTO dto = JsonUtil.json2Bean(responseStr, AccessTokenResponseDTO.class); accessToken = dto.getAccess_token(); jedis.setex(WechatConst.WECHAT_ACCESS_TOKEN, 7000, accessToken); } } catch (Exception e) { log.debug("[wechat]accessToken response parse error[response="+responseStr+"]"); e.printStackTrace(); } finally{ redisService.returnResource(jedis); } return accessToken; }
至此,關於微信公眾號開發的基礎工作已基本完成,萬丈高樓平地起,接下來可以進行具體的開發了。
----------------------------------------------------------------------------------------------------------------------------
ps:除了代碼之外,咱還可以聊點別的,有興趣可以關注我的個人微信公眾號!