微信公眾號開發筆記(一):配置公眾號開發模式
阿新 • • 發佈:2018-12-25
寫部落格向來是直接乾貨走起,廢話不多說:
1.註冊微信公眾號就不多說了,
2.在進行配置公眾號之前先成為開發者,成為開發者需要進行身份驗證
3.進行微信公眾號的配置
1.微信AppId和AppSecret直接可以在控制平臺拿到
2.進行域名設定
JS介面安全域名: 此域名是進行呼叫微信js-sdk時需要驗證的域名。所有js-sdk元素都有在這個域名下。不需要新增http開頭。
網頁授權域名:是進行關注公眾號進行網頁授權用的回撥域名。請注意,這裡填寫的是域名(是一個字串),而不是URL,因此請勿加 http:// 等協議頭,但是必須指到專案上,可自行判斷是否加專案名,一般線上環境不需要加專案名,本地花生殼測試環境會新增專案名;詳情檢視https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
3.進行伺服器配置
URL必須為可直接訪問路徑,用於微信伺服器進行確認伺服器是通的。
Token為自定義的和微信伺服器約定值,儘量用數字。
程式碼例項:
URL介面實現程式碼:
/** * 微信請求 即url * @return */ @RequestMapping(value="/wechatEvent") public void wechatEvent(HttpServletRequest request, HttpServletResponse response){ try { String signature = request.getParameter("signature");// 微信加密簽名 String timestamp = request.getParameter("timestamp");// 時間戮 String nonce = request.getParameter("nonce"); // 隨機數 String echostr = request.getParameter("echostr"); // 隨機字串 if(!StringUtils.isEmpty(echostr)){ //簽名驗證 此處就是處理伺服器驗證的,將隨機串返回微信伺服器 if(CheckSignature.checkSignature(signature, timestamp, nonce)==true) { jsonOut(echostr); } }else{ ServletInputStream in=request.getInputStream(); response.setCharacterEncoding("utf-8"); //將微信訊息轉換為實體類 EventMessage message= XMLConverUtil.convertToObject(new EventMessage().getClass(), in); //關注事件 if (message.getEvent().toLowerCase().equals(MessageType.SUBSCRIBE)) { StringBuffer url = request.getRequestURL(); String tempContextUrl = url.delete(url.length() - request.getRequestURI().length(), url.length()).append(request.getContextPath()).toString(); message.setUrl(tempContextUrl); logger.info(message.getFromUserName()); } JsonUtil.toJSONString("接收到使用者發來訊息==="+message); //處理微信訊息 String xml= WechatServiceUtil.getWechatMessageAndSendMessageToWechat(message); if (!StringUtils.isEmpty(xml)){ response.getWriter().write(xml);//回覆訊息 } } } catch (Exception e) { e.printStackTrace(); logger.error("微信請求異常====》"+e); } }
校驗方法checkSignature:
package com.chinatsp.wechat.util; import com.chinatsp.wechat.bean.WechatBean; import org.apache.log4j.Logger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; public class CheckSignature { private Logger log = Logger.getLogger(getClass()); /** * 加密/校驗 * @param signature * @param timestamp * @param nonce * @return */ public static boolean checkSignature(String signature, String timestamp, String nonce) { //此處TOKEN為微信伺服器後臺自定義的 token值,這裡只是進行了封裝bean,可自行獲取處理 String[] arr = new String[] { WechatBean.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]); } // 將三個引數字串拼接成一個字串進行sha1加密 MessageDigest md = null; String tmpStr = null; try { md = MessageDigest.getInstance("SHA-1"); 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; } /** *將byte陣列轉換成字型串 * @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; } public String getSignature(String jsapi_ticket,String noncestr,String timestamp,String url) { log.info("jsapi_ticket"+jsapi_ticket); String signature=""; String a="jsapi_ticket="+jsapi_ticket+"&noncestr="+noncestr+"×tamp="+timestamp+"&url="+url; MessageDigest md = null; try { md = MessageDigest.getInstance("SHA-1"); // 將三個引數字串拼接成一個字串進行sha1加密 byte[] digest = md.digest(a.getBytes()); signature = byteToStr(digest); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return signature.toLowerCase(); } }
啟動專案,進行伺服器配置成功儲存,提示配置成功即代表通訊成功。
到此,基本上配置介紹了 。
附錄:下圖再配一張測試公眾號的配置概覽圖以供參考
如果看完此文章還有不明白的地方,請戳此處https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319