進行微信公衆號的開發:java
1.咱們須要有微信公衆號(開發中咱們能夠本身去申請一個我的的公衆號進行測試開發),算法
2.須要一個公網的IP(對於開發階段便於咱們調試,咱們能夠使用ngrok,進行一個內網穿透,將本地IP映射成公網的IP,使用80端口),開發時候,咱們將Tomcat端口設置爲80;服務器
3.裏面所涉及到的工具類,在個人經常使用工具類中,我有進行展現說明,直接Copy微信
-------------------------------------------------------開始微信後臺------------------------------------------------------------------微信開發
開發微信公衆號,必須進入微信公衆號平臺中,進行url 和token 的配置,這個url就是咱們與微信後臺交互的路徑,咱們主要就是開發這個url;app
APPID 以及AppSecret 會自動生成,在咱們開發中咱們會用的到,進行校驗工具
配置url,這個url是微信Get請求到咱們服務器的地址,且爲公網能夠訪問的地址;測試
自定義一個token,後面代碼有用ui
---------------------------------------------編寫微信Get請求的後臺校驗代碼(******重要的一步)---------------------------------------------------加密
/*controller * 該方法與微信後臺配置的url進行對接,是get的請求,是微信開發的第一步 * 微信後臺會給咱們接口傳入signature,timestamp,nonce,echostr * 進行sha1 加密與signature比較,TRUE 則返回echostr給微信 * author:cys */ @RequestMapping(value="/wxopen" ,method=RequestMethod.GET) public void wxopen(HttpServletResponse response,String signature,String timestamp,String nonce,String echostr) { PrintWriter writer=null;
//微信檢驗邏輯處理,這裏涉及到一些算法以及加密,不用去研究它,複製就行 if(WxOpenCheck.checkSignature(signature, timestamp, nonce)) { try { writer=response.getWriter(); writer.write(echostr); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if(writer !=null) { writer.close(); } } } }
微信檢驗邏輯
package com.wx.project.util; import java.util.Arrays; public class WxOpenCheck { //微信參數進行校驗的邏輯 public static boolean checkSignature(String signature,String timestamp,String nonce) { //後臺本身定義的Token,開發者須要本身修改的地方 String token ="chenyuesong"; String arr[]= new String[] {token,timestamp,nonce}; //排序 Arrays.sort(arr); StringBuilder builder =new StringBuilder(); for(int i=0;i<arr.length;i++) { builder.append(arr[i]); } //sha1 加密 String sha1=SHA1.encode(builder.toString()); return sha1.equals(signature); } }
sha1加密工具類,直接copy
package com.wx.project.util; import java.security.MessageDigest; /* * sha1 加密算法 * 網上copy 一大堆 */ public class SHA1 { private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; /** * Takes the raw bytes from the digest and formats them correct. * * @param bytes the raw bytes from the digest. * @return the formatted bytes. */ private static String getFormattedText(byte[] bytes) { int len = bytes.length; StringBuilder buf = new StringBuilder(len * 2); // 把密文轉換成十六進制的字符串形式 for (int j = 0; j < len; j++) { buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]); buf.append(HEX_DIGITS[bytes[j] & 0x0f]); } return buf.toString(); } public static String encode(String str) { if (str == null) { return null; } try { MessageDigest messageDigest = MessageDigest.getInstance("SHA1"); messageDigest.update(str.getBytes()); return getFormattedText(messageDigest.digest()); } catch (Exception e) { throw new RuntimeException(e); } } }
代碼寫好以後,在80端口運行,在微信後臺中將咱們的寫好的接口url接口配置上,點擊提交,只要代碼沒有錯誤,就會成功。
這樣咱們的第一步就完成了,微信和咱們的後臺就是打通了-----