申請測試微信公眾號
申請的地址:https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index
點擊登錄,彈出二維碼頁面,微信掃碼登錄后,
需要填寫接口配置信息中的url,token:url是回調地址,token值可以隨意填寫。
js 接口安全域名需要設置一個可以訪問的域名,這個域名和接口配置的url 地址中的域名是一致的,
點擊提交按鈕時,微信服務器將發送GET請求到填寫的服務器地址URL上,GET請求攜帶參數如下表所示:
通過檢驗signature對請求進行校驗,流程如下:
1)將token、timestamp、nonce三個參數進行排序
2)將三個參數字符串拼接成一個字符串進行 SHA-1 加密
3)開發者獲得加密后的字符串可與signature對比,相等則返回 echostr 參數給微信。
代碼實現如下:
//該方法就是接口配置url中請求的方法 public String WechatCallBack() throws IOException{ //驗證簽名的是get請求 boolean isGet = Objects.equals("GET", getRequest().getMethod().toUpperCase()); if(isGet){ //微信公眾號服務器接口配置的簽名token String token = "dfgsdfgdfg"; //可寫在配置文件中,從配置文件中獲取,或存在數據庫中 //隨機數 String nonce = request.getParameter("nonce"); //簽名 String signature =request.getParameter("signature"); //時間戳 String timestamp = request.getParameter("timestamp"); //驗證token String[] paramArr = new String[] {token,timestamp,nonce}; Arrays.sort(paramArr); //將驗證的值返回給微信服務器 PrintWriter out = response.getWriter(); String echostr = request.getParameter("echostr"); if (WechatMessageUtil.checkSignNature(paramArr,signature)){ LOG.error( "===========請求校驗成功========"); out.print(echostr); }else{ LOG.error("===========請求校驗失敗========"); } return null; } }
WechatMessageUtil工具類
public static boolean checkSignNature(String[] paramArr,String signature) { StringBuilder content = new StringBuilder(); for (int i = 0; i < paramArr.length; i++) { content.append(paramArr[i]); } String cipherText = null; try{ MessageDigest md = MessageDigest.getInstance("SHA-1"); byte[] digest = md.digest(content.toString().getBytes()); cipherText = byteToStr(digest); }catch (NoSuchAlgorithmException ex){ ex.printStackTrace(); } return cipherText != null ? cipherText.equals(signature.toUpperCase()) : false; } public static String byteToStr(byte[] digest) { String strDigest = ""; for (int i = 0; i < digest.length; i++) { strDigest += byteToHexStr(digest[i]); } return strDigest; } public 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; }
此時頁面上顯示提交成功即可,然后就可以調用微信的接口來實現具體的功能了。