Le développement du compte public WeChat s'adresse généralement aux entreprises et aux organisations. Les individus ne peuvent demander les comptes d'abonnement et les interfaces qu'ils appellent sont limitées. Décrivons brièvement les étapes pour accéder au compte public :
1. Tout d'abord, vous avez besoin d'une adresse e-mail pour vous inscrire sur la plate-forme de compte officielle WeChat;
Les méthodes d'enregistrement comprennent des comptes d'abonnement, des comptes officiels, des mini programmes et des comptes d'entreprise. Les individus, nous ne pouvons choisir que des comptes d'abonnement ici.
2. Après l'enregistrement, nous nous connectons à la plate-forme de compte officielle ---> Development ---> Configuration de base. Vous devez remplir l'URL et le jeton ici. L'URL est l'interface où nous utilisons le serveur;
3. Si le programme Java Web Server est compilé et déployé sur le serveur et peut être exécuté, vous pouvez déboguer l'interface en ligne sur le compte officiel de WeChat:
1) Sélectionnez l'interface appropriée
2) Le système générera un tableau de paramètres pour cette interface. Vous pouvez remplir directement la valeur du paramètre correspondant dans la zone de texte (l'astérisque rouge indique que ce champ est requis)
3) Cliquez sur le bouton Vérifier le problème pour obtenir les informations de débogage correspondantes
Par exemple: étapes pour obtenir Access_token:
1) Type d'interface: support de base
2) Liste d'interface: obtenir Access_token Interface / Token
3) Remplissez les paramètres correspondants: Grant_Type, Appid, secret
4) Cliquez pour vérifier le problème
5) Le résultat et l'invite seront retournés une fois la vérification réussie, et le résultat est: 200 OK, invite: demande de réussite signifie que la vérification est réussie
Ce que nous avons plus de vérification ici, c'est le débogage de l'interface de message: messages texte, messages d'image, messages vocaux, messages vidéo, etc.
4. Si vous ne comprenez pas l'interface, vous pouvez aller au développement -> outils du développeur -> Documents du développeur pour interroger
5. Autorisations d'interface: les comptes d'abonnement ont principalement une prise en charge de base, une réception de messages et certaines interfaces dans les services Web.
Ci-dessous, nous parlons principalement du cas de la façon de recevoir des messages par comptes d'abonnement :
1. Vous devez demander un compte d'abonnement WECHAT personnel
2. Déploiement de code d'URL serveur et côté serveur (vous pouvez utiliser Tencent Cloud ou Alibaba Cloud Server)
1) Classe comptesservlet.java pour vérifier le traitement des messages du serveur WeChat et du serveur WeChat
Package CN.jon.wechat.servlet; Importer java.io.ioException; import java.io.printwriter; Importer javax.servlet.servletException; import javax.servlet.http.httpservlet; Importer javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; Importer cn.jon.wechat.service.accountsService; import Cn.jon.wechat.utils.signUtil; La classe publique AccountsServlet étend HttpServlet {public ComptestServlet () {super (); } public void destre () {super.destroy (); // Mettez votre code ici} / ** * Confirmez que la demande provient du serveur WeChat * / public void doGet (HttpServLetRequest Request, HttpServletResponse Response) lance Servlexception, ioException {System.out.println ("Interface Test Start !!!"); // WECHAT ENCRYPPE Signature String Signature = request.getParameter ("Signature"); // TimeStamp String TimeStamp = request.getParameter ("TimeStamp"); // chaîne de nombres aléatoires nonce = request.getParameter ("nonce"); // chaîne de chaîne aléatoire echostr = request.getParameter ("echostr"); Printwriter out = réponse.getWriter (); // Vérifiez la demande en vérifiant la signature. Si la vérification est réussie, renvoyez Echostr tel qu'il est, indiquant que l'accès est réussi, sinon l'accès échoue si (SignUtil.Checksignature (signature, horodatage, nonce)) {out.print (echostr); } out.close (); out = null; // Response.EncodereDirectUrl ("Success.jsp"); } / ** * Messages de processus envoyés par WeChat Server * / public void doPost (requête httpservletRequest, réponse httpservletResponse) lance ServletException, ioException {// recevoir, procéder et répondre à la demande de message.SetcharacteRencoding ("utf-8"); Response.SetcharAtterencoding ("UTF-8"); // appelez le type d'entreprise de base pour accepter les messages et le traitement des messages String respsensage = accoutsService.ProcessRequest (demande); // Message de réponse printwriter out = réponse.getWriter (); Out.print (respsensage); out.close (); } public void init () lève ServletException {// Mettez votre code ici}} 2) Classe SignUtil.java, demande de la classe d'outils de vérification, le jeton doit être cohérent avec le jeton rempli de WeChat
package cn.jon.wechat.utils; Importer Java.Security.MessagediGest; importer java.security.nosuchalgorithMexception; import java.util.arrays; Importer java.util.iterator; importation java.util.map; import java.util.set; import java.util.concurrent.concurrentHashmap; / ** * Demande la classe d'outils de vérification * @author jon * / classe publique SignUtil {// cohérent avec le jeton dans la configuration de la configuration de wechat token statique privé = ""; Public Static Boolean Checkssignature (String Signature, String Timestamp, String Nonce) {String [] array = new String [] {token, horodatamp, nonce}; //Arrays.sort(Arra); StringBuilder sb = new StringBuilder (); for (int i = 0; i <arra.length; i ++) {sb.append (arra [i]); } MessagediGest md = null; String stnstr = null; essayez {md = messagediGest.getInstance ("sha-1"); octet [] digest = md.digest (sb.toString (). GetBytes ()); stnstr = bytetoStr (digest); } Catch (NosuchalgorithMexception e) {// Bloc de capture généré automatiquement de TODO E.PrintStackTrace (); } // mémoire libre sb = null; // Comparez la chaîne cryptée de SHA1 avec Signature, identifiant que la demande vient de WeChat Return stnstr! = Null? Stnstr.equals (signature.touppercase ()): false; } / ** * Convertir le tableau d'octet en chaîne hexadécimale * @param digestarra * @return * / private static String bytetoStr (byte [] digestarra) {// TODO Méthode générée automatiquement String digeststr = ""; for (int i = 0; i <digestarra.length; i ++) {digeststr + = bytetohexstr (digestarra [i]); } return digeststr; } / ** * Convertir les octets en chaîne hexadécimale * / chaîne statique privée bytetohexstr (byte dbyte) {// TODO Méthode générée auto {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; char [] tmparr = nouveau char [2]; tmparr [0] = numérique [(dbyte >>> 4) & 0x0f]; tmparr [1] = numérique [dbyte & 0x0f]; String s = new String (tmparr); retour s; } public static void main (String [] args) {/ * byte dbyte = 'a'; System.out.println (byTetohexstr (dbyte)); * / map <string, string> map = new concurrenthashmap <string, string> (); map.put ("4", "zhangsan"); map.put ("100", "Lisi"); Set set = map.KeySet (); Iterator iter = set.iterator (); while (iter.hasnext ()) {// string keyv = (string) iter.next (); String key = (string) iter.next (); System.out.println (map.get (key)); // System.out.println (map.get (iter.next ())); } / * pour (int i = 0; i <map.size (); i ++) {} * /}} 3) Classe de services comptesservice.java, principalement pour le traitement de la demande de messages et de la réponse, et lorsque les utilisateurs suivent votre compte officiel, ils peuvent définir des messages push par défaut
package cn.jon.wechat.service; Importer java.util.date; importation java.util.map; Importer javax.servlet.http.httpservletRequest; import Cn.jon.wechat.message.req.imageMessage; Importer cn.jon.wechat.message.req.LinkMessage; Importer cn.jon.wechat.message.req.LocationMessage; Importer cn.jon.wechat.message.req.videoMessage; import Cn.jon.wechat.message.req.voiceMessage; Importer cn.jon.wechat.message.resp.TextMessage; import Cn.jon.wechat.utils.sessageutil; / ** * Découplage, séparez la couche de contrôle de la couche de logique métier, traitant principalement des demandes et répondant * @author jon * / classe publique AccountService {public static String processRequest (httpservletRequest request) {String respectage = null; // Le contenu du message texte renvoyé par défaut String respact = "Exception de gestion de la demande, veuillez essayer plus tard!"; try {// xml request analyser map <string, string> requestmap = MessageUtil.parexml (request); // String du compte Sender (Open_ID) FROMUSERNAME = requestmap.get ("FromUserName"); // String de compte public Tausername = requestmap.get ("Tausername"); // Type de message String msgType = requestmap.get ("msgType"); // Répondez ce message texte par défaut TextMessage defaultTextMessage = new TextMessage (); DefaultTextMessage.setTousername (FromUserName); DefaultTextMessage.SetFromUsername (Tausername); DefaultTextMessage.setCreateTime (new Date (). GetTime ()); defaultTextMessage.setmsGtype (messageutil.message_type_text); defaultTextMessage.setfuncflag (0); // Étant donné que la valeur d'attribut HREF doit être causée en doubles devis, cela entre en conflit avec les doubles devis de la chaîne elle-même, defaultTextMessage.setContent doit être échappé ("Bienvenue à <a href = /" http://blog.csdn.net/j086924/ "> Jon's Blog </a>!"); // defaultTextMessage.setContent (getMainMenu ()); // convertit l'objet de message texte en xml string respsensage = MessageUtil.TextMessageToxMl (defaultTextMessage); // Message texte if (msgType.equals (messageutil.message_type_text)) {// respact = "Salut, vous envoyez un message texte!"; // Répondre au message texte textMessage textMessage = new TextMessage (); // textMessage.setTousername (Tausername); // textMessage.SetFromUsername (FromUserName); // Remarque ici, sinon le message ne peut pas être répondu à l'utilisateur textMessage.setTousername (FromUserName); textMessage.setFromUsername (Tausername); textMessage.setCreateTime (new Date (). GetTime ()); textMessage.setmsGtype (messageutil.message_type_text); textMessage.setfuncflag (0); respactyT = "Salut, le message que vous avez envoyé est:" + requestmap.get ("contenu"); TextMessage.SetContent (respontent); respMessage = MessageUtil.TextMessageTOxML (TextMessage); } // Message d'image else if (msgtype.equals (messageutil.message_type_image)) {ImageMeSage ImageMessage = new ImageMeSSAGE (); ImageMessage.setTousername (FromUserName); ImageMessage.setFromUsername (Tausername); ImageMessage.setCreateTime (new Date (). GetTime ()); ImageMessage.setmsGtype (messageutil.message_type_image); //RespContent=requestmap.get("picurl "); ImageMessage.Setpicurl ("http://img24.pplive.cn//2013//07//24//12103112092_230x306.jpg"); respMessage = MessageUtil.ImageMessageTOxML (ImageMessage); } // Emplacement géographique else if (msgType.equals (MessageUtil.message_type_location)) {LocationMessage LocationMessage = new LocationMessage (); locationMessage.setTousername (FromUserName); locationMessage.setFromUsername (Tausername); locationMessage.setCreateTime (new Date (). GetTime ()); locationMessage.setmsGtype (messageutil.message_type_location); locationMessage.SetLocation_x (requestmap.get ("location_x")); locationMessage.setLocation_y (requestmap.get ("location_y")); locationMessage.SetScale (requestmap.get ("échelle")); locationMessage.setLabel (requestmap.get ("label")); respMessage = MessageUtil.LocationMessageTOxML (locationMessage); } // message vidéo else if (msgtype.equals (messageutil.message_type_video)) {videoMessage videoMessage = new videoMessage (); VideoMessage.setTousername (FromUserName); VideoMessage.setFromUsername (Tausername); VideoMessage.setCreateTime (new Date (). GetTime ()); VideoMessage.setmsGtype (messageutil.message_type_video); VideoMessage.setMediaid (requestmap.get ("MediaId")); VideoMessage.setTHumbediaid (requestmap.get ("thumbmediaid")); respMessage = MessageUtil.VideoSSageTOxML (videoMessage); } // Message de liaison else if (msgType.equals (messageutil.message_type_link)) {linkMessage linkMessage = new LinkMessage (); linkMessage.setTouserName (FromUserName); linkMessage.setFromUsername (Tausername); linkMessage.setCreateTime (new Date (). GetTime ()); linkMessage.setmsGtype (messageutil.message_type_link); linkMessage.setTitle (requestmap.get ("title")); linkMessage.setDescription (requestmap.get ("Description")); linkMessage.setUrl (requestmap.get ("url")); respMessage = MessageUtil.LinkMessageTOxML (linkMessage); } // Message vocal else if (msgtype.equals (messageutil.message_type_voice)) {VoiceMessage VoiceMessage = new VoiceMessage (); VoiceMessage.setTousername (FromUserName); VoiceMessage.SetFromUsername (Tausername); VoiceMessage.setCreateTime (new Date (). GetTime ()); VoiceMessage.setmsGtype (messageutil.message_type_voice); VoiceMessage.setMediaid (requestmap.get ("MediaId")); VoiceMessage.SetFormat (requestmap.get ("format")); respMessage = MessageUtil.voiceMessageTOxML (VoiceMessage); } // Événement push else if (msgType.equals (messageutil.message_type_event)) {// Type d'événement String EventType = requestMap.get ("Event"); // Abonnez-vous if (eventType.equals (messageutil.event_type_subscribe)) {respact = "Merci pour votre attention!"; } // Désubscribe else if (EventType.equals (messageutil.event_type_unsubscribe)) {// system.out.println ("désubscribe"); } else if (EventType.equals (messageutil.event_type_click)) {// Menu personnalisé Message Processing System.out.println ("Traitement de menu personnalisé"); }}} catch (exception e) {// TODO Block de catch généré automatiquement e.printStackTrace (); } return reswessage; } public static String getMainMenu () {StringBuffer Buffer = new StringBuffer (); Buffer.APPEND ("Bonjour, je suis Jon, veuillez répondre au service de sélection des numéros:"). APPEND ("/ n"); Buffer.APPEND ("1. Mon blog"). Ajouter ("/ n"); Buffer.APPEND ("/ n"); Buffer.APPEND ("2. Song on Demand"). APPEND ("/ n"); Buffer.APPEND ("3. Game classique"). APPEND ("/ n"); Buffer.APPEND ("4. CARTS AND PLAY"). APPEND ("/ n / n"); Buffer.APPEND ("Répondre" + "0" + "Afficher le menu d'aide"); retour tamper.toString (); }} 4) Classe d'aide MessageUtil.java, y compris la définition constante et la conversion et le traitement des messages XML
package cn.jon.wechat.utils; import java.io.inputStream; Importer java.io.writer; import java.util.hashmap; Importer java.util.list; importation java.util.map; Importer javax.servlet.http.httpservletRequest; import org.dom4j.Document; import org.dom4j.element; import org.dom4j.io.saxreader; import Cn.jon.wechat.message.req.imageMessage; Importer cn.jon.wechat.message.req.LinkMessage; Importer cn.jon.wechat.message.req.LocationMessage; Importer cn.jon.wechat.message.req.videoMessage; import Cn.jon.wechat.message.req.voiceMessage; import Cn.jon.wechat.message.req.voiceMessage; Importer cn.jon.wechat.message.resp.TextMessage; Importer cn.jon.wechat.message.resp.musicMessage; Importer cn.jon.wechat.message.resp.TextMessage; Importer cn.jon.wechat.message.resp.TextMessage; Importer cn.jon.wechat.message.resp.TextMessage; Importer cn.jon.wechat.message.resp.TextMessage; import com.thoughtworks.xstream.xstream; import com.thoughtworks.xstream.core.util.quickwriter; import com.thoughtworks.xstream.io.hierarchicalstreamwriter; import com.thoughtworks.xstream.io.xml.prettyprintwriter; import com.thoughtworks.xstream.io.xml.xppdriver; / ** * Diverses classes de traitement des messages * @author jon * / classe publique MessageUtil {/ ** * Type de texte * / public static final string message_type_text = "text"; / ** * Type de musique * / public static final string message_type_music = "music"; / ** * Type d'image * / public static final string message_type_news = "news"; / ** * Type de vidéo * / public static final string message_type_video = "vidéo"; / ** * Type d'image * / public static final string message_type_image = "image"; / ** * Type de lien * / public static final string message_type_link = "link"; / ** * Type d'emplacement géographique * / public static final String message_type_location = "emplacement"; / ** * type audio * / public static final string message_type_voice = "Voice"; / ** * push type * / public static final string message_type_event = "Event"; / ** * Type d'événement: abonnez-vous (abonnez-vous) * / public statique final final String event_type_subscribe = "abonnez-vous"; / ** * Type d'événement: Désubscribe (Unbscribe) * / public static final String event_type_unsubscribe = "Désubscribe"; / ** * Type d'événement: cliquez sur (Menu personnalisé Click Event) * / public static final String Event_Type_Click = "Click"; / ** * * Demande d'analyse xml envoyé par WeChat * / @SuppressWarnings ("Unchecked") Public Static Map <String, String> Parexml (httpservletRequest Request) lève exception {// Stockage Le résultat analysé dans Hashmap Map <String, String> reqmap = new hashmap <String, String> (); // Obtenez le flux d'entrée de la demande inputStream inputStream = request.getInputStream (); // Lire le Stream d'entrée SAXREDER Reader = new saxReader (); Document document = reader.read (inputStream); // Obtenez l'élément root xml root root = document.getRootelement (); // Obtenez tous les nœuds enfants de la liste des éléments racinaires <element> elementList = root.Elements (); // transfuser tous les nœuds enfants pour obtenir le contenu de la classe d'information pour (élément elem: elementList) {reqmap.put (elem.getName (), elem.getText ()); } // Libérez la ressource inputStream.close (); inputStream = null; retour reqmap; } / ** * Convertir le message de réponse en xml en retour * objet texte en xml * / public static static textMessagetOxML (textMessage textMessage) {xstream.alias ("xml", textMessage.getClass ()); return xstream.toxml (textMessage); } / ** * Conversion de l'objet vocal en xml * * / public static String VoiceMessagetOxML (VoiceMessage VoiceMessage) {xstream.alias ("xml", voiceMessage.getClass ()); return xstream.toxml (VoiceMessage); } / ** * Conversion de l'objet vidéo en xml * * / public static String VideoMessagetOxML (vidéoSage VideoMessage) {xstream.alias ("xml", videoMessage.getClass ()); return xstream.toxml (videoMessage); } / ** * Conversion des objets musicaux en xml * * / public static String MusicMessageToxMl (musicMessage MusicMessage) {xstream.alias ("xml", musicmessage.getClass ()); return xstream.toxml (musicMessage); } / ** * Conversion des objets graphiques en xml * * / public static static newsMessageToxML (newsMessage newsMessage) {xstream.alias ("xml", newsMessage.getClass ()); xstream.alias ("item", nouvel article (). getClass ()); return xstream.toxml (NewsMessage); } / ** * Convertir l'objet d'image en xml * * / public static String ImageMessagetOxML (imageMeSage ImageMeShEMSSAGE) {xstream.alias ("xml", imageMessage.getClass ()); return xstream.toxml (imageMessage); } / ** * Convertir l'objet de liaison en xml * * / public static String linkMessageToxMl (linkMessage linkMessage) {xstream.alias ("xml", linkMessage.getClass ()); return xstream.toxml (linkMessage); } / ** * Convertir l'objet Geolocation en xml * * / public static static locationMessagetOxML (locationMessage locationMessage) {xstream.alias ("xml", locationMessage.getClass ()); return xstream.toxml (locationMessage); } / ** * Développez Xstream pour prendre en charge les blocs CDATA * * / private static xstream xstream = new XStream (new XPPDriver () {public hiérarchicalstreamwriter createWriter (writer out) {return wewprintwriter (out) {// ajouter cdata tag à tous les nœuds xMl coolean cdata pour startNode (nom de la chaîne, class Clazz) {Super.StartNode (nom, Cllaz } 5) Classe de base de messages BasEmsage.Java (y compris: Compte WECHAT du développeur, compte d'utilisateur, temps de création, type de message, variable d'identification de message), le texte, la vidéo et les messages d'image hériteront de cette classe de base, et sur cette base, il étendra ses propres variables et peut être définie en fonction de divers attributs de messages dans le document du développeur.
package cn.jon.wechat.message.req; / ** * Classe de base de messages (compte utilisateur ordinaire) * @author jon * / classe publique BasEmsage {// développeur wechat id private String Tuername; // Compte de l'expéditeur (une chaîne privée OpenID) FromaunName; // Temps de création de messages (entier) Private Long CreateTime; // Type de message (texte / image / emplacement / lien ...) chaîne privée msgType; // ID de message 64 bits String privé MSGID; Public BasEnsage () {super (); // TODO Auto-généré par Stub} public BasEmsage (String Tausername, String FromUsername, Long CreateTime, String msgType, String msgid) {super (); Tousername = Tousername; FromUserName = FromUserName; CreateTime = CreateTime; MsgType = msgType; Msgid = msgid; } public String getTousername () {return Tausername; } public void Settousename (String Tousername) {Tausername = Tousername; } public String getFromUsername () {return fromUserName; } public void setFromUsername (String fromUserName) {FromUserName = FromUserName; } public long getCreateTime () {return CreateTime; } public void setCreateTime (long createTime) {CreateTime = CreateTime; } public String getmsgType () {return msgType; } public void SetMsGType (String msgType) {msgType = msgType; } public String getmsgid () {return msgid; } public void setmsgid (string msgid) {msgid = msgid; }} 6) Message texte TextMessage.Java, hérité de la classe de base en 5, étendant les attributs de contenu
package cn.jon.wechat.message.req; / ** * Message texte * @author jon * / classe publique TextMessage étend BasEmsage {// contenu du message de contenu privé de chaîne; public String getContent () {return Content; } public void setContent (String Content) {this.Content = Content; }}7) Message d'image ImageMessage.Java
package cn.jon.wechat.message.req; / ** * Message de l'image * @author jon * / public class ImageMessage étend BasEmsage {// pic link private String picurl; public String getPICUrl () {return picurl; } public void setPicurl (String picurl) {picurl = picurl; }} 8) Message vidéo VideoMessage.Java
package cn.jon.wechat.message.req; La classe publique VideoMessage étend BasEmsage {private String MediaD; chaîne privée Thumbmediaid; String public getmediaId () {return mediad; } public void setmediaId (string mediaD) {this.mediaid = mediaId; } public String getTHumbediaid () {return thumbmediaId; } public void SetTHumbediaid (String thumbmediaId) {this.thumbmediaid = thumbmediaId; }}D'autres classes de messages peuvent être complétées par elles-mêmes en fonction de la documentation du développeur. De plus, les développeurs peuvent également postuler à un compte de test de plate-forme publique pour tester le contenu pertinent du développement.
Cet article a été compilé dans "Résumé du didacticiel Android WeChat Development" et "Java WeChat Development Tutorial Résumé" accueille tout le monde pour apprendre et lire.
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.