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明文(不克不及加引號),則接入驗證失效,回調形式能力開啟。開啟後一些功效會陸續完成,敬請等待!
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。