Cet article parlera de la première étape du développement de WeChat, de l'accès au compte officiel et de la gestion de Access_token.
1. Accès au compte officiel de WeChat
Dans le manuel de développement officiel de WeChat, le contenu concernant la section d'accès officiel est rédigé plus en détail. Le document indique que l'accès au compte officiel nécessite trois étapes, à savoir:
En fait, l'étape 3 ne peut plus être considérée comme l'étape d'accès au compte officiel. Cependant, après accès, les développeurs peuvent faire un certain développement en fonction de l'interface fournie par le compte officiel de WeChat.
À l'étape 1, la configuration du serveur comprend l'adresse du serveur (URL), le jeton et l'encodingaeskey.
L'adresse du serveur est l'adresse d'entrée qui fournit une logique métier au backend du compte officiel. Actuellement, il ne prend en charge que le port 80. Après cela, la vérification d'accès et toutes les autres demandes d'opération (telles que l'envoi de messages, la gestion de menu, la gestion des matériaux, etc.) doivent être saisies à partir de cette adresse. La différence entre la vérification d'accès et les autres demandes est que lorsque la vérification d'accès est une demande de GET, et lorsque d'autres fois, il s'agit d'une demande de poste;
Le jeton peut être rempli par le développeur et utilisé comme signature pour générer (le jeton sera comparé au jeton contenu dans l'URL de l'interface pour vérifier la sécurité);
Encodingaeskey est rempli manuellement ou généré de manière aléatoire par le développeur et sera utilisé comme clé de décryptage crypté du corps de message. Dans cet exemple, tous sont des messages en texte clair non cryptés et cet élément de configuration n'est pas impliqué.
Étape 2: Vérifiez la validité de l'adresse du serveur. Lorsque vous cliquez sur le bouton "Soumettre", le serveur WeChat enverra une demande de GET HTTP à l'adresse du serveur que vous venez de remplir et transportera quatre paramètres:
Après avoir reçu la demande, nous devons effectuer les trois étapes suivantes. Si nous confirmons que la demande de GET provient du serveur WeChat et renvoie le contenu du paramètre ECHOSTR tel qu'il est, l'accès prendra effet, sinon l'accès échouera.
Le code peut parler. Ce qui suit est une série d'entrée I définie, dans laquelle la méthode de vérification est définie dans la méthode DoGet:
// tokenprivate final String token = "Fengzheng"; Protected void doGet (demande httpservletRequest, réponse httpservletResponse) lève ServletException, ioException {System.out.println ("Démarrer la vérification de la signature"); String Signature = request.getParameter ("Signature"); String TimeStamp = request.getParameter ("Timestamp"); String nonce = request.getParameter ("nonce"); String echoStr = request.getParameter ("eChostr"); ArrayList <string> array = new ArrayList <string> (); array.add (signature); array.add (horodat); array.add (nonce); // Tri String sortString = Sort (Token, horodat, nonce); // Encrypt String MyToken = descript.sha1 (sortstring); // Vérifiez la signature if (mytoken! = Null && myToken! = "" && mytoken.equals (signature)) {System.out.println ("Signature Verification passe."); Response.getWriter (). println (eChostr); // Si la vérification est sortie avec succès Echostr, le serveur WeChat confirmera que la vérification n'est terminée qu'après avoir reçu cette sortie. } else {System.out.println ("La vérification de la signature a échoué."); }} / ** * Méthode de tri * @param token * @param Timestamp * @param nonce * @return * / public static string sriet (String token, string himestamp, string nonce) {String [] starray = {token, horodatamp, nonce}; Arrays.sort (StraRray); StringBuilder sbuilder = new StringBuilder (); for (String str: starray) {sbuilder.append (str); } return sbuilder.toString ();}Le code suivant est la méthode de chiffrement:
classe publique Descript {public static String sha1 (String Descript) {try {MessagediGest digest = MessagediGest .getInstance ("sha-1"); digest.update (descript.getBytes ()); BYTE MessagediGest [] = digest.digest (); // Créer une chaîne hexagonale stringbuffer hexstring = new StringBuffer (); // Convertir le tableau d'octets en numéro hexadécimal pour (int i = 0; i <messagediGest.length; i ++) {String shahex = Integer.tohexString (MessagediGest [i] & 0xff); if (shahex.length () <2) {hexstring.append (0); } hexstring.append (shahex); } return hexstring.toString (); } catch (NosuchalgorithMexception e) {e.printStackTrace (); } retour ""; }}Le XML mappé par le servlet est le suivant:
<VerTlet> <Serplet-Name> START </ servlet-name> <servlet-class> org.fengzheng.wechat.start </ servlet-class> </ servlet> <servlet-mapping> <servlet-name> start </ serplet-name> <url-platern> / wechat </url-Pattern> </ serplet-mapping>
J'utilise Intellij Idea + Tomcat7.0 développement ici, démarrez directement le projet, puis j'utilise NGROK pour cartographier le port 8080 local sur le réseau externe. Entrez l'interface de gestion officielle du test de test WeChat, remplissez l'adresse réseau externe mappée et le jeton dans les informations de configuration de l'interface.
Cliquez sur le bouton Soumettre et la page invitera que la configuration est réussie.
Vous irez à l'IDE et verrez la sortie d'informations dans la console
2. Access_token Management
Avant Access_token, il y a deux paramètres importants qui doivent être connus. Ces deux paramètres sont AppID et AppSecret. Ceci est automatiquement attribué au compte officiel lors de la demande d'un compte officiel. Il équivaut à la marque d'identité du compte officiel. Ces deux paramètres sont nécessaires dans de nombreuses interfaces. Ensuite, lorsque vous demandez Access_token, ces deux paramètres sont nécessaires.
Une fois le compte officiel accessible avec succès, la logique correspondante doit être implémentée. Lorsque vous utilisez l'interface de compte officiel WeChat, j'ai constaté que de nombreuses demandes nécessitent Access_token. Access_token est l'identification unique mondiale du compte officiel. Access_token est requis lors de l'appel de chaque interface du compte officiel. Les développeurs doivent le sauver correctement. Le stockage d'accès_token doit conserver au moins 512 espaces de caractères. La période de validité de Access_token est actuellement de 2 heures et doit être rafraîchie régulièrement. L'acquisition répétée provoquera l'accès à l'accès_token que vous avez obtenu la dernière fois invalide. Et la limite supérieure de l'interface Access_token est appelée chaque jour est 2 000 fois.
Pour résumer l'explication ci-dessus, Access_token doit faire les deux points suivants:
À cet égard, la solution adoptée ici est la suivante: définir un servlet de démarrage par défaut, démarrer un thread dans la méthode init et définir une méthode de boucle infinie dans ce processus pour obtenir Access_token. Lorsque l'acquisition est réussie, le processus dort 7000 secondes, sinon il dormira pendant 3 secondes pour continuer à obtenir. Le tableau des débits est le suivant:
Ce qui suit est l'idée ci-dessus qui a été mise en œuvre dans le projet, car les données renvoyées sont en format JSON, la bibliothèque FastJSON d'Alibaba sera utilisée ici pour fournir une prise en charge de la sérialisation et de la désérialisation des données après la construction de demandes et de demandes de traitement. D'autres interfaces suivantes seront également utilisées.
1. Définir une entité AccessToken
classe publique AccessToken {public String getAccessToken () {return AccessToken; } public void setAccessToken (String AccessToken) {this.accessToken = AccessToken; } public int getExpiresin () {return expiresIn; } public void setExpiresIn (int expiresin) {this.expiresin = expiresin; } Private String AccessToken; INT privé Expiresin; } 2. Définissez un servlet de démarrage par défaut, démarrez un thread dans la méthode INIT et définissez ce servlet sur l'auto-démarrage par défaut dans web.xml.
Importer javax.servlet.servletException; import javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; importer javax.servlet.http.httpservletRequest; java.io.ioException; @webservlet (name = "AccessTokenServlet") La classe publique AccessTokenServlet étend httpServlet {public void init () lève ServletException {tokenthread.appid = getInitParamètre ("appid"); // Obtenez les paramètres initiaux de Servlet AppID et AppSecret TokentHread.AppSecret = GetInitAmter ("AppSecret"); System.out.println ("AppID:" + tokenthread.appid); System.out.println ("AppSecret:" + TokentHread.AppSecret); nouveau thread (new tokenthread ()). start (); // Démarrer le processus} Protected vid doPost (requête HttpServletRequest, HttpservletResponse Response) lance ServletException, ioException {} Protected void doget (httpservletRequest Request Response Définissez Servlet Autostart dans web.xml et définissez les paramètres d'initialisation AppID et AppSecret
<Serplet> <Serplet-Name> InitAccessTokenServlet </ Servlet-Name> <Serplet-Class> org.Fengzheng.wechat.accesstoken.AccessTokenServlet </ Servlet-Class> <Init-Param> <Param-Name> Appid </ Param-name> <Anit-Value> Votre appid </ons param-Value> <param-name> AppSecret </ param-name> <param-value> Votre appsecret </ param-value> </itnit-param> <onde-on-startup> 0 </sof-on-startup> </ servlet>
3. Définissez la classe de thread, appelez Access_token dans cette classe pour obtenir l'interface et abstriez les données résultantes à une entité statique à utiliser à d'autres endroits. L'adresse d'interface est https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=appid&secret=AppSecret, où Grant_Type est correctement écrite comme client_credential. Cette demande est une demande HTTPS GET, et le format de données renvoyé est {"Access_token": "Access_token", "Expires_in": 7200}.
La mise en œuvre de la classe de processus est la suivante:
import com.alibaba.fastjson.json; import com.alibaba.fastjson.jsonObject; import org.fengzheng.wechat.common.networkhelper; public class tokenthread implémente runnable {public static string appid = "";; La chaîne statique publique AppSecret = ""; <br> // Notez qu'il s'agit de statique statique statique AccessToken AccessToken = null; public void run () {while (true) {try {AccessToken = this.getAccessToken (); if (null! = AccessToken) {System.out.println (AccessToken.getAccessToken ()); Thread.Sleep (7000 * 1000); // Obtenez Access_Token pour dormir pendant 7000 secondes} else {Thread.Sleep (1000 * 3); // l'accès_token obtenu est un sommeil vide pendant 3 secondes}} catch (exception e) {System.out.println ("L'exception se produit:" + e.getMessage ()); e.printStackTrace (); essayez {thread.sleep (1000 * 10); // L'exception se fait dormir pendant 1 seconde} catch (exception e1) {}}}}} / ** * get Access_Token * @return * / private AccessToken getAccessToken () {NetworkHelper Nethelper = new NetworkHelper (); String url = string.format ("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%S&secret=%S", this.appid, this.appSecret); Résultat de la chaîne = nethelper.gethttpsResponse (URL, ""); System.out.println (résultat); //Response.getWriter().println(Sult); JSONObject JSON = JSON.ParseObject (résultat); AccessToken Token = new AccessToken (); token.setAccessToken (json.getString ("Access_token")); token.setExpiresIn (json.getInteger ("expires_in")); Token de retour; }}La méthode GETHTTPSRESPONNE dans NetworkHelper demande une adresse HTTPS, le paramètre RequestMethod est la chaîne "Get" ou "Post", et la valeur par défaut est la méthode GET.
La mise en œuvre est la suivante:
public String gethTTPSResponse (String hsurl, string requestMethod) {url url; InputStream est = 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.SETSSLSOCKINGFACTORY (ctx.getSocketFactory ()); con.sethostNameVerifier (new hostNameverifier () {@Override public boolean vérifie (String arg0, sslSession arg1) {return true;}}); con.setDoInput (true); // Autoriser les flux d'entrée, c'est-à-dire les téléchargements, / dans Android, cet élément doit être défini sur false con.setDoOutput (false); // Autoriser les flux de sortie, c'est-à-dire les téléchargements con.seTUseCaches (false); // N'utilisez pas de mémoire tampon if (null! = RequestMethod &&! RequestMethod.equals ("")) {con.setRequestMethod (requestMethod); // utilise la méthode spécifiée} else {con.setRequestMethod ("get"); // Utiliser Get Request} est = con.getInputStream (); // Obtenez le flux d'entrée, puis le lien est réellement établi. InputStreamReader ISR = new inputStreamReader (IS); BufferedReader BufferReader = new BufferedReader (ISR); String inputLine = ""; while ((inputLine = bufferReader.readline ())! = null) {resultData + = inputline + "/ n"; } System.out.println (resultData); Certificate [] certs = con.getServerCertificates (); int certnum = 1; pour (certificat Cert: certs) {x509Certificate xcert = (x509Certificate) cert; }} catch (exception e) {e.printStackTrace (); } return resultData; } X509TrustManager xtm = new x509TrustManager () {@Override public x509certificate [] getAcceptEdSisuers () {// TODO Méthode générée automatique Stub Null; } @Override public void CheckServerTruted (x509Certificate [] arg0, String arg1) lève CertificateException {// TODO Auto-Generated Method Stub} @Override public Void CheckClientTruted (x509Certificate [] Arg0, String Arg1) Throws CertificateException {// TODO Generated Method Stub O);À ce stade, une fois le code implémenté, le projet est déployé et la sortie de la console est la suivante:
Pour afficher l'effet, vous pouvez définir le temps de sommeil un peu plus court, comme l'obtenir une fois en 30 secondes, puis en sortant Access_token. Faisons une page JSP de test et définissons le temps de sommeil à 30 secondes. De cette façon, après 30 secondes, vous pouvez voir les changements. Au fait, comment obtenir Access_token dans d'autres endroits
<% @ Page ContentType = "Text / Html; charSet = UTF-8" Language = "Java"%> <% @ page import = "org.fengzheng.wechat.accesstoken.tokenthread"%> <html> <adhead> <t titre> </ title> </ head> <body> Access_token est: <% = Tokenthread.accesstoken.getAccessToken ()%> </ body> </html>
De cette façon, parcourez cette page sur le navigateur, et l'effet d'affichage est le suivant:
Rafraîchis après 30 secondes, cette valeur a changé:
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 concerne cet article. J'espère qu'il sera utile pour tout le monde de développer un compte officiel de Java WeChat.