まず、WeChat Enterpriseアカウントの開発モードは、編集モード(通常モード)と開発モード(コールバックモード)に分割されます。編集モードでは、シンプルなカスタムメニューのみを作成し、メッセージを自動的に返信できます。他の機能を実現するには、開発者モードをオンにする必要があります。
1。メッセージを処理するための編集モードと開発モード
1.編集モードでは、すべてのビジネスプロセスがWeChatサーバーで構成され、それによって処理されます。
2。開発モード、メッセージはサードパーティサーバーを介して処理され、最後にメッセージがWeChatサーバーを介してユーザーに送信されます。
開発モードは編集モードよりも多くのメッセージを処理できます。そのため、最初に開発モードがより多くの機能を開発できるようにする必要があります。
2。開発モデルが開始されます
コールバックモードでは、エンタープライズはエンタープライズ番号インターフェイスを積極的に呼び出すだけでなく、ユーザーからメッセージやイベントを受信することもできます。受信した情報は、XMLデータ形式、UTF8でエンコードされ、AESで暗号化されます。
1.コールバックモードをオンにした後、パラメーターは次のように構成する必要があります。
URLはアクセスするサーブレットであり、トークンとエンコーディンスキーはランダムに取得されますが、プロジェクトと一致する必要があります。
2。URLの有効性を確認します
上記の情報を送信すると、エンタープライズ番号はFill-In URLにGETリクエストを送信します。 GETリクエストには4つのパラメーターが含まれます。企業は、それを取得するときにURLDECODE処理を行う必要があります。そうしないと、検証は成功しません。
3。コード
CoreServlet1クラス
パブリッククラスCoreServlet1はhttpservletを拡張します{private static final long serialversionuid = 4440739483644821986l; string stoken = "weixincourse"; string scorpid = "wxe510946434680dab"; string sencodingaeskey = "djlyzxgkiwresiw2vnv9dsr7hss7uswdfnwa8q1ove1"; 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"); string sverifynonce = request.getParameter( "nonce"); string 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.spec.spec.spec.setretyspec; org.apache.commons.codec.binary.base64;/***は、メッセージを受信してパブリックプラットフォームにプッシュするための暗号化と復号化インターフェイス(UTF8エンコード文字列)を提供します。 * <ol> * <li>パブリックプラットフォームへの暗号化されたメッセージへのサードパーティの返信</li> * <li>サードパーティは、メッセージのセキュリティを確認するためにパブリックプラットフォームによって送信されたメッセージを受信し、メッセージを復号化します。 </li> * </ol> *説明:例外java.security.invalidkeyexception:違法なキーサイズのソリューション * <ol> * <li>公式WebサイトにJCE Unlimited Permission Policyファイルをダウンロード(JDK7: * http://www.oracle.com/technetwork/javase/downloads/jce-7-download-432124.html </li> * <li>ダウンロード後、local_policy.jar、us_export_policy.jarとleadme.txt </ %jre_home%/lib/securityディレクトリで元のファイルを上書きする</li> * <li> JDKがインストールされている場合、2つのjarファイルを%jdk_home%/jre/lib/lib/securityディレクトリに配置して、元のファイルを上書きします</li> * </ol> */public class wxbizmsgcrit = charset {utic charsept "" ut charsept " Base64 base64()例外のエラー情報 */ public wxbizmsgcrypt(string token、string encodingaeskey、string corpid)はaesexception {if(encodingaeskey.length()!= 43){throw new aesexception(aesexception.illegalaeskey); } this.token = token; this.corpid = corpid; aeskey = base64.decodebase64(encodingaeskey + "="); } /*** ciphertextを復号化します。 ** @paramテキストdecryptedを必要とする暗号文をテキスト* @@return decryption* @throws aesexception aesは、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を使用して、ciphertext byte [] necrypted = base64.decodebase64(text)をデコードします。 // decrypt original = cipher.dofinal(暗号化); } catch(Exception e){e.printstacktrace();新しいaesexception(aesexception.decryptaeserror)を投げる; } string xmlcontent、from_corpid; try {//補数文字Byte [] bytes = pkcs7encoder.decode(original); //個別の16ビットのランダム文字列、ネットワークのエンディアンネス、およびcorPIDバイト[] network order = arrays.copyofrange(bytes、16、20); int xmllength = recovernetworkbytesorder(network order); 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();新しいaesexception(aesexception.illegalbuffer)を投げる; } // corpidが異なる場合(!from_corpid.equals(corpid)){throw new aesexception(aesexception.validatecorpiderror); } xmlContentを返します。 } /** * urlの検証 * @param msgsignature署名文字列、urlパラメーターに対応するsignature文字列 * @paramタイムスタンプタイムスタンプ、URLパラメータータイムスタンプに対応 * @param nonceランダム文字列に対応します。 aesexceptionの実行に失敗しました。例外のエラーコードと特定のエラー情報を確認してください */ public string verifyurl(string msgsignature、string timestamp、string nonce、string echostr)aeSexception {string signature = sha1.getsha1(token、タイムスタンプ、ノンセ、エコーストア); if(!signature.equals(msgsignature)){show new aesexception(aesexception.validatesignatureerror); }文字列result = decrypt(echostr);返品結果; }} /***パブリックプラットフォームによって公開アカウントに送信されたメッセージを暗号化および復号化するためのサンプルコード。 * * @copyright Copyright(c)1998-2014 Tencent Inc. * /// ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @Param Encrypt Ciphertext* @return Secure Signature* @Throws AESEXCEPTION*/ public Static String GetSha1(String Token、String Timestamp、String nonce、String ancrypt)throws {try {string [] array = new String [] {Token、Timestamp、nonce、nonce、encrypt}; stringbuffer sb = new StringBuffer(); //文字列sort array.sort(array); for(int i = 0; i <4; i ++){sb.append(array [i]); } string str = sb.toString(); // sha1署名生成メッセージMD = MESSAGEDGEST.GETINSTANCE( "SHA-1"); md.update(str.getBytes()); byte [] digest = 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(Exception e){e.printstacktrace();新しいaesexception(aesexception.computesignatureerror)を投げる; }}} class pkcs7encoder {static charset charset = charset.forname( "utf-8"); static int block_size = 32;/ ***復号化されたplantextの補数文字を削除** @param decrypted decrypted plantext* @return plantext*/ static byte [] decode [] decode(byte [] decrypted){int pad =(int decrypted.lengted.lengted.lengted.lengted.lengted.lengted. lughted.lengted. lughted.lengted. lughted. if(pad <1 || pad> 32){pad = 0; } return arrays.copyofrange(decrypted、0、decrypted.length -pad); }} 3。概要
エンタープライズは、パラメーターmsg_signatureを使用して要求を検証します。 GETリクエストがエンタープライズ番号からのものであることが確認された場合、エンタープライズアプリケーションはEchostrパラメーターを復号化し、Echostrプレーンテキストを返します(引用できません)、アクセス確認が有効になり、コールバックモードを有効にできます。オンになった後、いくつかの機能が次々と実装されるため、お楽しみに!
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。