우선, WeChat 엔터프라이즈 계정의 개발 모드는 편집 모드 (일반 모드) 및 개발 모드 (콜백 모드) 로 나뉩니다. 편집 모드에서는 간단한 사용자 정의 메뉴 만 만들고 메시지를 자동으로 회신 할 수 있습니다. 다른 기능을 실현하려면 개발자 모드를 켜야합니다.
1. 메시지를 처리하기위한 편집 모드 및 개발 모드
1. 편집 모드에서 모든 비즈니스 프로세스는 WeChat 서버에서 구성되고 이에 의해 처리됩니다.
2. 개발 모드, 메시지는 타사 서버를 통해 처리되며 마지막으로 메시지는 WeChat 서버를 통해 사용자에게 전송됩니다.
개발 모드는 편집 모드보다 더 많은 메시지를 처리 할 수 있으므로 먼저 개발 모드가 더 많은 기능을 개발할 수 있도록해야합니다.
2. 개발 모델이 시작되었습니다
콜백 모드에서 기업은 엔터프라이즈 번호 인터페이스를 적극적으로 호출 할뿐만 아니라 사용자로부터 메시지 나 이벤트를 수신 할 수 있습니다. 수신 된 정보는 XML 데이터 형식 인 UTF8로 인코딩되고 AES로 암호화됩니다 .
1. 콜백 모드를 켜면 매개 변수를 다음과 같이 구성해야합니다.
URL은 액세스 할 서블릿이며 토큰 및 인코딩 키키가 무작위로 얻어 지지만 프로젝트와 일치해야합니다.
2. URL의 유효성을 확인하십시오
위의 정보를 제출하면 엔터프라이즈 번호는 채워진 URL에 GET 요청을 보냅니다. GET 요청에는 4 개의 매개 변수가 전달됩니다. 엔터프라이즈는 획득 할 때 URLDECODE 처리를 수행해야합니다 . 그렇지 않으면 검증이 성공하지 못합니다.
3. 코드
Coreservlet1 클래스
Public Class Coreservlet1은 httpservlet {private static final long serialversionuid = 4440739483644821986L; 문자열 stoken = "weixincourse"; 문자열 scorpid = "wxe510946434680dab"; 문자열 sencodingaeskey = "djlyzxgkiwresiw2vnv9dsr7hssssssswdfnwa8q1ove1"; public void doget (httpservletrequest request, httpservletresponse 응답)은 servletexception, ioexception {wxbizmsgcrypt wxcpt; try {wxcpt = new wxbizmsgcrypt (stoken, sencodingaeskey, scorpid); String sverifymsgsig = request.getParameter ( "msg_signature"); 문자열 sverifytimestamp = request.getParameter ( "timestamp"); 문자열 sverifynonce = request.getParameter ( "nonce"); 문자열 sverifyechostr = request.getParameter ( "echostr"); 문자열 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. * /// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 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.specretkeyspec; org.apache.commons.codec.binary.base64;/*** 메시지를 공개 플랫폼으로 수신하고 푸시하기위한 암호화 및 암호 해독 인터페이스 (UTF8 인코딩 된 문자열)를 제공합니다. * <ol> * <li> 타사 공개 메시지에 대한 암호화 메시지에 대한 회신 </li> * <li> 제 3자는 메시지의 보안을 확인하고 메시지를 해독하기 위해 공개 플랫폼에서 보낸 메시지를받습니다. </li> * </ol> * 설명 : 예외 java.security.invalidkeyException : 불법 키 크기에 대한 솔루션 * <ol> * <li> 공식 웹 사이트에서 JCE 무제한 권한 정책 파일을 다운로드하십시오 (JDK7의 다운로드 주소 : * http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html </li> * <li> 다운로드 후 decompress, local_policy.jar, us_export_policy.jar 및 readme.txt를 볼 수 있습니다. %jre_home %/lib/security 디렉토리 원본 파일을 덮어 쓴다 </li> * <li> JDK가 설치된 경우 2 개의 JAR 파일을 %jdk_home %/jre/lib/security 디렉토리에 배치하여 원본 파일을 덮어 씁니다 </ol> */public class wxbizmsgcrypt {charset. ") Base64 = Byte Keke; 예외의 특정 오류 정보 */ public wxbizmsgcrypt (문자열 토큰, String encodingaeskey, String corpid)는 aesexception {if (encodingaeskey.length ()! = 43) {Throw new aesexception (aesexception.illegalaeskey); } this.token = 토큰; this.corpid = corpid; aeskey = base64.decodebase64 (encodingaeskey + "="); } /*** 암호 텍스트를 해독합니다. ** @param 텍스트 암호 해독 해야하는 암호 텍스트* @return 암호 해독에 의해 얻은 평원 텍스트* @throws aesexception aes*/ String decrypt (문자열 텍스트)는 aesexception {byte [] original; {// 암호 해독 모드를 AES CBC 모드로 설정하십시오 Cipher Cipher = Cipher.getInstance ( "AES/CBC/NOPADDING"); SecretKeyspec key_spec = 새로운 SecretKeyspec (Aeskey, "aes"); ivparameterspec iv = 새로운 ivparameterspec (arrays.copyofrange (Aeskey, 0, 16)); cipher.init (cipher.decrypt_mode, key_spec, iv); // base64를 사용하여 암호 텍스트 바이트를 디코딩하여 [] 암호화 = base64.decodebase64 (텍스트); // 원본을 해독합니다 = cipher.dofinal (암호화); } catch (예외 e) {e.printstacktrace (); 새로운 aesexception을 던지십시오 (aesexception.decryptaeserror); } 문자열 xmlContent, from_corpid; {// 보완 문자 byte [] bytes = pkcs7encoder.decode (Original)를 제거하십시오. // 16 비트 임의의 문자열, 네트워크 엔지니어 및 시체 바이트 [] NetworkOrder = arrays.copyofrange (Bytes, 16, 20); int xmllength = RecovernetWorkByTesOrder (NetworkOrder); xmlContent = 새 String (arrays.copyofrange (바이트, 20, 20 + xmllength), 숯); from_corpid = new String (arrays.copyofrange (바이트, 20 + xmllength, bytes.length), charset); } catch (예외 e) {e.printstacktrace (); 새로운 aesexception (aesexception.ilegalbuffer)을 던지십시오. } // corpid가 다른 경우 (! from_corpid.equals (corpid)) {throw new aesexception (aesexception.validatecorpiderror); } XMLContent를 반환합니다. } /** * URL 확인 * @param msgsignature signature string, URL 매개 변수에 해당하는 URL 매개 변수 * @param timestamp timestamp에 해당합니다. URL 매개 변수에 해당하는 timestamp * @param nonce random string, url 매개 변수에 해당합니다. @throws aesexception 실행 실패, 예외의 오류 코드 및 특정 오류 정보를 확인하십시오 */ public String verifyUrl (문자열 msgsignature, String timestamp, string nonce, string echostr) aesexception {String signature = sha1.getsha1 (Token, timestamp, nonce, echostr); if (! signature.equals (msgsignature)) {throw new aesexception (aesexception.validatesignatureRor); } 문자열 result = decrypt (echostr); 반환 결과; }} /*** 공개 플랫폼에서 공개 계정으로 전송되는 메시지 암호화 및 해독을위한 샘플 코드. * * @Copyright Copyright (C) 1998-2014 Tencent Inc. * /// ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @param 암호화 ciphertext* @return 보안 서명* @throws aesexception*/ public static string getsha1 (문자열 토큰, 문자열 timestamp, string nonce, string encrypt) aesexception {try {string [] array = new String [] {token, timestamp, nonce, encrypt}; StringBuffer sb = new StringBuffer (); // String Sort Array.Sort (Array); for (int i = 0; i <4; i ++) {sb.append (배열 [i]); } 문자열 str = sb.tostring (); // SHA1 서명 생성 MessageDigest MD = MessageDigest.getInstance ( "SHA-1"); md.update (str.getBytes ()); 바이트 [] 다이제스트 = md.digest (); StringBuffer hexstr = new StringBuffer (); 문자열 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 (예외 e) {e.printstacktrace (); 새로운 aesexception (aesexception.computesignatureRor)을 던지십시오. }}} 클래스 pkcs7encoder {static charset charset = charset.forname ( "utf-8"); static int block_size = 32;/ *** 해독 된 일반 텍스트의 보완 문자를 삭제합니다* @param은 해독 된 일반 텍스트* @return plaintext를 삭제 한 후*/ static byte [] decode [] {int) decryped [int) decrypted [decrypted -1]; if (pad <1 || pad> 32) {pad = 0; } return arrays.copyOfRange (해독 된, 0, 해독 된 -Length -PAD); }} 3. 요약
엔터프라이즈는 매개 변수 msg_signature를 통해 요청을 확인합니다. GET 요청이 엔터프라이즈 번호로부터 확인되면 엔터프라이즈 애플리케이션은 eCHOSTR 매개 변수를 해독하고 ECHOSTR 일반 텍스트를 추가로 반환하면 (인용 할 수 없음) 액세스 확인이 적용되고 콜백 모드를 활성화 할 수 있습니다. 켜진 후 일부 기능은 차례로 구현되므로 계속 지켜봐 주시기 바랍니다!
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.