這篇文章主要為大家詳細(xì)介紹了java微信企業(yè)號開發(fā)之開發(fā)模式的開啟方法,感興趣的小伙伴們可以參考一下
首先說微信企業(yè)號的開發(fā)模式分為: 編輯模式(普通模式)和開發(fā)模式(回呼模式) ,在編輯模式下,只能做簡單的自訂選單和自動回覆訊息,要實現(xiàn)其他功能還得開啟開發(fā)者模式。
一、編輯模式與開發(fā)模式對訊息的處理流程
?1.編輯模式下,所有的業(yè)務(wù)流程都配置在微信伺服器上,由它處理
?
2.開發(fā)模式,訊息透過第三方伺服器處理,最後經(jīng)過微信伺服器把訊息傳送給使用者
?
開發(fā)模式能處理的訊息比編輯模式多,所以要先開啟開發(fā)模式才能開發(fā)更多功能。
二、開發(fā)模式的開啟
???? 在回呼模式下,企業(yè)不僅可以主動呼叫企業(yè)號介面,還能接收使用者的訊息或事件。 接收的資訊使用XML資料格式、UTF8編碼,並以AES方式加密。
1.開啟回呼模式後要設(shè)定參數(shù)如下:
?
其中url是要存取的servlet,token和EncodingAESKey是隨機取得的,但要和專案中保持一致。
2.驗證URL的有效性
當(dāng)你提交以上資訊時,企業(yè)號將發(fā)送GET請求到填寫的URL上,GET請求攜帶四個參數(shù),企業(yè)在取得時需要做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(); } } }
工具類:
/** * 對公眾平臺發(fā)送給公眾賬號的消息加解密示例代碼. * * @copyright Copyright (c) 1998-2014 Tencent Inc. */ // ------------------------------------------------------------------------ /** * 針對org.apache.commons.codec.binary.Base64, * 需要導(dǎo)入架包commons-codec-1.9(或commons-codec-1.8等其他版本) * 官方下載地址:http://ipnx.cn/ */ 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>第三方回復(fù)加密消息給公眾平臺</li> * <li>第三方收到公眾平臺發(fā)送的消息,驗證消息的安全性,并對消息進(jìn)行解密。</li> * </ol> * 說明:異常java.security.InvalidKeyException:illegal Key Size的解決方案 * <ol> * <li>在官方網(wǎng)站下載JCE無限制權(quán)限策略文件(JDK7的下載地址: * http://ipnx.cn/;/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; /** * 構(gòu)造函數(shù) * @param token 公眾平臺上,開發(fā)者設(shè)置的token * @param encodingAesKey 公眾平臺上,開發(fā)者設(shè)置的EncodingAESKey * @param corpId 企業(yè)的corpid * * @throws AesException 執(zhí)行失敗,請查看該異常的錯誤碼和具體的錯誤信息 */ 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 + "="); } /** * 對密文進(jìn)行解密. * * @param text 需要解密的密文 * @return 解密得到的明文 * @throws AesException aes解密失敗 */ String decrypt(String text) throws AesException { byte[] original; try { // 設(shè)置解密模式為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對密文進(jìn)行解碼 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位隨機字符串,網(wǎng)絡(luò)字節(jié)序和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 簽名串,對應(yīng)URL參數(shù)的msg_signature * @param timeStamp 時間戳,對應(yīng)URL參數(shù)的timestamp * @param nonce 隨機串,對應(yīng)URL參數(shù)的nonce * @param echoStr 隨機串,對應(yīng)URL參數(shù)的echostr * * @return 解密之后的echostr * @throws AesException 執(zhí)行失敗,請查看該異常的錯誤碼和具體的錯誤信息 */ 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; } } /** * 對公眾平臺發(fā)送給公眾賬號的消息加解密示例代碼. * * @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 票據(jù) * @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); } }
三、總結(jié)
企業(yè)透過參數(shù)msg_signature對請求進(jìn)行校驗,若確認(rèn)此GET請求來自企業(yè)號,那麼企業(yè)應(yīng)用程式對echostr參數(shù)解密並原樣回傳echostr明文(不能加引號),則存取驗證生效,回呼模式才能開啟。開啟後一些功能會陸續(xù)實現(xiàn),敬請期待!
以上是詳解java微信企業(yè)號開發(fā)之開發(fā)模式的開啟步驟的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)