Die Entwicklung von WeChat Public Account richtet sich im Allgemeinen auf Unternehmen und Organisationen. Einzelpersonen können nur Abonnementkonten beantragen, und die von ihnen bezeichneten Schnittstellen sind begrenzt. Beschreiben wir kurz die Schritte, um auf das öffentliche Konto zuzugreifen :
1. Erstens benötigen Sie eine E -Mail -Adresse, um sich auf der offiziellen Account -Plattform von WeChat zu registrieren.
Die Registrierungsmethoden umfassen Abonnementkonten, offizielle Konten, Mini -Programme und Unternehmenskonten. Einzelpersonen, wir können hier nur Abonnementkonten auswählen.
2. Nach der Registrierung melden wir uns bei der offiziellen Kontoplattform ---> Entwicklung ---> Grundkonfiguration an. Sie müssen die URL und das Token hier füllen. Die URL ist die Schnittstelle, an der wir den Server verwenden.
3. Wenn das Java -Webserverprogramm auf dem Server kompiliert und bereitgestellt wird und ausgeführt werden kann, können Sie die Online -Schnittstelle auf dem offiziellen WeChat -Konto debuggen:
1) Wählen Sie die entsprechende Schnittstelle aus
2) Das System erzeugt eine Parametertabelle für diese Schnittstelle. Sie können den entsprechenden Parameterwert im Textfeld direkt ausfüllen (das rote Sternchen gibt an, dass dieses Feld erforderlich ist).
3) Klicken Sie auf die Schaltfläche Problem überprüfen, um die entsprechenden Debugging -Informationen zu erhalten
ZB: Schritte, um Access_Token zu erhalten:
1) Schnittstellentyp: Grundunterstützung
2) Schnittstellenliste: Get Access_Token Interface/Token
3) Füllen Sie die entsprechenden Parameter ein: Grant_type, Appid, Secret
4) Klicken Sie hier, um das Problem zu überprüfen
5) Das Ergebnis und die Eingabeaufforderung werden nach Erfolg der Überprüfung zurückgegeben, und das Ergebnis ist: 200 OK, Eingabeaufforderung: Anfrage erfolgreich bedeutet die Überprüfung erfolgreich
Was wir hier mehr Überprüfung haben, ist das Debugging von Message Interface: Textnachrichten, Bildnachrichten, Sprachnachrichten, Videomeldungen usw.
4. Wenn Sie die Schnittstelle nicht verstehen, können Sie zur Entwicklung von Entwicklern-> Entwicklerdokumente zur Abfrage gehen
5. Schnittstellenberechtigungen: Abonnementkonten haben hauptsächlich grundlegende Unterstützung, Nachrichtenempfang und einige Schnittstellen in Webdiensten.
Im Folgenden sprechen wir hauptsächlich über den Fall , wie Nachrichten per Abonnementkonten empfangen werden können :
1. Sie müssen ein persönliches WeChat -Abonnementkonto beantragen
2. Bereitstellung von URL-Server und serverseitiger Code (Sie können Tencent Cloud oder Alibaba Cloud Server verwenden)
1) AccountServlet.java -Klasse, um die Nachrichtenverarbeitung vom WeChat -Server und des WeChat -Servers zu überprüfen
Paket cn.jon.wechat.servlet; importieren java.io.ioException; Import Java.io.printwriter; importieren javax.servlet.servletException; import Javax.servlet.http.httpServlet; importieren javax.servlet.http.httpServletRequest; importieren javax.servlet.http.httpServletResponse; import cn.jon.wechat.service.accountsService; import cn.jon.wechat.utils.Signutil; public class AccountServlet erweitert httpServlet {public AccountesServlet () {Super (); } public void destroy () {Super.Destroy (); // Setzen Sie Ihren Code hier ein}/ *** Bestätigen Sie, dass die Anforderung vom WeChat -Server erfolgt*/ public void dodget (httpServletRequest -Anforderung, httpServletResponse -Antwort) löst ServeTexception, IOException {System.out.println ("Schnittstellentest beginnt !!!"); // WeChat -Verschlüsselungssignatur -String Signature = Request.GetParameter ("Signatur"); // Zeitstempel String timestamp = request.getParameter ("timestamp"); // Zufallszahlenstring nonce = request.getParameter ("nonce"); // zufällige String String echoStr = request.getParameter ("echostr"); Printwriter out = response.getWriter (); // Überprüfen Sie die Anfrage, indem Sie die Signatur überprüfen. Wenn die Überprüfung erfolgreich ist, geben Sie Echostr so zurück, dass der Zugriff erfolgreich ist, da der Zugriff ansonsten fehlschlägt, wenn (Signutil.Checksignature (Signatur, Zeitstempel, Nonce) {out.print (echostr); } out.close (); out = null; // response.encoderedirecturl ("success.jsp"); } /*** Verarbeitungsnachrichten von WeChat Server* /public void dopost (httpServletRequest-Anforderung, HttpServletResponse-Antwort) aus löscht ServletException, ioException {// Empfangen, Prozess und antworten auf Nachrichtenanforderung. response.setcharactercoding ("utf-8"); // Kerngeschäftstyp aufrufen, um Nachrichten zu akzeptieren und Nachrichten Zeichenfolge zu verarbeiten respMessage = AccountService.ProcessRequest (Anfrage); // Antwortnachricht Printwriter out = response.getWriter (); out.print (respMessage); out.close (); } public void init () löscht servleTexception {// Ihren Code hier ein.}} 2) Signutil.java -Klasse, Anforderungsverifizierungswerkzeugklasse, das Token muss mit dem mit dem Token gefüllten WeChat übereinstimmen
Paket cn.jon.wechat.utils; Java.Security.Messagedigest importieren; Java.security.NoSuchalgorithmException; Import Java.util.Arrays; Import Java.util.iterator; import Java.util.map; Java.util.set importieren; Import Java.util.Concurrent.Concurrenthashmap; /*** Anfrage Überprüfungswerkzeugklasse* @Author Jon*/public class Signutil {// Übereinstimmung mit dem Token in WeChat Configuration Private static String token = ""; public static boolean Checksignatur (String Signature, String Timestamp, String nonce) {String [] array = new String [] {Token, Timestamp, Nonce}; //Arrays.sort(Arra); StringBuilder sb = new StringBuilder (); für (int i = 0; i <arra.length; i ++) {sb.append (arra [i]); } MessagedIGest MD = NULL; String stnstr = null; try {md = MessagedIGest.getInstance ("SHA-1"); byte [] digest = md.Digest (sb.toString (). getBytes ()); stnstr = bytetostr (digest); } catch (NoSuchalgorithmException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); } // freier Speicher sb = null; // Vergleiche die verschlüsselte SHA1 -Zeichenfolge mit Signatur und identifiziert, dass die Anforderung von WeChat return stnstr! } / ** * Byte-Array in hexadezimaler String * @param digestarra * @return * / private statische String-BytetoStr (byte [] digestarra) {// todo automatisch generierter Methode Stub String Digeststr = "" konvertieren; für (int i = 0; i <digestarra.length; i ++) {digestStr+= bytetohexstr (digestarra [i]); } return digestStr; } / *** Bytes in hexadezimale Zeichenfolge umwandeln {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; char [] tmparr = new char [2]; tmparr [0] = digit [(dbyte >>> 4) & 0x0f]; tmparr [1] = digit [dbyte & 0x0f]; String s = new String (tmparr); Rückkehr s; } public static void main (String [] args) { /*byte dByte = 'a'; System.out.println (bytetohexstr (dByte));*/ map <String, String> map = new ConcurrentHasMap <String, String> (); map.put ("4", "Zhangsan"); map.put ("100", "Lisi"); Set set = map.keyset (); Iterator iter = set.Iderator (); while (iter.hasnext ()) {// String keyV = (string) iter.next (); String key = (String) iter.next (); System.out.println (map.get (Schlüssel)); // system.out.println (map.get (iter.next ())); } /*für (int i = 0; i <map.size (); i ++) {}* /}} 3) AccountService.java Service Class, hauptsächlich zur Bearbeitung von Nachrichtenanforderungen und Antwort, und wenn Benutzer Ihrem offiziellen Konto folgen, können sie Standard -Push -Nachrichten festlegen
Paket cn.jon.wechat.service; import Java.util.date; import Java.util.map; importieren javax.servlet.http.httpServletRequest; import cn.jon.wechat.message.req.imagemessage; import cn.jon.wechat.message.req.linkMessage; import cn.jon.wechat.message.req.locationMessage; import cn.jon.wechat.message.req.videomessage; import cn.jon.wechat.message.req.voicemessage; import cn.jon.wechat.message.resp.textMessage; import cn.jon.wechat.utils.messageutil; / *** Entkoppelung trennen Sie die Kontrollschicht von der Geschäftslogikschicht, hauptsächlich mit Anfragen und antworten* @author jon*/ public class AccountService {public static String processRequest (httpServletRequest) {String respmessage = null; // Der inhaltliche SMS -Inhalt, der standardmäßig Zeichenfolge respcontent = "Beantragung von Ausnahme anfordern, versuchen Sie es später!"; try {// xml request parsing map <string, string> requestmap = messageutil.parexml (request); // Absenderkonto (open_id) String von renername = requestmap.get ("fromUserername"); // Public Account String tousername = requestmap.get ("tousername"); // Nachrichtentyp String msgType = requestmap.get ("msgType"); // diese Textnachricht standardmäßig textMessage defaultTextMessage = new textMessage () beantworten; DefaultTextMessage.settousername (from Username); defaultTextMessage.setFromusername (tousername); DefaultTextMessage.SetCreateTime (neues Datum (). GetTime ()); defaultTextMessage.setmsgType (messageUtil.messsage_type_text); defaultTextMessage.setFuncflag (0); // Da der HREF -Attributwert in doppelten Zitaten verursacht werden muss, steht dies in Konflikt mit den doppelten Zitaten der String selbst, DefaultTextMessage.SetContent muss entkommen ("Willkommen bei <a href =/" http://blog.csdn.net/j086924/ "> Jon's Blog </a>!"). // defaultTextMessage.setContent (getMainmenu ()); // das Textnachrichtungsobjekt in die XML -Zeichenfolge umwandeln Respmessage = messageUtil.textMessAgetoxml (defaultTextMessage); // Textnachricht if (msgType.equals (messageUtil.messsage_type_text)) {// respcontent = "Hallo, Sie senden eine Textnachricht!"; // auf Textnachricht textMessage textMessage = new textMessage () antworten; // textMessage.settousername (tousername); // textMessage.setfromusername (fromuername); // Beachten Sie hier, ansonsten kann die Nachricht nicht auf den Benutzer textMessage.settousername (from UNSERNAME) beantwortet werden. textMessage.setFromusername (tousername); textMessage.setCreateTime (neues Datum (). GetTime ()); textMessage.setmsgType (messageUtil.messsage_type_text); textMessage.setfuncflag (0); respcontent = "Hallo, die Nachricht, die Sie gesendet haben, lautet:"+RequestMap.get ("Inhalt"); TextMessage.SetContent (Respcontent); respMessage = messageUtil.textMessAgetoxml (TextMessage); } // Bildmeldung else if (msgType.equals (messageutil.messSage_type_image)) {Imagemessage Imagemessage = new Imagemessage (); Imagemessage.Settousername (from Unername); Imagemessage.SetFromusername (tousername); Imagemessage.SetCreateTime (neues Datum (). GetTime ()); Imagemessage.setMSGTYPE (MessageUtil.MessSage_Type_image); //respcontent=RequestMap.get("picurl "); Imagemessage.setpicurl ("http://img24.pplive.cn//2013//07/24//12103112092_230x306.jpg"); respMessage = messageUtil.imagemessAgetoxml (Bildemessage); } // Geografischer Ort sonst if (msgType.equals (messageUtil.messSage_type_location)) {locationMessage locationMessage = new locationMessage (); locationMessage.settousername (fromuername); locationMessage.setfromusername (tousername); locationMessage.setCreateTime (neues Datum (). GetTime ()); locationMessage.setmsgType (messageUtil.messsage_type_location); locationMessage.setLocation_x (requestmap.get ("location_x")); locationMessage.setLocation_y (requestmap.get ("location_y")); locationMessage.setsCale (RequestMap.get ("scale")); locationMessage.setLabel (requestmap.get ("label")); respMessage = messageUtil.locationMessAgetoxml (locationMessage); } // Videokassokassierung else if (msgType.equals (messageUtil.messsage_type_video)) {videomessage videomessage = new videomessage (); videomessage.settousername (fromuername); videomessage.setfromusername (tousername); videomessage.setCreateTime (neues Datum (). GetTime ()); videomessage.setmsgType (messageUtil.messsage_type_video); videomessage.setmediaid (RequestMap.get ("mediaId")); videomessage.setThumbMediaid (RequestMap.get ("thumbmediaid")); respMessage = messageUtil.videomessAgetoxml (videomessage); } // Link -Nachricht else if (msgType.equals (messageUtil.messSage_type_link)) {linkMessage linkMessage = new LinkMessage (); linkMessage.settousername (fromuername); linkMessage.setfromusername (tousername); linkMessage.setCreateTime (neues Datum (). GetTime ()); linkMessage.setmsgType (messageUtil.messsage_type_link); linkMessage.settitle (requestmap.get ("title")); linkMessage.setDescription (requestmap.get ("Beschreibung")); linkMessage.seturl (requestmap.get ("url")); respMessage = messageUtil.linkMessagetoxml (linkMessage); } // Sprachnachricht else if (msgType.equals (messageUtil.messSage_type_voice)) {voicemessage voicemessage = new voicemessage (); voicemessage.settousername (fromuername); voicemessage.setfromusername (tousername); Voicemessage.SetCreateTime (neues Datum (). GetTime ()); voicemessage.setmsgType (messageUtil.messsage_type_voice); voicemessage.setmediaid (RequestMap.get ("MediaId")); voicemessage.setFormat (requestmap.get ("Format")); respMessage = messageUtil.VoicemessAgetoxml (Voicemessage); } // Ereignisschub sonst if (msgType.equals (messageUtil.messsage_type_event)) {// Ereignis Typ String eventType = Requestmap.get ("Ereignis"); // abonnieren Sie (eventType.equals (messageUtil.event_type_subscribe)) {respcontent = "Danke für Ihre Aufmerksamkeit!"; } // abmelden else if (eventType.equals (messageUtil.event_type_unsubscribe)) {// system.out.println ("Absubscribe"); } else if (eventType.equals (messageUtil.event_type_click)) {// benutzerdefinierte Menümeldungsverarbeitung System.out.println ("benutzerdefinierte Menümeldung"); }}} catch (Ausnahme e) {// Todo automatisch generierter Fangblock E. printstacktrace (); } return respMessage; } public static String getMainMenu () {StringBuffer buffer = new StringBuffer (); Buffer.Append ("Hallo, ich bin Jon, bitte antworte auf den Nummernauswahldienst:"). Anhänge ("/n"); Buffer.Append ("1. Mein Blog"). Append ("/n"); Buffer.Append ("/n"); Buffer.Append ("2. Song on Demand"). Append ("/n"); Buffer.Append ("3. Classic Game"). Append ("/n"); Buffer.Append ("4. Chat und Play Cards"). Append ("/n/n"); Buffer.Append ("Antwort"+"0"+"Help -Menü anzeigen"); return buffer.toString (); }} 4) MessageUtil.java -Hilfeklasse, einschließlich konstanter Definition und XML -Nachrichtenkonvertierung und -verarbeitung
Paket cn.jon.wechat.utils; importieren java.io.inputstream; Import Java.io.Writer; import Java.util.hashMap; importieren java.util.list; import Java.util.map; importieren javax.servlet.http.httpServletRequest; import org.dom4j.document; import org.dom4j.element; import org.dom4j.io.saxreader; import cn.jon.wechat.message.req.imagemessage; import cn.jon.wechat.message.req.linkMessage; import cn.jon.wechat.message.req.locationMessage; import cn.jon.wechat.message.req.videomessage; import cn.jon.wechat.message.req.voicemessage; import cn.jon.wechat.message.req.voicemessage; import cn.jon.wechat.message.resp.textMessage; import cn.jon.wechat.message.resp.musicMessage; import cn.jon.wechat.message.resp.textMessage; import cn.jon.wechat.message.resp.textMessage; import cn.jon.wechat.message.resp.textMessage; import cn.jon.wechat.message.resp.textMessage; com.thoughtworks.xstream.xstream; com.thoughtworks.xstream.core.util.quickwriter; import com.thoughtworks.xstream.io.hierarchicalstreamwriter; com.thoughtworks.xstream.io.xml.prettTyprintwriter; com.thoughtworks.xstream.io.xml.xppdriver; / *** Verschiedene Nachrichtenverarbeitungsklassen* @author jon*/ public class messageutil {/ *** Texttyp*/ public static Final String message_type_text = "text"; / *** Musiktyp*/ public static Final String message_type_music = "musik"; / *** Bildtyp*/ public static final String message_type_news = "news"; / *** Videotyp*/ public static Final String message_type_video = "Video"; / *** Bildtyp*/ public static Final String message_type_image = "Image"; / *** Link -Typ*/ public static Final String message_type_link = "link"; / *** Geografischer Standorttyp*/ public static final String message_type_location = "locum"; / *** Audio -Typ*/ public static Final String message_type_voice = "voice"; / *** Pushtyp*/ public static Final String message_type_event = "event"; / ** * Ereignisart: abonnieren (abonnieren) */ public static Final String event_type_subScribe = "abonnieren"; / ** * Ereignisart: Absubscribe (Absubscribe) */ public static Final String event_type_unsubScribe = "Absubscribe"; / ** * Ereignisart: Klicken Sie auf (Benutzerdefiniertes Menü klicken Sie auf Ereignis) */ public static Final String event_type_click = "klicken"; /** * * Anfrage analysieren xml von WeChat gesendet */@Suppresswarnings ("Unkontrolliert") public static map <String, String> ParexML (httpServletRequest -Anforderung) löst eine Ausnahme aus {// Speicher das Parsen -Ergebnis in Hashmap -Karte <String> reqmap = new HaSHmap <String, String> (); // den Eingabestream aus dem Request InputStream InputStream = Request.GetInputStream () abrufen; // Lesen Sie den Eingabestream Saxreader Reader = New SaxReader (); Document document = reader.read (InputStream); // das XML Root Element Element root = document.getRootElement () abrufen; // Erhalten Sie alle untergeordneten Knoten der Root -Elementliste <element> elementList = root.elements (); // Alle untergeordneten Knoten übertragen, um den Inhalt des Informationsklasseninhalts für (Element Elem: ElementList) {reqmap.put (Elem.getName (), elem.getText ()) zu erhalten; } // den Ressourceneingabestream.CLOSE () freigeben; inputStream = null; return reqmap; } / ** * Die Antwortmeldung in XML konvertieren, um * Textobjekt in XML * / public static String textMessAgetoxml zurückzugeben (textMessage textMessage) {xstream.alias ("xml", textmessage.getClass ()); return xstream.toxml (TextMessage); } / ** * Konvertierung des Sprachobjekts in XML * * / public static String voicemessAgetoxml (Voicemessage Voicemessage) {xstream.alias ("xml", voicemessage.getClass ()); return xstream.toxml (Voicemessage); } / ** * Konvertierung des Videoobjekts in XML * * / public static String videomessAgetoxml (videomessage videomessage) {xstream.alias ("xml", videomessage.getClass ()); return xstream.toxml (videomessage); } / ** * Konvertierung von Musikobjekten in XML * * / public static String musicMessAgetoxml (MusicMessage MusicMessage) {xstream.alias ("xml", musicMessage.getClass ()); return xstream.toxml (MusicMessage); } / ** * Konvertierung von Grafikobjekten in XML * * / public static String newsMessAgetoxml (NewsMessage NewsMessage) {xstream.alias ("xml", newsmessage.getClass ()); xstream.alias ("item", neuer article (). getClass ()); return xstream.toxml (NewsMessage); } / ** * das Bildobjekt in xml * * / public static String imagemessAgetoxml (Bildemessage Imagemessage) {xstream.alias ("xml", Imagemessage.getClass ()) konvertieren; return xstream.toxml (Bildemessage); } / ** * das Link -Objekt in xml * * * / public static String linkMessAgetoxml (linkMessage linkMessage) {xstream.alias ("xml", linkMessage.getClass ()) konvertieren; return xstream.toxml (linkMessage); } / ** * Das Geolocation -Objekt in XML * * / public static String locationMessAgetoxml (locationMessage locationMessage) {xstream.alias ("xml", locationMessage.getClass ()) konvertieren; return xstream.toxml (locationMessage); } /*** Erweitern Sie Xstream, um CDATA -Blöcke zu unterstützen Startnode (String -Name, Class) {Super.StartNode (Name, Clazz); } 5) Basemessage.java Nachrichtenbasisklasse (einschließlich: Entwickler WeChat -Konto, Benutzerkonto, Erstellungszeit, Nachrichtentyp, Nachrichten -ID -Variable), Text, Video und Bildmeldungen erben diese Basisklasse. Auf dieser Grundlage erweitert sie ihre eigenen Variablen und kann basierend auf verschiedenen Nachrichtenattributen im Dokument des Entwicklers definiert werden.
Paket cn.jon.wechat.message.req; /** * Nachrichtenbasisklasse (gewöhnliches Benutzer-öffentliches Konto) * @Author Jon */öffentliche Klasse Basemessage {// Entwickler Wechat ID private String tousername; // Absendungskonto (eine OpenID) private Zeichenfolge aus demUnername; // Nachrichtenerstellung Zeit (Ganzzahl) Private Long Createtime; // Nachrichtentyp (Text/Bild/Ort/Link ...) private String msgType; // Message ID 64-Bit Integer Private String msgid; public basemessage () {super (); // todo automatisch generierter Konstruktor Stub} öffentliche Basisemessage (String tousername, String fromusername, Long CreateTime, String msgType, String msgid) {Super (); Tousername = tousername; Fromuername = fromuername; CreateTime = CreateTime; MsgType = msgType; Msgid = msgid; } public String Gettousername () {return tousername; } public void settousername (String tousername) {tousername = tousername; } public String GetFromusername () {return fromuNername; } public void setfromusername (String fromuSerername) {fromuSerername = fromuername; } 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) textMessage.java Textnachricht, die aus der Basisklasse in 5 geerbt wurde und Inhaltsattribute erweitern
Paket cn.jon.wechat.message.req; /*** SMS* @Author Jon*/public class TextMessage erweitert Basemessage {// Nachrichteninhalt privater String -Inhalt; public String getContent () {Inhalt zurückgeben; } public void setContent (String -Inhalt) {this.content = content; }}7) Bildemessage.java Bildnachricht
Paket cn.jon.wechat.message.req; /*** Bildnachricht* @Author Jon*/Public Class Imagemessage erweitert Basemessage {// Pic Link private String picurl; public String GetPicurl () {return picurl; } public void setpicurl (String picurl) {picurl = picurl; }} 8) videomessage.java Videomobilie
Paket cn.jon.wechat.message.req; public class videomessage erweitert Basemessage {private String mediaId; private String thumbmediaid; public String GetMediaId () {return MediaId; } public void setMediaId (String mediaId) {this.mediaId = mediaId; } public String GetThumbMediaId () {return thumbmediaid; } public void settHumbMediaId (String thumbmediaid) {thumbmediaid = thumbmediaid; }}Andere Nachrichtenklassen können von selbst basierend auf der Dokumentation des Entwicklers von selbst abgeschlossen werden. Darüber hinaus können Entwickler ein Testkonto für öffentliche Plattform beantragen, um den relevanten Inhalt der Entwicklung zu testen.
Dieser Artikel wurde in "Android Wechat Development Tutorial Summary" zusammengestellt, und "Java Wechat Development Tutorial Summary" begrüßt alle zum Lernen und Lesen.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.