java微信企業號開辟之開辟形式的開啟。本站提示廣大學習愛好者:(java微信企業號開辟之開辟形式的開啟)文章只能為提供參考,不一定能成為您想要的結果。以下是java微信企業號開辟之開辟形式的開啟正文
起首說微信企業號的開辟形式分為:編纂形式(通俗形式)和開辟形式(回調形式) ,在編纂形式下,只能做簡略的自界說菜單和主動答復新聞,要想完成其他功效還得開啟開辟者形式。
1、編纂形式和開辟形式抵消息的處置流程
1.編纂形式下,一切的營業流程都設置裝備擺設在微佩服務器上,由它處置
2.開辟形式,新聞經由過程第三方辦事器處置,最初經由微佩服務器把新聞發送給用戶
開辟形式能處置的新聞比編纂形式多,所以要先開啟開辟形式能力開辟更多功效。
2、開辟形式的開啟
在回調形式下,企業不只可以自動挪用企業號接口,還可以吸收用戶的新聞或事宜。吸收的信息應用XML數據格局、UTF8編碼,並以AES方法加密。
1.開啟回調形式後要設置裝備擺設參數以下:
個中url是要拜訪的servlet,token和EncodingAESKey是隨機獲得的,但要和項目中堅持分歧。
2.驗證URL的有用性
當你提交以上信息時,企業號將發送GET要求到填寫的URL上,GET要求攜帶四個參數,企業在獲得時須要做urldecode處置,不然會驗證不勝利。
3.代碼
CoreServlet1類
public class CoreServlet1 extends HttpServlet { private static final long serialVersionUID = 4440739483644821986L; String sToken = "weixinCourse"; String sCorpID = "wxe510946434680dab"; String sEncodingAESKey = "DjlyZxgKiWRESIW2VnV9dSr7HsS7usWDfnwA8Q1ove1"; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { WXBizMsgCrypt wxcpt; try { wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID); String sVerifyMsgSig = request.getParameter("msg_signature"); String sVerifyTimeStamp = request.getParameter("timestamp"); String sVerifyNonce = request.getParameter("nonce"); String sVerifyEchoStr = request.getParameter("echostr"); String sEchoStr; sEchoStr = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sVerifyEchoStr); System.out.println("verifyurl echostr: " + sEchoStr); PrintWriter out = response.getWriter(); out.print(sEchoStr); out.close(); out = null; } catch (AesException e1) { e1.printStackTrace(); } } }
對象類:
/** * 對"平台發送給"賬號的新聞加解密示例代碼. * * @copyright Copyright (c) 1998-2014 Tencent Inc. */ // ------------------------------------------------------------------------ /** * 針對org.apache.commons.codec.binary.Base64, * 須要導入架包commons-codec-1.9(或commons-codec-1.8等其他版本) * 官方下載地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi */ package com.qq.weixin.mp.aes; import java.nio.charset.Charset; import java.util.Arrays; import java.util.Random; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; /** * 供給吸收和推送給"平台新聞的加解密接口(UTF8編碼的字符串). * <ol> * <li>第三方答復加密新聞給"平台</li> * <li>第三方收到"平台發送的新聞,驗證新聞的平安性,並抵消息停止解密。</li> * </ol> * 解釋:異常java.security.InvalidKeyException:illegal Key Size的處理計劃 * <ol> * <li>在官方網站下載JCE無窮制權限戰略文件(JDK7的下載地址: * http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html</li> * <li>下載後解壓,可以看到local_policy.jar和US_export_policy.jar和readme.txt</li> * <li>假如裝置了JRE,將兩個jar文件放到%JRE_HOME%\lib\security目次下籠罩本來的文件</li> * <li>假如裝置了JDK,將兩個jar文件放到%JDK_HOME%\jre\lib\security目次下籠罩本來文件</li> * </ol> */ public class WXBizMsgCrypt { static Charset CHARSET = Charset.forName("utf-8"); Base64 base64 = new Base64(); byte[] aesKey; String token; String corpId; /** * 結構函數 * @param token "平台上,開辟者設置的token * @param encodingAesKey "平台上,開辟者設置的EncodingAESKey * @param corpId 企業的corpid * * @throws AesException 履行掉敗,請檢查該異常的毛病碼和詳細的毛病信息 */ public WXBizMsgCrypt(String token, String encodingAesKey, String corpId) throws AesException { if (encodingAesKey.length() != 43) { throw new AesException(AesException.IllegalAesKey); } this.token = token; this.corpId = corpId; aesKey = Base64.decodeBase64(encodingAesKey + "="); } /** * 對密文停止解密. * * @param text 須要解密的密文 * @return 解密獲得的明文 * @throws AesException aes解密掉敗 */ String decrypt(String text) throws AesException { byte[] original; try { // 設置解密形式為AES的CBC形式 Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); SecretKeySpec key_spec = new SecretKeySpec(aesKey, "AES"); IvParameterSpec iv = new IvParameterSpec(Arrays.copyOfRange(aesKey, 0, 16)); cipher.init(Cipher.DECRYPT_MODE, key_spec, iv); // 應用BASE64對密文停止解碼 byte[] encrypted = Base64.decodeBase64(text); // 解密 original = cipher.doFinal(encrypted); } catch (Exception e) { e.printStackTrace(); throw new AesException(AesException.DecryptAESError); } String xmlContent, from_corpid; try { // 去除補位字符 byte[] bytes = PKCS7Encoder.decode(original); // 分別16位隨機字符串,收集字節序和corpId byte[] networkOrder = Arrays.copyOfRange(bytes, 16, 20); int xmlLength = recoverNetworkBytesOrder(networkOrder); xmlContent = new String(Arrays.copyOfRange(bytes, 20, 20 + xmlLength), CHARSET); from_corpid = new String(Arrays.copyOfRange(bytes, 20 + xmlLength, bytes.length), CHARSET); } catch (Exception e) { e.printStackTrace(); throw new AesException(AesException.IllegalBuffer); } // corpid不雷同的情形 if (!from_corpid.equals(corpId)) { throw new AesException(AesException.ValidateCorpidError); } return xmlContent; } /** * 驗證URL * @param msgSignature 簽名串,對應URL參數的msg_signature * @param timeStamp 時光戳,對應URL參數的timestamp * @param nonce 隨機串,對應URL參數的nonce * @param echoStr 隨機串,對應URL參數的echostr * * @return 解密以後的echostr * @throws AesException 履行掉敗,請檢查該異常的毛病碼和詳細的毛病信息 */ public String VerifyURL(String msgSignature, String timeStamp, String nonce, String echoStr) throws AesException { String signature = SHA1.getSHA1(token, timeStamp, nonce, echoStr); if (!signature.equals(msgSignature)) { throw new AesException(AesException.ValidateSignatureError); } String result = decrypt(echoStr); return result; } } /** * 對"平台發送給"賬號的新聞加解密示例代碼. * * @copyright Copyright (c) 1998-2014 Tencent Inc. */ // ------------------------------------------------------------------------ package com.qq.weixin.mp.aes; import java.security.MessageDigest; import java.util.Arrays; /** * SHA1 class * * 盤算"平台的新聞簽名接口. */ class SHA1 { /** * 用SHA1算法生成平安簽名 * @param token 單子 * @param timestamp 時光戳 * @param nonce 隨機字符串 * @param encrypt 密文 * @return 平安簽名 * @throws AesException */ public static String getSHA1(String token, String timestamp, String nonce, String encrypt) throws AesException { try { String[] array = new String[] { token, timestamp, nonce, encrypt }; StringBuffer sb = new StringBuffer(); // 字符串排序 Arrays.sort(array); for (int i = 0; i < 4; i++) { sb.append(array[i]); } String str = sb.toString(); // SHA1簽名生成 MessageDigest md = MessageDigest.getInstance("SHA-1"); md.update(str.getBytes()); byte[] digest = md.digest(); StringBuffer hexstr = new StringBuffer(); String shaHex = ""; for (int i = 0; i < digest.length; i++) { shaHex = Integer.toHexString(digest[i] & 0xFF); if (shaHex.length() < 2) { hexstr.append(0); } hexstr.append(shaHex); } return hexstr.toString(); } catch (Exception e) { e.printStackTrace(); throw new AesException(AesException.ComputeSignatureError); } } } class PKCS7Encoder { static Charset CHARSET = Charset.forName("utf-8"); static int BLOCK_SIZE = 32; /** * 刪除解密後明文的補位字符 * * @param decrypted 解密後的明文 * @return 刪除補位字符後的明文 */ static byte[] decode(byte[] decrypted) { int pad = (int) decrypted[decrypted.length - 1]; if (pad < 1 || pad > 32) { pad = 0; } return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad); } }
3、總結
企業經由過程參數msg_signature對要求停止校驗,假如確認此次GET要求來自企業號,那末企業運用對echostr參數解密並原樣前往echostr明文(不克不及加引號),則接入驗證失效,回調形式能力開啟。開啟後一些功效會陸續完成,敬請等待!
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。