Java WeChat Public Platform Development News Management, vous devez d'abord lire les documents officiels
La gestion des messages WeChat est divisée en messages ordinaires, réception de l'événement, envoyez des messages (réponse passive), des messages du service client, des messages de masse et des messages de modèle.
1. Recevoir des messages ordinaires
Lorsqu'un utilisateur WECHAT ordinaire envoie un message à un compte public, le serveur WeChat emballera le paquet de données XML du message Post à l'URL rempli par le développeur.
En ce qui concerne MSGID, l'explication officielle équivaut à chaque identifiant de message. En ce qui concerne le poids du message de réessayer, il est recommandé d'utiliser MSGID pour faire la queue. Si le serveur WeChat ne reçoit pas de réponse dans les cinq secondes, il déconnectera et réinitialera une demande et réessayera trois fois au total.
Par exemple, l'exemple XML de SMS
<XML> <Tousername> <! [CDATA [TOULER]]> </ TOUSERNAME> <ROMUSERNAME> <! [CDATA [FromSer]]> </ FromUserName> <CreateEtime> 1348831860 </ CreateTime> <sgtype> <! [CDATA [Text]> </sgtype> test]]> </ contenu> <sgid> 1234567890123456 </sgdid> </XML>
Vérifiez les autres messages dans le document officiel et encapsulez simplement le message suivant Résumé Casse de base Abstractmsg.java
package com.phil.wechat.msg.model.req; import java.io.serializable; / ** * Classe de messages de base * * @author phil * * / public abstract class abstractmsg implémente serializable {private static final long SerialVersionUID = -6244277633057415731l; String privé Tausername; // Développeur WeChat Id String privé Fromauname; // Compte de l'expéditeur (OpenID) String privé msgType = setmsgType (); // Type de message, par exemple / texte / image Private Long CreateTime; // Temps de création de messages (entier) MSGID long privé; // ID de message, 64 bits entier / ** * Type de message * * @return * / String abstract public SetMsGtype (); }SMS TextMsg.java
package com.phil.wechat.msg.model.req; / ** * Message texte * @Author Phil * @Date 30 juin 2017 * * / classe publique TextMsg étend AbstractMSG {private static final long SerialVersionUID = -1764016801417503409l; Contenu de chaîne privé; // message texte @Override public String setmsgType () {return "text"; }}D'autres sont comme ça ...
2. Répondre passivement aux messages utilisateur
Une fois que le serveur WeChat a envoyé le message de l'utilisateur à l'adresse du serveur du développeur (configuré au centre du développeur) du compte officiel, le serveur WeChat se déconnectera s'il ne recevra pas la réponse dans les cinq secondes et lancera à nouveau une demande, et essaiera trois fois au total. Si pendant le débogage, il est constaté que l'utilisateur ne peut pas recevoir le message de réponse, vous pouvez vérifier si le traitement des messages a expiré. Si le serveur ne peut garantir qu'il traitera et répondra dans les cinq secondes, il peut répondre directement à la chaîne vide. Le serveur WeChat ne gèrera pas cela et n'initivera pas de réessayer.
Si "ce compte officiel ne peut pas fournir de services pour le moment, veuillez réessayer plus tard", il y a deux raisons à cela.
Par exemple, le message texte de réponse Exemple XML
<xml> <Tousername> <! [cdata [Touser]]> </ Tousername> <NomUserName> <! [CDATA [FromUser]]> </ FromUserName> <CreateEtime> 12345678 </reatetetime> <sgtype> <! [CDATA [Text]]> </sgtype> <hon contenu> <! [CDATA [Hello]]> </ Content> </XML>
Dans un package simple
Message de réponse Résumé Classe de base respabstractmsg.java
package com.phil.wechat.msg.model.resp; import java.io.serializable; / ** * Classe de base de messages (compte public-> utilisateur ordinaire) * * @author phil * * / classe publique Résumé RespabstractMsg {// Receiver Compte (Reçu OpenID) private String Tuername; // Développeur WeChat Id String privé Fromauname; // Temps de création de messages (intégral) Private Long CreateTime; // Type de message (Text / Music / News) String privé msgType = SetMsGtype (); // Type de message public SetMsGtype () } Réponse Message texte respExTextmsg.java
package com.phil.wechat.msg.model.resp; / ** * Répondre aux messages d'image * * @author phil * @data 26 mars 2017 * * / classe publique RespImageMSG étend RespabstractMsg {image privée; @Override public String SetMsGtype () {return "image"; } / ** * * @author phil * @Date 19 juillet 2017 * * / public class Image {// Télécharger des fichiers multimédias via l'interface dans la gestion des matériaux pour obtenir l'ID. STRING PRIVÉE RAIMID; String public getmediaId () {return mediad; } public void setMediaid (String mediaD) {mediaId = mediaId; }}} Les autres types de messages sont les suivants ...
3. Traitement des messages
Analyse de maître XML
package com.phil.wechat.msg.Controller; Importer java.io.ioException; import java.io.inputStream; importation java.util.map; import java.util.objects; import org.apache.commons.lang3.stringutils; Import org.dom4j.DocumentException; import org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.sterreotype.Controller; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.requestMethod; import com.phil.modules.config.wechatconfig; import com.phil.modules.util.msgutil; import com.phil.modules.util.signatureUtil; import com.phil.modules.util.xmlutil; import com.phil.wechat.base.controller.baseController; import com.phil.wechat.base.result.wechatResult; import com.phil.wechat.msg.model.req.basicmsg; import com.phil.wechat.msg.model.resp.Respabstractmsg; Importer com.phil.wechat.msg.model.resp.RespNewSmsg; Importer com.phil.wechat.msg.model.resp.RespNewSmsg; import com.phil.wechat.msg.service.wechatmsgService; / ** * @Author Phil * @Date 19 septembre 2017 * * / @Controller @RequestMapping ("/ wechat") Classe publique WeChatmsGController étend BaseController {Private Logger Logger = LoggerFactory.GetLogger (this.getClass ()); @Autowired private wechatmsgService WeChatmsgService; / ** * Vérifiez si les informations sont envoyées à partir du serveur WeChat et traitez le message * @param out * @throws ioException * / @RequestMapping (value = "/ handler", méthode = {requestMethod.get, requestMethod.Post}) public void processPost () lance l'exception {this.getRest (). this.getResponse (). SetCacteRencoding ("UTF-8"); Boolean isPost = objets.equals ("post", this.getRequest (). getMethod (). ToupperCase ()); if (isPost) {logger.debug ("l'accès est réussi, la logique est traitée"); String respxml = defaultmsgDispose (this.getRequest (). GetInputStream ()); // processRequest (request, réponse); if (stringUtils.isnotblank (respxml)) {this.getResponse (). getWriter (). write (respxml); }} else {String Signature = this.getRequest (). getParAmètre ("Signature"); // TimeStamp String TimeStamp = this.getRequest (). GetParameter ("TimeStamp"); // chaîne de nombres aléatoires nonce = this.getRequest (). GetParameter ("nonce"); // Vérifiez la demande en vérifiant la signature. Si la vérification est réussie, retournez Echostr tel quel, indiquant que l'accès est réussi. Sinon, l'accès échoue si (signatureUtil.checkSignature (signature, horodat, nonce)) {// String aléatoire String Echostr = this.getRequest (). GetParAmètre ("eChostr"); Logger.debug ("Entrez réussi, echostr {}", echostr); this.getResponse (). getWriter (). Write (eChostr); }}} / ** * Méthode de traitement par défaut * @param entrée * @return * @throws exception * @throws documentException * / private String defaultmsgDispose (inputStream inputStream) lève exception {string result = null; if (inputStream! = null) {map <string, string> params = xmlutil.parsestamtomap (inputStream); if (params! = null && params.size ()> 0) {BasicMsg msginfo = new BasicMsg (); String CreateTime = Params.get ("CreateEtime"); String msgid = params.get ("msgid"); msginfo.setCreateTime ((createTime! = null &&! "". equals (createTime))? Integer.ParseInt (createTime): 0); msginfo.setFromUsername (params.get ("FromUserName")); msginfo.setmsgid ((msgid! = null &&! "". equals (msgid))? long.parselong (msgid): 0); msginfo.setTousername (params.get ("Tausername")); WechatResult resultObj = coreHandler (msginfo, params); if (resultObj == null) {// return null; } Boolean Success = resultObj.issucCess (); // Si vrai, cela signifie que le fichier XML est renvoyé, et il peut être converti directement, sinon selon type if (Success) {result = resultObj.getObject (). ToString (); } else {int type = resultObj.getType (); // 1 message graphique est spécifié ici, sinon il sera converti directement si (type == wechatresult.newsmsg) {respnewsmsg newsmsg = (respnewsmsg) resultObj.getObject (); résultat = msgutil.newsmsgtoxml (newsmsg); } else {respabstractmsg basicmsg = (respabstractmsg) resultObj.getObject (); result = msgutil.msgtoxml (BasicMsg); }} else {result = "msg est mauvais"; }} Retour Résultat; } / ** * Traitement de noyau * * @param msg * classe de base de message * @param params * xml Données analysées * @return * / private weChatResult HoreHandler (BasicMsg msg, map <string, string> params) {wechatResult result = null; String msgType = params.get ("msgType"); if (stringUtils.isempty (msgType)) {switch (msgType) {case wechatconfig.req_message_type_text: // Résultat du message texte = wechatmsgservice.textmsg (msg, params); casser; case wechatconfig.req_message_type_image: // Message d'image résultat = wechatmsgService.imagemsg (msg, params); casser; case wechatconfig.req_message_type_link: // lien message result = wechatmsgService.linkmsg (msg, params); casser; case wechatconfig.req_message_type_location: // le résultat de l'emplacement géographique = wechatmsgService.locationmsg (msg, params); casser; case wechatconfig.req_message_type_voice: // Message audio résultat = wechatmsgService.voicemsg (msg, params); casser; case wechatconfig.req_message_type_shortvideo: // Résultat du message vidéo court = wechatmsgService.shortvideo (msg, params); casser; case wechatconfig.req_message_type_video: // Message vidéo resulture = weChatmsgService.shortvideo (msg, params); casser; case wechatconfig.req_message_type_video: // Message vidéo résultat = wechatmsgService.videomsg (msg, params); casser; case wechatconfig.req_message_type_event: // String de message d'événement eventype = params.get ("événement"); // if (eventType! = null &&! "". equals (eventType)) {switch (eventType) {case wechatconfig.event_type_subscribe: result = wechatmsgService.subscribe (msg, params); casser; case wechatconfig.event_type_unsubscribe: result = wechatmsgService.unSubscribe (msg, params); casser; case wechatconfig.event_type_scan: result = wechatmsgService.scan (msg, params); casser; case wechatconfig.event_type_location: result = wechatmsgService.EventLocation (msg, params); casser; case wechatconfig.event_type_click: result = wechatmsgService.eventClick (msg, params); casser; case wechatconfig.event_type_view: result = wechatmsgService.eventView (msg, params); casser; case wechatconfig.kf_create_session: result = wechatmsgService.kfcreateSession (msg, params); casser; case wechatconfig.kf_close_session: result = wechatmsgService.kfcloseSESSE (msg, params); casser; case wechatconfig.kf_close_session: result = wechatmsgService.kfcloseSESSE (msg, params); casser; case wechatconfig.kf_switch_session: result = wechatmsgService.kfSwitchSession (msg, params); casser; par défaut: weChatmsgService.EventDefaultrePly (msg, params); casser; } } casser; par défaut: wechatmsgservice.defaultmsg (msg, params); }} Retour Résultat; }}Fournir une idée, veuillez déménager si vous vous référez au code
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.