access_token의 장기적인 유효성을 보장하기 위한 WeChat 공개 플랫폼 개발 방법

高洛峰
풀어 주다: 2017-03-22 15:54:03
원래의
2863명이 탐색했습니다.

제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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿