微信公众号开发 定时获取AccessToken

接口调用请求说明

https请求方式: GET  https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

参数说明

参数                  是否必须        说明
grant_type          是           获取access_token填写client_credential
appid               是           第三方用户唯一凭证
secret              是           第三方用户唯一凭证密钥,即appsecret

返回说明

正常情况下,微信会返回下述JSON数据包给公众号:

{"access_token":"ACCESS_TOKEN","expires_in":7200}

错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):

{"errcode":40013,"errmsg":"invalid appid"}

由开发者档案可以知道,accesstoken每天获取2000次,每次的有效时长是7200秒,及2小时。
我们可以将accesstoken获取后存储在数据库中,每2小时刷新一次,也可以保存在内存里,等等。
博主这里新建了一个servlet,在init()里写了个死循环,创建线程,获取accesstoken,休眠7000秒(预留200秒)。

servlet:

public class InitServlet extends HttpServlet {
    public void init() throws ServletException {
        TokenThread.appid = getInitParameter("appid");
        TokenThread.appsecret = getInitParameter("appsecret");
        new Thread(new TokenThread()).start();
    }
}

thread:

public class TokenThread implements Runnable {
    public static String appid="";
    public static String appsecret="";
    public static AccessToken accesstoken=null;
    public void run() {
        while (true) {
            try {
                accesstoken=GetAccessToken.getInterfaceToken(appid, appsecret);
                if (null!=accesstoken) {
                    System.out.println("获取accesstoken成功,accesstoken:"+accesstoken.getAccess_token()+" 有效时间为"+accesstoken.getExpires_in());
                    Thread.sleep((accesstoken.getExpires_in()-200)*1000);//休眠7000秒
                }
                else {
                    Thread.sleep(60*1000);
                }
            } catch (Exception e) {
                System.out.println(e.getMessage());
                System.out.println("正在重新获得accesstoken");
                try {
                    Thread.sleep(60*1000);
                } catch (Exception e2) {
                    System.out.println(e2.getMessage());
                }
            }
        }
    }
}

getAccessToken():

public class GetAccessToken {
    public final static String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";

    public static AccessToken getInterfaceToken(String appid, String appsecret) {
        AccessToken accessToken = null;
        String requestUrl = access_token_url.replace("APPID", appid).replace(
                "APPSECRET", appsecret);
        new InterfaceUtil();
        JSONObject jsonObject = InterfaceUtil.httpRequest(requestUrl, "GET",
                null);
        if (null != jsonObject) {
            try {
                accessToken = new AccessToken();
                accessToken.setAccess_token(jsonObject
                        .getString("access_token"));
                accessToken.setExpires_in(jsonObject.getInt("expires_in"));
            } catch (Exception e) {
                accessToken = null;
                System.out.println(e.getMessage());
            }
        }
        return accessToken;

    }
}

accesstoken pojo:

/*
 * access_token格式:json
 * {"access_token":"ACCESS_TOKEN","expires_in":7200}
 * @param access_token 获取到的凭证
 * @param expires_in 凭证有效时间,单位:秒
 */
public class AccessToken {
    private String access_token;
    private int expires_in;
    public AccessToken(String access_token, int expires_in) {
        super();
        this.access_token = access_token;
        this.expires_in = expires_in;
    }
    public AccessToken() {
        super();
    }
    public String getAccess_token() {
        return access_token;
    }
    public void setAccess_token(String access_token) {
        this.access_token = access_token;
    }
    public int getExpires_in() {
        return expires_in;
    }
    public void setExpires_in(int expires_in) {
        this.expires_in = expires_in;
    }

}

InitServlet在web.xml中的配置与普通Servlet的配置有几点区别:1)通过配置向Servlet中传入参数;2)通过配置使得Web服务器启动时就加载该Servlet;3)没有配置,因为InitServlet并不对外提供访问。
web.xml:

 <servlet>
  <servlet-name>AccessToken</servlet-name>
  <servlet-class>com.grxa.servlet.InitServlet</servlet-class>
  <init-param>
  <param-name>appid</param-name>
  <param-value>wxdb27fc2590eac6a5</param-value>
  </init-param>
  <init-param>
  <param-name>appsecret</param-name>
  <param-value>e9601e65ef89532a2e060a6bf2696372</param-value>
  </init-param>
  <load-on-startup>0</load-on-startup>
  </servlet>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值