亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁 微信小程式 微信開發(fā) 詳解java微信企業(yè)號開發(fā)之開發(fā)模式的開啟步驟

詳解java微信企業(yè)號開發(fā)之開發(fā)模式的開啟步驟

Mar 15, 2017 pm 05:49 PM

這篇文章主要為大家詳細(xì)介紹了java微信企業(yè)號開發(fā)之開發(fā)模式的開啟方法,感興趣的小伙伴們可以參考一下

首先說微信企業(yè)號的開發(fā)模式分為: 編輯模式(普通模式)開發(fā)模式(回呼模式) ,在編輯模式下,只能做簡單的自訂選單和自動回覆訊息,要實現(xiàn)其他功能還得開啟開發(fā)者模式。

一、編輯模式與開發(fā)模式對訊息的處理流程

?1.編輯模式下,所有的業(yè)務(wù)流程都配置在微信伺服器上,由它處理

? 詳解java微信企業(yè)號開發(fā)之開發(fā)模式的開啟步驟

2.開發(fā)模式,訊息透過第三方伺服器處理,最後經(jīng)過微信伺服器把訊息傳送給使用者

? 詳解java微信企業(yè)號開發(fā)之開發(fā)模式的開啟步驟

開發(fā)模式能處理的訊息比編輯模式多,所以要先開啟開發(fā)模式才能開發(fā)更多功能。

二、開發(fā)模式的開啟

???? 在回呼模式下,企業(yè)不僅可以主動呼叫企業(yè)號介面,還能接收使用者的訊息或事件。 接收的資訊使用XML資料格式、UTF8編碼,並以AES方式加密。

1.開啟回呼模式後要設(shè)定參數(shù)如下:

? 詳解java微信企業(yè)號開發(fā)之開發(fā)模式的開啟步驟

其中url是要存取的servlet,token和EncodingAESKey是隨機取得的,但要和專案中保持一致。

2.驗證URL的有效性

當(dāng)你提交以上資訊時,企業(yè)號將發(fā)送GET請求到填寫的URL上,GET請求攜帶四個參數(shù),企業(yè)在取得時需要做urldecode處理,否則會驗證不成功。

詳解java微信企業(yè)號開發(fā)之開發(fā)模式的開啟步驟

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)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72