In diesem Artikel wird über den ersten Schritt in der WeChat -Entwicklung, über den Zugriff auf das offizielle Konto und die Verwaltung von Access_Token sprechen.
1. Zugriff auf WeChat -offizielles Konto
Im WeChat Official Account Development Manual wird der Inhalt des Abschnitts Offizieller Kontozugriff ausführlicher geschrieben. Das Dokument besagt, dass der Zugriff auf das offizielle Konto drei Schritte erfordert, nämlich:
Tatsächlich kann Schritt 3 nicht mehr als der Schritt des Zugriffs auf das offizielle Konto angesehen werden. Nach dem Zugriff können Entwickler jedoch eine gewisse Entwicklung auf der Grundlage der vom offiziellen WeChat -Konto bereitgestellten Schnittstelle durchführen.
In Schritt 1 enthält die Serverkonfiguration die Serveradresse (URL), Token und Codingaeskey.
Die Serveradresse ist die Eingangsadresse, die dem Backend des offiziellen Kontos Geschäftslogik bietet. Derzeit unterstützt es nur Port 80. Danach müssen die Zugriffsüberprüfung und andere Betriebsanforderungen (z. B. Senden von Nachrichten, Menüverwaltung, Materialverwaltung usw.) aus dieser Adresse eingegeben werden. Der Unterschied zwischen Zugriffsüberprüfung und anderen Anfragen besteht darin, dass bei der Zugriffsüberprüfung eine GET -Anforderung und wenn es sich um eine andere Zeit nach Anfrage handelt.
Der Token kann vom Entwickler ausgefüllt und als Signatur verwendet werden, um zu generieren (das Token wird mit dem in der Grenzflächen -URL enthaltenen Token verglichen, um die Sicherheit zu überprüfen).
Codingaeskey wird vom Entwickler manuell ausgefüllt oder zufällig generiert und wird als verschlüsselter Entschlüsselungsschlüssel verwendet. In diesem Beispiel sind alle unverschlüsselte Klartextnachrichten, und dieses Konfigurationselement ist nicht beteiligt.
Schritt 2: Überprüfen Sie die Gültigkeit der Serveradresse. Wenn Sie auf die Schaltfläche "Senden" klicken, sendet der WeChat -Server eine HTTP -Anforderung an die gerade ausgefüllte Serveradresse und verfügt über vier Parameter:
Nach Erhalt der Anfrage müssen wir die folgenden drei Schritte ausführen. Wenn wir bestätigen, dass die GET -Anforderung vom WeChat -Server stammt und den Echostr -Parameterinhalt so zurückgibt, dass der Zugriff wirksam wird, sonst schlägt der Zugriff fehl.
Der Code kann sprechen. Im Folgenden ist ein Eintragsdervy i definiert, bei dem die Verifikationsmethode in der DoGet -Methode definiert ist:
// tokenprivate final String token = "fengzheng"; Protected Void DoGet (httpServletRequest -Anforderung, httpServletResponse -Antwort) löst ServletException aus, ioException {System.out.println ("Signaturverifizierung starten"); String Signature = Request.GetParameter ("Signatur"); String timestamp = request.getParameter ("timestamp"); String nonce = request.getParameter ("nonce"); String echoStr = request.getParameter ("echostr"); ArrayList <string> array = new ArrayList <string> (); Array.Add (Signatur); array.add (timestamp); array.add (nonce); // sortieren string sortstring = sort (token, timestamp, nonce); // String string myToken = Descript.sha1 (Sortstring); // Unterschrift if (myToken! = Null && myToken! response.getWriter (). println (echostr); // Wenn die Überprüfung erfolgreich ausgegeben wird, bestätigt der WeChat -Server, dass die Überprüfung erst nach Empfang dieser Ausgabe abgeschlossen ist. } else {System.out.println ("Signaturverifizierung fehlgeschlagen."); }} /** * methode sortieren * @param token * @param timestamp * @param nonce * @return * /public static String sort (String Token, String Timestamp, String nonce) {String [] Strarrray = {Token, Timestamp, Nonce}; Arrays.sort (Strarrray); StringBuilder sbuilder = new StringBuilder (); für (string str: strarrray) {sbuilder.Append (str); } return sbuilder.toString ();}Der folgende Code ist die Verschlüsselungsmethode:
public class Descript {public static String sha1 (String-Deskript) {try {MessagedIGest digest = MessagedIGest .getInstance ("SHA-1"); Digest.Update (Descript.getBytes ()); Byte MessagedIGest [] = digest.Digest (); // Hex String StringBuffer HexString = new StringBuffer () erstellen; // Byte -Array in Hexadezimalzahl für (int i = 0; i <MessagedIGest.length; i ++) {String shahex = Integer.TohexString (MessagedIGest [i] & 0xff) konvertieren; if (shahex.length () <2) {hexstring.Append (0); } hexstring.Append (Shahex); } return hexstring.toString (); } catch (nosuchalgorithmException e) {e.printstacktrace (); } zurückkehren ""; }}Das vom Servlet abgebildete XML ist wie folgt:
<servlet> <Servlet-name> starten </servlet-name> <servlet-classe> org.fengzheng.wechat.start </Servlet-Class> </Servlet> <Servlet-Mapping> <Servlet-name> Start </Servlet-name> <url-patter
Ich verwende die Intellij Idea+Tomcat7.0 -Entwicklung hier, starten Sie das Projekt direkt und verwenden Sie dann NGROK, um den lokalen 8080 -Port dem externen Netzwerk abzubilden. Geben Sie die offizielle Kontoverwaltungsschnittstelle für die WeChat -Test ein, geben Sie die zugeordnete externe Netzwerkadresse ein und Token in den Interface -Konfigurationsinformationen.
Klicken Sie auf die Schaltfläche Senden und die Seite fordern, dass die Konfiguration erfolgreich ist.
Sie gehen in die IDE und sehen die Informationsausgabe in der Konsole
2. Access_Token Management
Vor Access_Token sind zwei wichtige Parameter bekannt. Diese beiden Parameter sind Appid und Appsecret. Dies wird dem offiziellen Konto automatisch zugewiesen, wenn ein offizielles Konto beantragt wird. Es entspricht der Identitätsmarke des offiziellen Kontos. Diese beiden Parameter werden in vielen Schnittstellen benötigt. Als nächstes sind diese beiden Parameter bei Anforderung access_token erforderlich.
Nachdem das offizielle Konto erfolgreich zugegriffen wurde, muss die entsprechende Logik implementiert werden. Bei der Verwendung der offiziellen Account -Schnittstelle von WeChat fand ich, dass für viele Anfragen Access_Token erforderlich ist. Access_Token ist der globale einzigartige Anmeldeinformationen des offiziellen Kontos. Access_Token ist erforderlich, wenn jede Schnittstelle des offiziellen Kontos aufgerufen wird. Entwickler müssen es richtig sparen. Die Speicherung von Access_Token muss mindestens 512 Zeichenraum behalten. Die Gültigkeitsdauer von Access_Token beträgt derzeit 2 Stunden und muss regelmäßig aktualisiert werden. Die wiederholte Erfassung führt dazu, dass das, das Sie beim letzten Mal erhalten haben, ungültig ist. Und die obere Grenze der Access_Token -Schnittstelle wird täglich 2.000 Mal aufgerufen.
Um die obige Erläuterung zusammenzufassen, muss Access_Token die folgenden zwei Punkte ausführen:
In dieser Hinsicht ist die hier angewandte Lösung wie folgt: Definieren Sie ein Standard -Start -D -Servlet, starten Sie einen Thread in der Init -Methode und definieren Sie eine Infinite -Schleifenmethode in diesem Prozess, um Access_Token zu erhalten. Wenn die Akquisition erfolgreich ist, schläft der Prozess 7000 Sekunden lang, andernfalls schläft er 3 Sekunden lang, um weiterhin zu erhalten. Das Flussdiagramm lautet wie folgt:
Das Folgende ist die obige Idee, die im Projekt implementiert wurde, da die zurückgegebenen Daten im JSON -Format enthalten sind. Andere nachfolgende Schnittstellen werden ebenfalls verwendet.
1. Definieren Sie eine AccessToken -Einheit
public class AccessToken {public String getAccessToken () {return accessToken; } public void setAccessToken (String AccessToken) {this.accessToken = AccessToken; } public int getExpiresin () {return läuft aus; } public void setExpiressin (int expiresin) {this.expiresin = expiresin; } private String AccessToken; Privat int läuft aus; } 2. Definieren Sie ein Standard-Start-Servlet, starten Sie einen Thread in der Init-Methode und setzen Sie diesen Servlet auf das Standard-Selbststart in web.xml.
importieren javax.servlet.servletException; import javax.servlet.annotation java.io.ioxception; @webservlet (name = "accessTokenServlet") öffentliche Klasse AccessTokenServlet erweitert HttpServlet {public void init () löscht servleTexception {tokenthRead.appid = getInitParameter ("appid"); // Erhalten Sie die ersten Parameter von Servlet Appid und Appsecret tokenthread.appsecret = getInitParameter ("Appsecret"); System.out.println ("Appid:"+tokentHread.Appid); System.out.println ("Appsecret:"+tokenthread.appsecret); neuer Thread (neuer TokentHread ()). start (); // Starten Sie den Prozess} Protected void Dopost (httpServletRequest -Anforderung, HttpServletResponse -Antwort) löscht ServletException, IOException {} Protected void dagget (httpServletRetRequest -Anforderung, HttpletResponse -Antwort). Setzen Sie Servlet Autostart in web.xml und setzen Sie die Initialisierungsparameter Appid und AppSecret fest
<servlet> <Servlet-name> InitaccessTokenServlet </Servlet-name> <Servlet-Class> org.fengzheng.wechat.accessToken.accessTokenServlet </Servlet-Class> <init-param> <param-name> appid </param-value> </appid </param-value> </init-paraLue> appid </param-value> </</init-Param> </appid </param-value> </</init-Param> </appid </param-value <Param-name> appsecret </param-name> <param-value> Ihr appsecret </param-value> </init-param> <lade-on-startup> 0 </load-on-Startup> </servlet>
3. Definieren Sie die Thread -Klasse, rufen Sie Access_Token in dieser Klasse auf, um die Schnittstelle zu erhalten, und werden Sie die resultierenden Daten an eine statische Entität für die Verwendung an anderen Stellen abstrahieren. Die Schnittstellenadresse lautet https://api.weixin.qq.com/cgi-ner/token?grant_type=client_credential&appid=appid&secret=appsecret, wobei Grant_type als Client_Credential fixiert geschrieben ist. Diese Anfrage ist eine HTTPS -Anforderung, und das zurückgegebene Datenformat lautet {"access_token": "Access_token", "expires_in": 7200}.
Die Implementierung der Prozessklassen ist wie folgt:
Importieren com.alibaba.fastjson.json; import com.alibaba.fastjson.jsonObject; import org.fengzheng.wechat.common.networkhelper; public class tokenthread implements runnable {public static string appid = ""; public static String appsecret = ""; <br> // Beachten Sie, dass es statische öffentliche statische AccessToken AccessToken = null ist; public void run () {while (true) {try accessToken = this.getAccessToken (); if (null! Thread.Sleep (7000 * 1000); // 7000 Sekunden lang access_token in den Schlaf erhalten} else {thread.sleep (1000*3); // Das erhaltene Access_Token ist leerer Schlaf für 3 Sekunden}} catch (Ausnahme e) {System.out.println ("Ausnahme kommt:"+e.getMessage ()); E. printstacktrace (); try {thread.sleep (1000*10); // Die Ausnahme tritt auf, 1 Sekunden lang zu schlafen} catch (Ausnahme E1) {}}}}}/** * access_token * @return */private accessToken getAccesToken () {networkHelper nethelper = new NetworkHelper (); String url = string.format ("https://api.weixin.qqq.com/cgi-bin/token?grant_type=client_credential&appid=%S&secret=%s", this.appid, this.appsecret); String result = nethelper.gethttpsResponse (URL, ""); System.out.println (Ergebnis); //Response.getWriter().println(Result); JsonObject json = json.ParseObject (Ergebnis); AccessToken Token = new AccessToken (); token.setAccessToken (json.getString ("access_token")); token.setExpiressin (json.getInteger ("expires_in")); Rückgabe -Token; }}Die GethttpsResponse -Methode in NetworkHelper fordert eine HTTPS -Adresse an, der Parameter RequestMethod ist die Zeichenfolge "GET" oder "Post" und die Standardmethode ist die GET -Methode.
Die Implementierung ist wie folgt:
public String GethttpsResponse (String Hsurl, String RequestMethod) {url url; InputStream ist = null; String resultdata = ""; try {url = new url (hsurl); HttpsurlConnection con = (httpsurlConnection) url.openconnection (); TrustManager [] tm = {XTM}; SslContext ctx = sslcontext.getInstance ("tls"); ctx.init (null, tm, null); con.setsSlsocketFactory (ctx.getSocketFactory ()); con.sethostNameVerifier (neuer HostnameVerifier () {@Override public boolean verifizieren (String arg0, sslSession arg1) {return true;}}); con.setDoInput (true); // Eingabestreams zulassen, dh Downloads,/in Android, dieses Element muss auf false con.setDooutput (false) eingestellt werden. // Ausgabeströme zulassen, dh, lädt con.setusecaches (false) hoch; // Verwenden Sie nicht Puffering if (null! // Verwenden Sie die angegebene Methode} else {con.setRequestMethod ("get"); // Get Request} is = con.getInputStream () verwenden; // Erhalten Sie den Eingabestream, und dann wird der Link tatsächlich festgelegt. InputStreamReader ISR = neuer InputStreamReader (IS); BufferedReader bufferReader = neuer bufferedReader (ISR); String inputline = ""; while ((inputline = bufferReader.readline ())! = null) {resultdata + = inputline + "/n"; } System.out.println (resultdata); Zertifikat [] certs = con.getServercertificates (); int certnum = 1; für (Zertifikatzertifikat: Zertifikate) {x509Certificate xcert = (x509certificate) cert; }} catch (Ausnahme e) {e.printstacktrace (); } return resultdata; } X509Trustmanager xtm = new x509TrustManager () {@Override public x509Certificate [] getAcceptEDISSUERS () {// Todo automatisch generierte Methode Stub return null; } @Override public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { // TODO Auto-generated method stub } @Override public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { // TODO Auto-generated method stub } };Zu diesem Zeitpunkt wird das Projekt nach der Implementierung des Codes bereitgestellt und die Konsolenausgabe wie folgt:
Um den Effekt anzuzeigen, können Sie die Schlafzeit etwas kürzer einstellen, z. B. einmal in 30 Sekunden, und dann Access_Token ausgeben. Lassen Sie uns eine Test -JSP -Seite durchführen und die Schlafzeit auf 30 Sekunden festlegen. Auf diese Weise können Sie nach 30 Sekunden die Änderungen sehen. Übrigens, wie man an anderen Orten Access_Token bekommt
< %@ page contentType = "text/html; charset = utf-8" Sprache = "java" %> < %@ page import = "org.fengzheng.wechat.accessToken.TokentHRead" %> <html <%= TokentHread.accessToken.getAccessToken ()%> </body> </html>
Durchsuchen Sie diese Seite im Browser, und der Anzeigeeffekt lautet wie folgt:
Nach 30 Sekunden aktualisiert, änderte sich dieser Wert:
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 dreht sich alles um diesen Artikel. Ich hoffe, es wird für alle hilfreich sein, ein offizielles Java Wechat -Konto zu entwickeln.