Tout d'abord, le mode de développement des comptes d'entreprise WeChat est divisé en: mode d'édition (mode normal) et mode de développement (mode de rappel) . En mode d'édition, vous ne pouvez faire que des menus personnalisés simples et répondre automatiquement aux messages. Pour réaliser d'autres fonctions, vous devez activer le mode développeur.
1. Mode d'édition et mode de développement pour traiter les messages
1. En mode édition, tous les processus métier sont configurés sur le serveur WeChat et traités par celui-ci.
2. Mode de développement, les messages sont traités via des serveurs tiers et enfin des messages sont envoyés aux utilisateurs via des serveurs WeChat.
Le mode de développement peut traiter plus de messages que le mode d'édition, vous devez donc d'abord activer le mode de développement pour développer plus de fonctions.
2. Le modèle de développement est démarré
En mode rappel, les entreprises peuvent non seulement appeler activement l'interface du numéro d'entreprise, mais également recevoir des messages ou des événements des utilisateurs. Les informations reçues sont codées au format de données XML, UTF8, et chiffrées dans AES .
1. Après avoir activé le mode de rappel, les paramètres doivent être configurés comme suit:
L'URL est le servlet à accéder, et le jeton et l'encodingaeskey sont obtenus au hasard, mais doivent être cohérents avec le projet.
2. Vérifiez la validité de l'URL
Lorsque vous soumettez les informations ci-dessus, le numéro d'entreprise enverra une demande GET à l'URL remplie. La demande GET comporte quatre paramètres. L'entreprise doit effectuer un traitement URLDEcode lors de l'obtention , sinon la vérification ne réussira pas.
3. Code
Classe CoreServlet1
classe publique CoreServlet1 étend HttpServlet {private static final long SerialVersionUID = 4440739483644821986l; String stoken = "Weixincourse"; String scorpid = "WXE510946434680DAB"; String sencodingaeskey = "djlyzxgkiwresiw2vnv9dsr7hss7uswdfnwa8q1ove1"; public void doGet (demande httpservletRequest, réponse httpservletResponse) lève ServletException, ioException {wxBizmsGcCrypt wxcpt; essayez {wxcpt = new wxbizmsgcrypt (stoken, sencodingaeskey, scorpid); String sverifymsgsig = request.getParameter ("msg_signature"); String sverifytimestamp = request.getParameter ("horodat"); 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 = réponse.getWriter (); Out.print (SECHOSTR); out.close (); out = null; } catch (aesexception e1) {e1.printStackTrace (); }}} Outils:
/ ** * Exemple de code pour crypter et décrypter les messages envoyés aux comptes publics par les plateformes publiques. * * @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.scretkeyspec; org.apache.commons.codec.binary.base64; / ** * fournit une interface de chiffrement et de décryptage (chaîne codée UTF8) pour recevoir et pousser des messages vers la plate-forme publique. * <Le> * <li> Réponse tierce aux messages chiffrés à la plate-forme publique </li> * <li> Le tiers reçoit des messages envoyés par la plate-forme publique pour vérifier la sécurité des messages et décrypte les messages. </li> * </l> * Description: Exception java.security.invalidkeyException: solution à la taille de clé illégale * <L> * <li> Téléchargez le fichier de politique d'autorisation JCE illimitée sur le site officiel (l'adresse de téléchargement de JDK7: * http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html </li> * <li> Décompressez après téléchargement, vous pouvez voir local_policy.jar, us_export_policy.jar et readme.txt </li> * <li> % Jre_home% / lib / security répertoire pour écraser le fichier d'origine </li> * <li> Si jdk est installé, placez les deux fichiers de jar dans le% jdk_home% / jre / lib / security répertoire pour écraser le fichier d'origine </li> * </ ol> * / public class wxbizmsgcrypt {static charset charset = charset.forname ("utf-8") statique Charset Charset = Charset.forname ("") ")" statique Charset Charset = Charset.forname ("") ")" STATIC CHARSET CHARSET. Base64 Base64 = New Base64 (); et des informations d'erreur spécifiques de l'exception * / public wxBizmsGcrypt (token String, String Encodingaeskey, String Corpid) lève Aesexception {if (Encodingaeskey.length ()! = 43) {Throw New Aesexception (aeSexception.Lelegalaeskey); } this.token = token; this.corpid = corpid; aeskey = base64.decodeBase64 (EncodingaesKey + "="); } / ** * Décript le texte chiffré. * * @param texte Le texte chiffré qui doit être décrypté * @return le texte en clair obtenu par décryptage * @throws aesexception aes n'a pas réussi à décrypter * / string decrypt (texte de chaîne) lève Aesexception {octet [] original; essayez {// définissez le mode de décryptage sur AES Mode 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); // Utilisez Base64 pour décoder l'octet de texte chiffré [] crypté = base64.DECODEBASE64 (texte); // Decrypt Original = Cipher.Dofinal (crypté); } catch (exception e) {e.printStackTrace (); lancer une nouvelle aesexception (aesexception.Decryptaeserror); } String xmlContent, from_corpid; essayez {// supprimer le caractère complément byte [] bytes = pkcs7encoder.decode (original); // Séparent les chaînes aléatoires 16 bits, l'endienne du réseau et l'octet corpide [] NetworkOrder = Arrays.copyofrange (octets, 16, 20); int xmllEngth = RecoverNetWorkBytesOrder (NetworkOrder); xmlContent = new String (arrays.copyofrange (octets, 20, 20 + xmllEngth), charset); from_corpid = new String (arrays.copyofrange (bytes, 20 + xmllEngth, bytes.length), charset); } catch (exception e) {e.printStackTrace (); lancer une nouvelle aesexception (aesexception.Lelegalbuffer); } // cas où Corpid est différent if (! from_corpid.equals (corpid)) {lancer une nouvelle aesexception (aesexception.validatecorpiderror); } return xmlContent; } / ** * Vérifiez URL * @param msgsignature Signature String, correspondant aux paramètres d'URL MSG_SIGNATURE * @param Timestamp Timestamp, correspondant aux paramètres URL non * @param eChostr Random, correspondant à des paramètres d'URL * L'exécution aesexception a échoué, veuillez vérifier le code d'erreur et les informations d'erreur spécifiques de l'exception * / public String VerifyUrl (String msgSignature, String horodatamp, String Nonce, String eChostr) lève Aesexception {String Signature = Sha1.getSha1 (Token, horodatage, nonce, eChostr); if (! Signature.equals (msgSignature)) {lancer une nouvelle aesexception (aesexception.validateSignatureError); } String result = decrypt (eChostr); Résultat de retour; }} / ** * Exemple de code pour crypter et décrypter les messages envoyés aux comptes publics par des plateformes publiques. * * @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 Encrypt) lève aesexception {try {String [] array = new String [] {token, timestamp, nonce, Encrypt}; StringBuffer sb = new StringBuffer (); // String Trie Arrays.Sort (array); pour (int i = 0; i <4; i ++) {sb.append (array [i]); } String str = sb.toString (); // SHA1 Signature Generation MessagediGest MD = MessagediGest.getInstance ("Sha-1"); md.update (str.getBytes ()); octet [] 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 (); Jetez une nouvelle aesexception (aesexception.computeSignatureError); }}} classe pkcs7encoder {static charset charset = charset.forname ("utf-8"); static int block_size = 32; / ** * Supprimer le caractère complémentaire du texte en clair déchiffré * * @param a décrypté le texte en clair déchiffré * @return en clair après avoir supprimé le caractère de remplissage * / byte statique [] décode (byte [] decrypted) {int). if (pad <1 || pad> 32) {pad = 0; } return arrays.copyofrange (décrypté, 0, decrypted.length - pad); }} 3. Résumé
L'entreprise vérifie la demande via le paramètre msg_signature. S'il est confirmé que la demande GET provient du numéro d'entreprise, l'application d'entreprise décrypte le paramètre ECHOSTR et renvoie le texte en clair ECHOSTR tel qu'il est (cité ne peut pas être ajouté), alors la vérification d'accès prend effet et le mode de rappel peut être activé. Après avoir allumé, certaines fonctions seront implémentées les unes après les autres, alors restez à l'écoute!
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.