1. Cartographie intranet
Étant donné que l'URL du mode de rappel de compte WeChat Enterprise prend en charge l'accès au nom de domaine, il est estimé que vous devez enregistrer une coquille d'arachide et faire une pénétration intranet (il en coûte 16 yuans pour acheter une version gratuite, et que vous ne pouvez ajouter le nom de domaine que le lendemain après l'acheter)
2. Compte d'entreprise WeChat
Enregistrez un compte WeChat Enterprise: https://qy.weixin.qq.com/ (sélectionnez une équipe, l'équipe n'a pas besoin de certification)
Contacts: Créez une nouvelle organisation -> Suivez les membres
Compte d'entreprise -> Centre d'application -> Nouvelle application -> Message Application -> Sélection de mode (Mode de rappel) -> Allumez le transfert de message WeChat,
Mode de rappel Description: http://qydev.weixin.qq.com/wiki/index.php?title=%E5%9B%9E%E8%B0%83%E6%A8%A1%E5%BC%8F
Code de cryptage et de décryptage du mode de rappel: http://qydev.weixin.qq.com/wiki/index.php?title=%E5%8A%A0%E8%A7%A3%E5 % AF% 86% E5% BA% 93% E4% B8% 8B% E8% BD% BD% E4% B8% 8E% E8% BF% 94% E5% 9B% 9E% E7% A0% 81
Comme le montre la figure 1:
Menu personnalisé: le chemin de demande de l'application de développement est illustré à la figure 2:
Paramètres -> Paramètres de la fonction -> Gestion de l'autorisation -> Nouveau groupe de gestion -> Autorisations d'application (Secret)
3. Utilisez le maillot pour développer des services de services Web
3.1 Définir le jeton en classe, mot de passe aléatoire 43 chiffres, Company Corpid, secret
3.2 Méthode de vérification
/ * * ----------------------------- × tamp * = 1409659589 & nonce = 263014780 & eChostr = p9nazczydtyTweshep1vc5x9xho% * 2fqyx3zpb4yka9skld1dsh3iyt3tp3zndtp% 2b4rpcs8tgae7oabo% 2bfzxqqqqqqqqqQ * Http / 1.1 hôte: qy.weixin.qq.com * * Lors de la réception de cette demande, l'entreprise devrait * 1. Analyser les paramètres de la demande GET, y compris la signature du corps du message (MSG_SIGNATURE), l'horodatage (TimeStamp), la chaîne de numéros aléatoires (non -ce *) et la chaîne Random Encryted (echostr) poussée par la plate-forme publique. Faites attention au décodage de l'URL à cette étape. 2. Vérifiez l'exactitude de la signature du corps du message 3. * Décrypter le texte d'Echostr d'origine, traiter le texte d'origine comme la réponse de la demande GET et le rendre à la plate-forme publique. L'étape 2. 3 peut être implémentée à l'aide de la fonction de bibliothèque Verifyurl fournie par la plate-forme publique. * / / ** * URL de rappel, WeChat appelle cette méthode de vérification * * @return * / @get @Path ("Station") Public String Verify () {String msgSignature = request.getParameter ("msg_signature"); String TimeStamp = request.getParameter ("Timestamp"); String nonce = request.getParameter ("nonce"); System.out.println (horodat + "" + nonce); String echoStr = request.getParameter ("eChostr"); String sechoStr = null; essayez {sechoStr = wxcpt.verifyUrl (msgsignature, horodatamp, nonce, echostr); } catch (exception e) {e.printStackTrace (); // URL de vérification a échoué, veuillez consulter l'exception pour la raison d'erreur} return sechostr; }3.3 Recevez des informations utilisateur et décryptez-les
/ * * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- * <Tousername> <! [CDATA [WX5823BF96D3BD56C7]]> </ Tausername *> <crypt> <! [CDATA [RYPEVHKD8QQKFHVQ6QLEEB4J58TIPDVO * + RTK1I9QCA6AM / WVQNLSV5ZEPEUSUIX5L5X / 0LWFRF0QADHHHGD3QCZCDCUPJ911L3VG3W / * SyyVUJTS3TUUKSIXXACCAC + 6K4asknmpj48Kzjs8qljvd4xgpue06DodnlxAUHZM6 * + KDZ + HMZFJYUR + LTWGC2HGF5GSIJFF0EKUNXZIQATP7PF5MZXZIR + 3IQH03V + BCA9NMELNQBSF6TIWSRXJB3LAVGUCALLCRW8V2T9EL4EHZJWRQUAX5WLVMNS0 * + RUPA3K22NCX4XZZS9O0MBH27BO6BPNELZPS * + / uh9ksnly6bhcmju9p8g7m3fvkn28h3kdya5pl * / t8z1ptdave0lxdq2yoyyh2uypighbzzis2pdbs8r07 + qn + e7q ==]]> </ Encrypt> * <agelid> <! [CDATA [218]]> </ AgentID> Enterprise reçoit la demande de poste, elle devrait * 1. Panne les paramètres de l'URL, y compris la signature du corps du message (MSG_SIGNATURE), l'horodatage (horodatage) et la chaîne de numéros aléatoire (nonce) * 2. Vérifiez l'exactitude de la signature du corps du message. * 3. Les données de la publication sont analysées par XML et décryptent le contenu de la balise <crypt>. Le texte brut décrypté est le texte brut du message de réponse de l'utilisateur. Veuillez vous référer au document officiel pour le format de texte brut * Les étapes 2 et 3 peuvent être implémentées à l'aide de la fonction de bibliothèque decryptmsg fournie par la plate-forme publique. * / @Post @Path ("Station") public String ReceiveMsg (String reqdata) {String msgSignature = request.getParameter ("msg_signature"); String TimeStamp = request.getParameter ("Timestamp"); String nonce = request.getParameter ("nonce"); // Données de chiffre d'affaires demandées par post // String sreqdata = // "<xml> <Tousername> <! [CDATA [WX5823BF96D3BD56C7]]> </ Tuername> <crypt> <! [CD ATA [RYPEVHKD8QQKFHVQ6QLEEB4J58TIPDVO + RTK1I9QCA6AM / WVQNLSV5ZEUSUIX5L5X / 0LWF RF0QADHHHGD3QCZCDCUPJ911L3VG3W / SYYVUJTS3TUUKSUXXACCAS0QHXCHRRYT66WISPGLYL42A M6A8DTT + 6K4asknmpj48kzjs8qljvd4xgpue06dodnlxauhzm6 + kdz + hmzfjyur + ltwgc2hgf5gs ijff0ekunxziqatp7pf5mzxz3izoun1s4zg4lumnvw2r + kqckiw + 3iqh03v + bca9nmelnqbsf6t iwsrxjb3lavGucallcrw8v2t9el4ehzjwrquax5wlvmns0 + rupa3k22ncx4xxzs9o0mbh27bo6bp Nelzps + / uh9ksnly6bhcmJU9p8g7m3fvkn28h3Kdya5pl / t8z1ptdave0lxdq2yoyyh2uypighbzzis2pdbs8r07 + qn + e7q ==]]> </ Encrypt> <agentid> <! CDATA [218]]> </ Encrypt> try {String smsg = wxcpt.decryptmsg (msgsignature, horodatamp, nonce, reqdata); // analyse le contenu de la balise XML en clair pour le traitement de documentBuilderFactory dbf = documentBuilderFactory.newInstance (); DocumentBuilder db = dbf.newDocumentBuilder (); StringReader sr = new StringReader (smsg); ENTROWSOURCE IS = NOUVEAU INPUTSOURCE (SR); Document document = db.parse (IS); Élément root = document.getDocumentElement (); NodeList nodelist1 = root.getElementsByTagName ("Content"); if (nodelist1.item (0) == null) renvoie "ok"; String Content = nodeList1.item (0) .getTextContent (); System.out.println ("Contenu:" + Contenu); } catch (exception e) {e.printStackTrace (); // Le décryptage a échoué, veuillez vérifier l'exception pour l'échec} return "ok"; }3.4 Envoyez des informations à WeChat
Paramètres -> Paramètres de fonction -> Gestion de l'autorisation -> Créer un nouveau groupe de gestion; Se secret
/ ** * Cette méthode peut envoyer des messages de tout type * * @param msgType * texte | image | voix | vidéo | fichier | actualités * @param Touser * Liste d'identification des membres (les destinataires de messages, plusieurs destinataires sont séparés par '|', et jusqu'à 1 000 sont pris en charge). Cas spécial: spécifié en tant que @all, * Enverra * @param topy * Liste d'identification du département à tous les membres qui suivent la demande d'entreprise. Plusieurs destinataires sont séparés par «|» et jusqu'à 100 sont pris en charge. Ignorez ce paramètre lorsque Tlouser est @all * @param totag * Liste d'ID de balise, plusieurs destinataires sont séparés par '|'. Ignorez ce paramètre lorsque Touser est @ all * @param contenu * Lorsque msgType = texte, contenu du message texte * @param mediaId * Lorsque msgType = image | voix | vidéo, id d'information du message correspondant (-------) * @param titre * Lorsque msgType = new @param picurl * Lorsque msgType = news, chemin d'image * @param sa sécurité * indique s'il s'agit d'un message confidentiel, 0 indique non, 1 indique oui, par défaut 0 * / public void sendwechatmsg (String msgtype, string tousser, string topy, string totag, string Content, string mediaId, String Description, String url, string picurl, String Safe) {url Url; String Access_token = getAccessToken (); // string request String String Action = create_session_url + access_token; // Encapsule Envoyer la demande de message JSON StringBuffer SB = new StringBuffer (); sb.append ("{"); SB.APPEND ("/" Tauser / ":" + "/" "+ Tauser +" / ","); sb.append ("/" toparty / ":" + "/" "+ toparty +" / ","); sb.append ("/" totag / ":" + "/" "+ totag +" / ","); if (msgType.equals ("text")) {sb.append ("/" msgtype / ":" + "/" "+ msgtype +" / ","); sb.append ("/" text / ":" + "{"); SB.APPEND ("/" Content / ":" + "/" "+ Content +" / ""); sb.append ("}"); } else if (msgType.equals ("image")) {sb.append ("/" msgtype / ":" + "/" "+ msgtype +" / ","); sb.append ("/" image / ":" + "{"); sb.append ("/" media_id / ":" + "/" "+ mediaId +" / ""); sb.append ("}"); } else if (msgType.equals ("Voice")) {sb.append ("/" msgType / ":" + "/" "+ msgtype +" / ","); SB.APPEND ("/" Voice / ":" + "{"); sb.append ("/" media_id / ":" + "/" "+ mediaId +" / ""); sb.append ("}"); } else if (msgType.equals ("vidéo")) {sb.append ("/" msgType / ":" + "/" "+ msgtype +" / ","); SB.APPEND ("/" VIDEO / ":" + "{"); sb.append ("/" media_id / ":" + "/" "+ mediaId +" / ","); sb.append ("/" title / ":" + "/" "+ title +" / ","); SB.APPEND ("/" Description / ":" + "/" "+ Description +" / ""); sb.append ("}"); } else if (msgtype.equals ("file")) {sb.append ("/" msgtype / ":" + "/" "+ msgtype +" / ","); sb.append ("/" file / ":" + "{"); sb.append ("/" media_id / ":" + "/" "+ mediaId +" / ""); sb.append ("}"); } else if (msgType.equals ("news")) {sb.append ("/" msgType / ":" + "/" "+ msgtype +" / ","); sb.append ("/" news / ":" + "{"); SB.APPEND ("/" Articles / ":" + "["); sb.append ("{"); sb.append ("/" title / ":" + "/" "+ title +" / ","); SB.APPEND ("/" Description / ":" + "/" "+ Description +" / ","); sb.append ("/" url / ":" + "/" "+ url +" / ","); sb.append ("/" picurl / ":" + "/" "+ picurl +" / ""); sb.append ("}"); SB.APPEND ("]"); sb.append ("}"); } SB.APPEND (", /" Safe / ":" + "/" "+ Safe +" / ","); SB.APPEND ("/" AgentID / ":" + "/" "+ 1 +" / ","); sb.append ("/" debug / ":" + "/" "+" 1 "+" / ""); sb.append ("}"); String JSON = SB.TOSTRING (); essayez {url = new URL (action); HttpSurlConnection http = (httpSurlConnection) url.openconnection (); http.setRequestMethod ("post"); http.setRequestProperty ("contenu-type", "application / json; charset = utf-8"); http.setDoOutput (true); http.setDoInput (true); System.SetProperty ("Sun.net.client.defaultConnectTimeout", "30000"); // // Connection Timeout 30 Seconds System.SetProperty ("Sun.net.client.defaulTreadTimeout", "30000"); // // Read Timeout 30 secondes http.connect (); OutputStream os = http.getOutputStream (); OS.Write (JSON.GetBytes ("UTF-8")); // passe dans le paramètre inputStream est = http.getInputStream (); int size = is.Available (); octet [] jsonBytes = nouveau octet [taille]; is.read (jsonbytes); String result = new String (jsonBytes, "utf-8"); System.out.println ("Renvoie la demande Résultat:" + Résultat); os.flush (); os.close (); } catch (exception e) {e.printStackTrace (); }} // Obtenez le code d'accès d'interface public String GetAccessToken () {httpClient client = new httpClient (); PostMethod Post = new PostMethod (Access_token_url); post.releaseconnection (); post.SetRequestHeader ("Content-Type", "Application / X-Www-Form-Urlencoded; charSet = UTF-8"); NameValuepair [] param = {new nameValuepair ("corpid", corpid), new nameValuepair ("corpsecret", secret)}; // définir la politique pour empêcher les erreurs de cookie d'être signalées defaulthttpparams.getDefaultParams (). SetParameter ("http.protocol.cookie-policy", cookiepolicy.browser_compatibilité); // Définir les paramètres pour le post post Post Post.SetRequestbody (param); Résultat de chaîne = ""; essayez {client.executeMethod (post); result = new String (post.getResponseBodyAsstring (). GetBytes ("gbk")); } catch (ioException e) {e.printStackTrace (); } // Convertir les données en JSON JSONObject JasonObject; jasonObject = jsonObject.FromObject (result); result = (string) jasonObject.get ("Access_token"); post.releaseconnection (); System.out.println (résultat); Résultat de retour; } public static void main (String [] args) {StationResource WeChat = new StationResource (); // wechat.sendwechatmsgtext ("@ all", "2", "", "notification du centre d'information", "0"); wechat.sendwechatmsg ("news", "@all", "", "", "test Senmsg", "", "testé", "vraiment testé", "http://www.baidu.com", "http://file27.mafengwo.net/m00/b2/12/wkgb6lo0ahwamhl8aav1ybfjdjw20.jpeg", "0"); }4. Le développement est terminé. Cette classe doit être ajoutée pour reposer dans webx.xml pour gérer
<! - Support Restful -> <! - Service WebSerivce. Si un service est ajouté, le chemin du package du service doit être ajouté à la valeur param-valeur -> <Servlet> <Serplet-Name> Jax-Rs REST SERVLET </ Servlet-Name> <Servlet-Class> com.sun.jersey.spi.container.servlet.servletContainer </ servlet-Class> <Init-Param> <param-name> com.sun.jersey.config.property.packages </ param-name> <param-valeur> com.base.pf.restful </ param-value> </ init-paam> <ony-startup> 2 </ load-on-startup> </ servlet> <servlet> <Serplet-Name> jax-rs rassorplet </ servlet-name> <url-sattern> / rest / * </ url-stern> </ servlet-mapping>
5. Code complet terminé
package com.base.pf.restful; Importer java.io.ioException; import java.io.inputStream; import java.io.outputStream; import java.io.stringReader; Importer java.net.url; Importer javax.net.ssl.httpsurlconnection; Importer javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; Importer javax.ws.rs.get; import javax.ws.rs.post; Importer Javax.ws.rs.path; import javax.ws.rs.core.context; Importer javax.xml.parsers.DocumentBuilder; Importer javax.xml.parsers.DocumentBuilderFactory; importer net.sf.json.jsonObject; import org.apache.commons.httpclient.httpclient; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.cookiepolicy; import org.apache.commons.httpclient.methods.postMethod; import org.apache.commons.httpclient.params.defaulthttpparams; import org.w3c.dom.Document; import org.w3c.dom.element; import org.w3c.dom.nodelist; import org.xml.sax.inputsource; import com.qq.weixin.mp.aes.aesexception; import com.qq.weixin.mp.aes.wxbizmsgcrypt; / ** * WECHAT ENTERPRISE Compte Development * * @Author Zhen.l * * / @Path ("WX") Classe publique StationResource {// http://hichinamobile.nexinp.net/security/rest/wx // https://qy.weixin.qq.com private token token = "Spm";; // Enterprise Number-> Application Center-> Nouveau application-> Message-Type Application Private String AgentID = "1"; // Enterprise Number-> Centre d'application-> Cliquez sur l'application-> ID d'application ID Private String Encodingaeskey = "NT6ZWTVFLYNXOHFOGGOZWDJPAGEFSV8LN5CNEYW7MWL"; // Enterprise Number-> Application Center-> Nouveau application-> Message-Type Application Private String corpid = "WXE49318EB604CF00B"; // Enterprise Number-> Settings-> Enterprise Number Information-> Compte Information Private String Secret = "M-YFKMGL_KXBVETGINZH3RQWBZ4XB6MFEQXXLK77MKPXZENFDYQ-UGERXDUF8REL"; // Enterprise Number-> Paramètres-> Paramètres fonctionnels-> Gestion de l'autorisation @Context httpServLetRequest Request; @Context HttpServletResponse Response; WxBizmsgCrypt wxcpt = null; Public StationResource () {try {wxcpt = new wxbizmsgcrypt (token, Encodingaeskey, corpid); } catch (aesexception e) {e.printStackTrace (); }} // Obtenir un code d'accès URL privé final Static String Access_Token_Url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"; // Créer une chaîne statique finale de demande de session URL privée create_session_url = "https://qyapi.weixin.qq.com/cgi-bin/mesage/send?access_token="; // Obtenez le code d'accès d'interface public String GetAccessToken () {httpClient client = new httpClient (); PostMethod Post = new PostMethod (Access_token_url); post.releaseconnection (); post.SetRequestHeader ("Content-Type", "Application / X-Www-Form-Urlencoded; charSet = UTF-8"); NameValuepair [] param = {new nameValuepair ("corpid", corpid), new nameValuepair ("corpsecret", secret)}; // définir la politique pour empêcher les erreurs de cookie d'être signalées defaulthttpparams.getDefaultParams (). SetParameter ("http.protocol.cookie-policy", cookiepolicy.browser_compatibilité); // Définir les paramètres pour le post post post.SetRequestbody (param); Résultat de chaîne = ""; essayez {client.executeMethod (post); result = new String (post.getResponseBodyAsstring (). GetBytes ("gbk")); } catch (ioException e) {e.printStackTrace (); } // Convertir les données en JSON JSONObject JasonObject; jasonObject = jsonObject.FromObject (result); result = (string) jasonObject.get ("Access_token"); post.releaseconnection (); System.out.println (résultat); Résultat de retour; } / * * ----------------------------- / cgi-bin / wxpush? msg_signature = 5c45ff5e21c57e6ad56bac8758b79b1d9ac89fd3 * × tamp * = 1409659589 & nonce = 263014780 & eChostr = p9NazczydtyTweshep1vc5x9xho% * 2fqyx3zpb4yka9skld1dsh3iyt3tp3zndtp% 2b4rpcs8tgae7oabo% 2bfzxvnaqq% 3d% 3d * http / 1.1 hôte: qy.weixin.qq.com * * Lors de la réception de cette demande, la signature de l'entreprise devrait * 1. (MSG_SIGNATURE), horodatage (horodatage) et chaîne de nombres aléatoires (NONCE *) et chaînes chiffrées aléatoires (Echostr) poussées par la plate-forme publique. Faites attention au décodage de l'URL à cette étape. 2. Vérifiez l'exactitude de la signature du corps du message 3. * Décrypter le texte d'Echostr d'origine, traiter le texte d'origine comme la réponse de la demande GET et le rendre à la plate-forme publique. L'étape 2. 3 peut être implémentée à l'aide de la fonction de bibliothèque Verifyurl fournie par la plate-forme publique. * / / ** * URL de rappel, WeChat appelle cette méthode de vérification * * @return * / @get @Path ("Station") Public String Verify () {String msgSignature = request.getParameter ("msg_signature"); String TimeStamp = request.getParameter ("Timestamp"); String nonce = request.getParameter ("nonce"); System.out.println (horodat + "" + nonce); String echoStr = request.getParameter ("eChostr"); String sechoStr = null; essayez {sechoStr = wxcpt.verifyUrl (msgsignature, horodatamp, nonce, echostr); } catch (exception e) {e.printStackTrace (); // Vérifiez que l'URL a échoué, veuillez vérifier l'exception pour la raison d'erreur} return sechostr; } / * * --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- msg_signature = 477715d11cdb4164915debcba66cb864d751f3e6 * × tamp = 1409659813 & nonce = 1372623149 http / 1.1 hôte: qy.weixin.qq.com * <Tousername> <! [Cdata [wx5823bf96d3bd56c7]]> </ tousname *> <crypt> <! [Cdata [Rypevhkd8qqkfhvq6qleeb4j58Tipdvo * + RTK1I9QCA6AM / WVQNLSV5ZEPEUSUIX5L5X / 0LWFRF0QADHHHGD3QCZCDCUPJ911L3VG3W / * SyyVUJTS3TUUKSIXXACCAC + 6K4asknmpj48Kzjs8qljvd4xgpue06DodnlxAUHZM6 * + KDZ + HMZFJYUR + LTWGC2HGF5GSIJFF0EKUNXZIQATP7PF5MZXZIR + 3IQH03V + BCA9NMELNQBSF6TIWSRXJB3LAVGUCALLCRW8V2T9EL4EHZJWRQUAX5WLVMNS0 * + RUPA3K22NCX4XZZS9O0MBH27BO6BPNELZPS * + / uh9ksnly6bhcmju9p8g7m3fvkn28h3kdya5pl * / t8z1ptdave0lxdq2yoyyh2uypighbzzis2pdbs8r07 + qn + e7q ==]]> </ Encrypt> * <agelid> <! [CDATA [218]]> </ AgentID> Enterprise reçoit la demande de poste, elle devrait * 1. Panne les paramètres de l'URL, y compris la signature du corps du message (MSG_SIGNATURE), l'horodatage (horodatage) et la chaîne de numéros aléatoire (nonce) * 2. Vérifiez l'exactitude de la signature du corps du message. * 3. Les données de la publication sont analysées par XML et décryptent le contenu de la balise <crypt>. Le texte brut décrypté est le texte brut du message de réponse de l'utilisateur. Veuillez vous référer au document officiel pour le format de texte brut * Les étapes 2 et 3 peuvent être implémentées à l'aide de la fonction de bibliothèque decryptmsg fournie par la plate-forme publique. * / @Post @Path ("Station") public String ReceiveMsg (String reqdata) {String msgSignature = request.getParameter ("msg_signature"); String TimeStamp = request.getParameter ("Timestamp"); String nonce = request.getParameter ("nonce"); // Données de chiffre d'affaires demandées par post // String sreqdata = // "<xml> <Tousername> <! [CDATA [WX5823BF96D3BD56C7]]> </ Tuername> <crypt> <! [CD ATA [RYPEVHKD8QQKFHVQ6QLEEB4J58TIPDVO + RTK1I9QCA6AM / WVQNLSV5ZEUSUIX5L5X / 0LWF RF0QADHHHGD3QCZCDCUPJ911L3VG3W / SYYVUJTS3TUUKSUXXACCAS0QHXCHRRYT66WISPGLYL42A M6A8DTT + 6K4asknmpj48kzjs8qljvd4xgpue06dodnlxauhzm6 + kdz + hmzfjyur + ltwgc2hgf5gs ijff0ekunxziqatp7pf5mzxz3izoun1s4zg4lumnvw2r + kqckiw + 3iqh03v + bca9nmelnqbsf6t iwsrxjb3lavGucallcrw8v2t9el4ehzjwrquax5wlvmns0 + rupa3k22ncx4xxzs9o0mbh27bo6bp Nelzps + / uh9ksnly6bhcmJU9p8g7m3fvkn28h3Kdya5pl / t8z1ptdave0lxdq2yoyyh2uypighbzzis2pdbs8r07 + qn + e7q ==]]> </ Encrypt> <agentid> <! CDATA [218]]> </ Encrypt> try {String smsg = wxcpt.decryptmsg (msgsignature, horodatamp, nonce, reqdata); // analyse le contenu de la balise XML en clair pour le traitement de documentBuilderFactory dbf = documentBuilderFactory.newInstance (); DocumentBuilder db = dbf.newDocumentBuilder (); StringReader sr = new StringReader (smsg); ENTROWSOURCE IS = NOUVEAU INPUTSOURCE (SR); Document document = db.parse (IS); Élément root = document.getDocumentElement (); NodeList nodelist1 = root.getElementsByTagName ("Content"); if (nodelist1.item (0) == null) renvoie "ok"; String Content = nodeList1.item (0) .getTextContent (); System.out.println ("Contenu:" + Contenu); } catch (exception e) {e.printStackTrace (); // Le décryptage a échoué, veuillez vérifier l'exception pour l'échec} return "ok"; } / * * ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Supposons que l'entreprise doit répondre au texte brut de l'utilisateur comme suit: <xml> * <Tousername> <! [CDATA [MyCreate]]> </ Tousername> * <FromUserName> <! [CDATA [WX5823BF96D3BD56C7]]> </FROMUSERNAM <sgType> <! [Cdata [text]]> </ msgType> * <honied> <! [CDATA [Ceci est un test]]> </ contenu> * <sgid> 1234567890123456 </sgid> <agedId> 128 </ Agentid> </xMl> * * Afin de répondre à ce texte ordinaire pour l'utilisateur, le Treatpr Stamp de temps et une chaîne de nombres aléatoires (NONCE) pour générer la signature du corps du message, ou utiliser directement la valeur correspondante analysée à partir de l'URL post * de la plate-forme publique. 2. Cryptez le texte brut pour obtenir le texte de chiffre. * 3. Utilisez le texte de chiffre, l'horodatage, nonce généré à l'étape 1 et les jetons définis par l'entreprise sur la plate-forme publique pour générer des signatures de corps de message. * 4. Éplice le texte chiffré, la signature du corps du message, l'horodatage et la chaîne de nombres aléatoires dans une chaîne au format XML et l'envoyez-le à l'entreprise. * Les étapes ci-dessus 2, 3 et 4 peuvent être implémentées à l'aide de la fonction de bibliothèque Encryptmsg fournie par la plate-forme publique. * / // @get // @Path ("Send") public void sendmsg (String TimeStamp, String Nonce) {String SrespData = "<xml> <Tousername> <! [CDATA [MyCreate]]> </ Tousername> <FromUserName> <! [CDATA [WXE49318EB604CF00B]]> </ From Nom d'utilisateur> <reatEtime> 1348831860 </reateTime> <sgType> <! [CDATA [Text]]> </sgtType> <Conticiel> <! [CDATA [CECI [ est un test]]> </ contenu> <sgid> 1234567890123456 </sgdid> <AgentID> 1 </gentID> </xml> "; try {String sencryptmsg = wxcpt.encryptmsg (srespdata, horodatamp, nonce); System.out.println ("Après Ecrypt Sencrytmsg:" + Sencryptmsg); réponse.getWriter (). print (sencryptmsg); } catch (exception e) {e.printStackTrace (); // Encryption a échoué} // return srespdata; } / ** * Cette méthode peut envoyer n'importe quel type de messages * * @param msgType * Texte | Image | Voice | Vidéo | Fichier | Actualités * @param Touser * Liste d'identification des membres (les destinataires de messages, plusieurs destinataires sont séparés par '|', et jusqu'à 1000 sont pris en charge). Cas spécial: spécifié en tant que @all, * Enverra * @param topy * Liste d'identification du département à tous les membres qui suivent la demande d'entreprise. Plusieurs destinataires sont séparés par «|» et jusqu'à 100 sont pris en charge. Ignorez ce paramètre lorsque Tlouser est @all * @param totag * Liste d'ID de balise, plusieurs destinataires sont séparés par '|'. Ignorez ce paramètre lorsque Touser est @ all * @param contenu * Lorsque msgType = texte, contenu du message texte * @param mediaId * Lorsque msgType = image | voix | vidéo, id d'information du message correspondant (-------) * @param titre * Lorsque msgType = new @param picurl * Lorsque msgType = news, chemin d'image * @param sa sécurité * indique s'il s'agit d'un message confidentiel, 0 indique non, 1 indique oui, par défaut 0 * / public void sendwechatmsg (String msgtype, string tousser, string topy, string totag, string Content, string mediaId, String Description, String url, string picurl, String Safe) {url Url; String Access_token = getAccessToken (); // string request String String Action = create_session_url + access_token; // Encapsule Envoyer la demande de message JSON StringBuffer SB = new StringBuffer (); sb.append ("{"); SB.APPEND ("/" Tauser / ":" + "/" "+ Tauser +" / ","); sb.append ("/" toparty / ":" + "/" "+ toparty +" / ","); sb.append ("/" totag / ":" + "/" "+ totag +" / ","); if (msgType.equals ("text")) {sb.append ("/" msgtype / ":" + "/" "+ msgtype +" / ","); sb.append ("/" text / ":" + "{"); SB.APPEND ("/" Content / ":" + "/" "+ Content +" / ""); sb.append ("}"); } else if (msgType.equals ("image")) {sb.append ("/" msgtype / ":" + "/" "+ msgtype +" / ","); sb.append ("/" image / ":" + "{"); sb.append ("/" media_id / ":" + "/" "+ mediaId +" / ""); sb.append ("}"); } else if (msgType.equals ("Voice")) {sb.append ("/" msgType / ":" + "/" "+ msgtype +" / ","); SB.APPEND ("/" Voice / ":" + "{"); sb.append ("/" media_id / ":" + "/" "+ mediaId +" / ""); sb.append ("}"); } else if (msgType.equals ("vidéo")) {sb.append ("/" msgType / ":" + "/" "+ msgtype +" / ","); SB.APPEND ("/" VIDEO / ":" + "{"); sb.append ("/" media_id / ":" + "/" "+ mediaId +" / ","); sb.append ("/" title / ":" + "/" "+ title +" / ","); SB.APPEND ("/" Description / ":" + "/" "+ Description +" / ""); sb.append ("}"); } else if (msgtype.equals ("file")) {sb.append ("/" msgtype / ":" + "/" "+ msgtype +" / ","); sb.append ("/" file / ":" + "{"); sb.append ("/" media_id / ":" + "/" "+ mediaId +" / ""); sb.append ("}"); } else if (msgType.equals ("news")) {sb.append ("/" msgType / ":" + "/" "+ msgtype +" / ","); sb.append ("/" news / ":" + "{"); SB.APPEND ("/" Articles / ":" + "["); sb.append ("{"); sb.append ("/" title / ":" + "/" "+ title +" / ","); SB.APPEND ("/" Description / ":" + "/" "+ Description +" / ","); sb.append ("/" url / ":" + "/" "+ url +" / ","); sb.append ("/" picurl / ":" + "/" "+ picurl +" / ""); sb.append ("}"); SB.APPEND ("]"); sb.append ("}"); } SB.APPEND (", /" Safe / ":" + "/" "+ Safe +" / ","); SB.APPEND ("/" AgentID / ":" + "/" "+ agentId +" / ","); sb.append ("/" debug / ":" + "/" "+" 1 "+" / ""); sb.append ("}"); String JSON = SB.TOSTRING (); essayez {url = new URL (action); HttpSurlConnection http = (httpSurlConnection) url.openconnection (); http.setRequestMethod ("post"); http.setRequestProperty ("contenu-type", "application / json; charset = utf-8"); http.setDoOutput (true); http.setDoInput (true); System.SetProperty ("Sun.net.client.defaultConnectTimeout", "30000"); // // Connection Timeout 30 Seconds System.SetProperty ("Sun.net.client.defaulTreadTimeout", "30000"); // // Read Timeout 30 secondes http.connect (); OutputStream os = http.getOutputStream (); OS.Write (JSON.GetBytes ("UTF-8")); // passe dans le paramètre inputStream est = http.getInputStream (); int size = is.Available (); octet [] jsonBytes = nouveau octet [taille]; is.read (jsonbytes); String result = new String (jsonBytes, "utf-8"); System.out.println ("Renvoie la demande Résultat:" + Résultat); os.flush (); os.close (); } catch (exception e) {e.printStackTrace (); }} public static void main (String [] args) {StationResource wechat = new StationResource (); // wechat.sendwechatmsgtext ("@ all", "2", "", "notification du centre d'information", "0"); wechat.sendwechatmsg ("news", "@all", "", "", "", "test Senmsg", "", "testé", "vraiment testé", "http://www.baidu.com", "http://file27.mafengwo.net/m00/b2/12/wkgb6lo0ahwamhl8aav1ybfjdjw20.jpeg", "0"); }}Ce qui précède est les messages WECHAT ENTERPRISE Verification / Send / Receive You présentés par l'éditeur. J'espère que cela vous sera utile. Si vous avez des questions, veuillez me laisser un message et l'éditeur vous répondra à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!