제3자 개발자가 사용자에게 보다 가치 있는 개인화 서비스를 제공할 수 있도록 WeChat 공개 플랫폼은 사용자 정의 메뉴 인터페이스, 고객 서비스 인터페이스, 사용자 정보 수집 인터페이스, 사용자 그룹화 인터페이스, 그룹 전송을 포함한 많은 인터페이스를 개방했습니다. 인터페이스 등. 개발자가 이러한 인터페이스를 호출할 때 공용 계정의 전역적으로 고유한 티켓이자 인터페이스 액세스 자격 증명인 동일한 매개변수 access_token을 전달해야 합니다.
access_token의 유효 기간은 7200초(2시간)이며, 유효 기간 동안에는 access_token이 만료된 경우에만 인터페이스를 다시 호출해야 access_token을 얻을 수 있습니다. 이상적인 상황에서 7x24시간 실행되는 시스템은 하루에 12번, 즉 2시간에 한 번만 access_token을 획득하면 됩니다. 유효기간 내에 다시 access_token을 획득할 경우, 지난번 획득한 access_token은 무효화됩니다.
현재 get access_token 인터페이스의 호출 빈도는 하루 2000회로 제한되어 있습니다. 고객 서비스 메시지를 보내거나 사용자 정보를 얻거나 그룹 메시지를 보낼 때마다 먼저 get을 호출해야 합니다. access_token 인터페이스를 사용하면 인터페이스 액세스 자격 증명을 얻을 수 있습니다. 한편으로는 시간이 더 많이 소요되지만(인터페이스 호출 작업이 한 번 더 필요함) 하루에 2000번의 호출 제한이 충분하지 않을 수도 있습니다. 따라서 실제 응용에서는 획득한 access_token을 저장한 다음 정기적으로 access_token 인터페이스를 호출하여 업데이트하여 언제든지 꺼내는 access_token이 유효한지 확인해야 합니다.
다음에서는 정기적으로 access_token을 획득하고 저장하는 방법을 소개합니다. 참고: 이 글은 access_token을 얻기 위해 인터페이스를 호출하는 방법을 설명하는 글이 아닙니다. access_token을 얻는 방법에 대한 자세한 내용은 "WeChat 공개 계정 개발 튜토리얼 14부 - 사용자 정의 메뉴 생성 및 메뉴 이벤트 응답" 글을 참조하세요.
조치를 취하기 전에 간단히 분석해 보겠습니다. 우리가 해결해야 할 것은 다음 두 가지 문제뿐입니다.
1. access_token을 정기적으로 얻는 방법은 무엇입니까?
Java에서 정기적으로 작업을 실행하려면 java.util.Timer 클래스를 사용해야 합니다. 프레임워크를 사용하려는 경우 오픈 소스 작업 스케줄링 프레임워크인 quartz를 사용할 수 있습니다. Spring 프레임워크는 Quartz도 지원합니다. 또한 또 다른 방법은 스레드를 시작하고 스레드의 run() 메서드에 무한 루프를 작성한 다음 Thread.sleep()을 사용하여 스레드가 특정 작업을 정기적으로 실행하는지 확인하는 것입니다.
2. access_token은 어디에 저장하나요?
access_token 저장의 경우 파일, 데이터베이스 또는 메모리에 저장하는 것을 고려할 수 있습니다. 사용되는 구체적인 저장 방법은 프로젝트의 실제 상황에 따라 결정되어야 합니다. 서버가 하나만 있는 경우에는 access_token을 메모리에 직접 저장하는 것이 가장 간단하고 효과적인 방법입니다.
이 기사에서 저자는 웹 서버가 시작될 때 서블릿을 로드하고, 서블릿의 init() 메서드에서 스레드를 시작하고, 스레드 실행에서 정기적으로 access_token을 획득하고 저장하는 프로세스를 보여줍니다. () 해당 메소드에서는 무한루프 + Thread.sleep()을 통해 정기적으로 access_token을 획득하고, 획득한 access_token을 public static으로 수정한 변수에 저장합니다.
프로젝트에 InitServlet 클래스를 생성합니다.
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(); } } }
위 코드에서 볼 수 있듯이 InitServlet 클래스는 init() 메서드만 재정의하고 InitServlet이 액세스 요청을 처리하도록 할 의도가 없기 때문에 doGet() 및 doPost() 메서드를 재정의하지 않습니다. init() 메소드의 구현도 상대적으로 간단합니다. 먼저 web.xml에 구성된 appid 및 appsecret 매개변수를 얻은 다음 TokenThread 스레드를 시작하여 정기적으로 access_token을 얻습니다.
web.xml의 InitServlet 구성은 다음과 같습니다.
<?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>
web.xml의 InitServlet 구성은 여러 가지 점에서 일반 Servlet 구성과 다릅니다. 1) <를 구성하여 ;init-param> ; Servlet에 매개변수를 전달합니다. 2) 웹 서버가 시작될 때 Servlet을 로드하도록 구성합니다. 3) InitServlet이 제공하지 않으므로 구성되지 않습니다. 외부 액세스.
TokenThread의 소스 코드는 다음과 같습니다.
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); } } } }
코드의 23행은 while(true){}를 호출하여 무한 루프(영구 실행)를 구성합니다. public 플랫폼 인터페이스는 access_token을 얻습니다. 29행에서는 스레드가 실행되기 전에 7000초 동안 휴면 상태로 유지됩니다. 즉, access_token이 만료되지 않도록 7000초마다 access_token을 얻습니다. 프로젝트의 다른 클래스에서는 TokenThread.accessToken.getToken()을 호출하여 인터페이스 액세스 자격 증명 access_token을 얻을 수 있습니다. 프로그램을 로컬로 배포하고 실행하면 Tomcat이 시작되면 콘솔에 다음 로그가 표시됩니다.
[INFO ] weixin api appid:wx617a123bb8bc99cd [INFO ] weixin api appsecret:4d82cbbbb08714c12345b62d7hn3dcb8 [INFO ] 获取access_token成功,有效时长7200秒 token:sFopJ9lMmLl4u-ad61ojKpS0TolhN2s3SnHoI2Mh5GgdiYb35i-7DG2T2CDyQKMe
정기적으로 access_token을 얻는 효과를 직관적으로 확인하려면 스레드 절전 시간을 수정해 볼 수 있습니다. TokenThread에서 30초 또는 60초로 설정합니다.
위 내용은 access_token의 장기적인 유효성을 보장하기 위한 WeChat 공개 플랫폼 개발 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!