Entwicklungsmethode für die öffentliche WeChat-Plattform, um die langfristige Gültigkeit von access_token sicherzustellen

高洛峰
Freigeben: 2017-03-22 15:54:03
Original
2790 Leute haben es durchsucht

Um Drittentwicklern die Bereitstellung wertvollerer personalisierter Dienste für Benutzer zu ermöglichen, hat die öffentliche WeChat-Plattform viele Schnittstellen geöffnet, darunter benutzerdefinierte Menüschnittstellen, Kundendienstschnittstellen, Schnittstellen zur Erfassung von Benutzerinformationen, Schnittstellen zur Benutzergruppierung und Gruppenversand Schnittstellen usw. Wenn Entwickler diese Schnittstellen aufrufen, müssen sie denselben Parameter access_token übergeben, der das global eindeutige Ticket des öffentlichen Kontos und die Anmeldeinformationen für den Schnittstellenzugriff darstellt.

Die Gültigkeitsdauer von access_token beträgt 7200 Sekunden (zwei Stunden). Während der Gültigkeitsdauer kann es jederzeit verwendet werden. Erst wenn das access_token abläuft, müssen Sie die Schnittstelle erneut aufrufen, um das access_token zu erhalten. Unter idealen Umständen muss ein System, das 7x24 Stunden läuft, den access_token nur 12 Mal am Tag, also einmal alle 2 Stunden, abrufen. Wenn das access_token innerhalb des Gültigkeitszeitraums erneut abgerufen wird, ist das zuletzt abgerufene access_token ungültig.

Derzeit ist die Aufrufhäufigkeit der get-access_token-Schnittstelle auf 2000 Mal pro Tag begrenzt. Wenn Sie jedes Mal eine Kundendienstnachricht senden, Benutzerinformationen abrufen oder eine Gruppennachricht senden, müssen Sie zuerst get anrufen access_token-Schnittstelle zum Erhalten der Schnittstellen-Zugangsdaten ist offensichtlich unzumutbar. Einerseits ist es zeitaufwändiger (ein weiterer Schnittstellenaufrufvorgang), andererseits reicht das Limit von 2000 Aufrufen möglicherweise nicht aus. Daher müssen wir in praktischen Anwendungen das erhaltene access_token speichern und dann regelmäßig die access_token-Schnittstelle aufrufen, um es zu aktualisieren und sicherzustellen, dass das entnommene access_token jederzeit gültig ist.

Im Folgenden wird erläutert, wie Sie access_token regelmäßig abrufen und speichern. Bitte beachten Sie: Dies ist kein Artikel, der erklärt, wie man die Schnittstelle zum Abrufen von access_token aufruft. Informationen zum Abrufen von access_token finden Sie im Artikel „WeChat Public Account Development Tutorial Teil 14 – Benutzerdefinierte Menüerstellung und Menüereignisreaktion“.

Lassen Sie uns eine kurze Analyse durchführen, bevor wir Maßnahmen ergreifen. Wir müssen lediglich die folgenden zwei Probleme lösen:

1. Wie erhält man den Access_token regelmäßig?

Wenn Sie in Java eine Aufgabe regelmäßig ausführen möchten, müssen Sie die Klasse java.util.Timer verwenden. Für diejenigen, die gerne Frameworks verwenden, können Sie das Open-Source-Taskplanungs-Framework Quartz verwenden Das Federgerüst unterstützt auch Quarz. Darüber hinaus besteht eine andere Methode darin, einen Thread zu starten, eine Endlosschleife in die run()-Methode des Threads zu schreiben und dann Thread.sleep() zu verwenden, um sicherzustellen, dass der Thread regelmäßig eine bestimmte Aufgabe ausführt.

2. Wo wird das access_token gespeichert?

Für die Speicherung von access_token können Sie erwägen, es in einer Datei, Datenbank oder im Speicher zu speichern. Die spezifische Speichermethode muss entsprechend der tatsächlichen Situation des Projekts bestimmt werden. Wenn nur ein Server vorhanden ist, ist das Speichern von access_token direkt im Speicher die einfachste und effektivste Möglichkeit.

In diesem Artikel demonstriert der Autor den Prozess des regelmäßigen Abrufens und Speicherns von access_token wie folgt: Laden eines Servlets beim Start des Webservers, Starten eines Threads in der init()-Methode des Servlets und Ausführen des Threads () In der Methode wird access_token regelmäßig über eine Endlosschleife + Thread.sleep() abgerufen und dann das erhaltene access_token in einer durch öffentliche Statik geänderten Variablen gespeichert.

Erstellen Sie eine InitServlet-Klasse im Projekt:

package org.liufeng.weixin.servlet;    
    
import javax.servlet.ServletException;    
import javax.servlet.http.HttpServlet;    
import org.liufeng.weixin.thread.TokenThread;    
import org.liufeng.weixin.util.WeixinUtil;    
import org.slf4j.Logger;    
import org.slf4j.LoggerFactory;    
    
/**  
 * 初始化servlet  
 *   
 * @author liuyq  
 * @date 2013-05-02  
 */    
public class InitServlet extends HttpServlet {    
    private static final long serialVersionUID = 1L;    
    private static Logger log = LoggerFactory.getLogger(WeixinUtil.class);    
    
    public void init() throws ServletException {    
        // 获取web.xml中配置的参数    
        TokenThread.appid = getInitParameter("appid");    
        TokenThread.appsecret = getInitParameter("appsecret");    
    
        log.info("weixin api appid:{}", TokenThread.appid);    
        log.info("weixin api appsecret:{}", TokenThread.appsecret);    
    
        // 未配置appid、appsecret时给出提示    
        if ("".equals(TokenThread.appid) || "".equals(TokenThread.appsecret)) {    
            log.error("appid and appsecret configuration error, please check carefully.");    
        } else {    
            // 启动定时获取access_token的线程    
            new Thread(new TokenThread()).start();    
        }    
    }    
}
Nach dem Login kopieren

Wie aus dem obigen Code ersichtlich ist, schreibt die InitServlet-Klasse nur init() neu. Methode und schreibt die Methoden doGet() und doPost() nicht neu, da wir nicht beabsichtigen, InitServlet Zugriffsanforderungen verarbeiten zu lassen. Die Implementierung der init()-Methode ist ebenfalls relativ einfach. Rufen Sie zunächst die in web.xml konfigurierten Parameter appid und appsecret ab und starten Sie dann den Thread TokenThread, um den access_token regelmäßig abzurufen.

Die Konfiguration von InitServlet in web.xml ist wie folgt:

<?xml version="1.0" encoding="UTF-8"?>    
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"    
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee     
    <a href="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" "="">http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"</a>>    
    
    <servlet>    
        <servlet-name>initServlet</servlet-name>    
        <servlet-class>    
            org.liufeng.weixin.servlet.InitServlet    
        </servlet-class>    
        <!-- 配置获取access_token所需参数appid和appsecret -->    
        <init-param>    
            <param-name>appid</param-name>    
            <param-value>wx617a123bb8bc99cd</param-value>    
        </init-param>    
        <init-param>    
            <param-name>appsecret</param-name>    
            <param-value>4d82cbbbb08714c12345b62d7hn3dcb8</param-value>    
        </init-param>    
        <load-on-startup>0</load-on-startup>    
    </servlet>    
    
    <welcome-file-list>    
        <welcome-file>index.jsp</welcome-file>    
    </welcome-file-list>    
</web-app>
Nach dem Login kopieren

Die Konfiguration von InitServlet in web.xml unterscheidet sich in mehreren Punkten von der Konfiguration eines gewöhnlichen Servlets: 1) Durch Konfigurieren von Übergeben Sie Parameter in das Servlet; 2) Konfigurieren Sie , um das Servlet zu laden, wenn der Webserver startet; keinen externen Zugriff ermöglichen.

Der Quellcode von TokenThread lautet wie folgt:

package org.liufeng.weixin.thread;    
    
import org.liufeng.weixin.pojo.AccessToken;    
import org.liufeng.weixin.util.WeixinUtil;    
import org.slf4j.Logger;    
import org.slf4j.LoggerFactory;    
    
/**  
 * 定时获取微信access_token的线程  
 *   
 * @author liuyq  
 * @date 2013-05-02  
 */    
public class TokenThread implements Runnable {    
    private static Logger log = LoggerFactory.getLogger(TokenThread.class);    
    // 第三方用户唯一凭证    
    public static String appid = "";    
    // 第三方用户唯一凭证密钥    
    public static String appsecret = "";    
    public static AccessToken accessToken = null;    
    
    public void run() {    
        while (true) {    
            try {    
                accessToken = WeixinUtil.getAccessToken(appid, appsecret);    
                if (null != accessToken) {    
                    log.info("获取access_token成功,有效时长{}秒 token:{}", accessToken.getExpiresIn(), accessToken.getToken());    
                    // 休眠7000秒    
                    Thread.sleep((accessToken.getExpiresIn() - 200) * 1000);    
                } else {    
                    // 如果access_token为null,60秒后再获取    
                    Thread.sleep(60 * 1000);    
                }    
            } catch (InterruptedException e) {    
                try {    
                    Thread.sleep(60 * 1000);    
                } catch (InterruptedException e1) {    
                    log.error("{}", e1);    
                }    
                log.error("{}", e);    
            }    
        }    
    }    
}
Nach dem Login kopieren

Zeile 23 des Codes erstellt eine Endlosschleife (permanente Ausführung) bis while(true){}; Rufen Sie die öffentliche Plattformschnittstelle auf, um das access_token abzurufen. Zeile 29 lässt den Thread 7000 Sekunden lang schlafen, bevor er ausgeführt wird. Das heißt, das access_token wird alle 7000 Sekunden abgerufen, um sicherzustellen, dass das access_token niemals abläuft. In anderen Klassen im Projekt können Sie die Schnittstellenzugriffsberechtigung access_token abrufen, indem Sie TokenThread.accessToken.getToken() aufrufen. Stellen Sie das Programm lokal bereit und führen Sie es aus. Das folgende Protokoll wird auf der Konsole angezeigt:

[INFO ] weixin api appid:wx617a123bb8bc99cd    
[INFO ] weixin api appsecret:4d82cbbbb08714c12345b62d7hn3dcb8    
[INFO ] 获取access_token成功,有效时长7200秒 token:sFopJ9lMmLl4u-ad61ojKpS0TolhN2s3SnHoI2Mh5GgdiYb35i-7DG2T2CDyQKMe
Nach dem Login kopieren

Um die Auswirkung des regelmäßigen Abrufens von access_token intuitiv zu erkennen, können Sie versuchen, den Thread festzulegen Ruhezeit in TokenThread auf 30 Sekunden oder 60 Sekunden ändern.

Das obige ist der detaillierte Inhalt vonEntwicklungsmethode für die öffentliche WeChat-Plattform, um die langfristige Gültigkeit von access_token sicherzustellen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!