曾静的博客

但行好事,莫问前程.

嗨,我是曾静 (@devzeng),目前暂居深圳。


这是我用来记录平日学习笔记的地方,欢迎您的访问.

微信公众平台开发之access_token

wechat_development_logo.png

为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台开放了许多接口,包括自定义菜单接口、客服接口、获取用户信息接口、用户分组接口、群发接口等,开发者在调用这些接口时,都需要传入一个相同的参数access_token,它是公众账号的全局唯一票据,它是接口访问凭证。本文重点是介绍在实际的开发中如何获取access_token和如何保持获取到的access_token长期有效。

获取access_token的接口说明

以HTTP GET请求的方式向微信服务器发送请求,请求的URL格式如下:

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

1、参数说明:

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

说明:

(1)AppID和AppSecret可在开发模式中获得;

(2)注意调用所有微信接口时均需使用https协议。

2、返回数据说明:

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

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

说明如下:

参数 说明
access_token 获取到的凭证(至少有512个字符)
expires_in 凭证有效时间,单位:秒

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

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

有关errcode的说明请参考全局返回码说明中的对应描述

最佳实践

access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。正常情况下access_token有效期为7200秒,重复获取将导致上次获取的access_token失效。由于获取access_token的api调用次数非常有限,微信官方建议开发者全局存储与更新access_token,频繁刷新access_token会导致api调用受限,影响自身业务。

为了减少获取access_token的API的调用次数,在实际的开发中设计采用单例全局存储access_token的值和过期时间。具体的步骤如下:

1、获取access_token

思路是首先会判断本地有没有存储过access_token,如果有存储就判断是否过期。如果本地没有存储或存储的access_token已经过期便向微信服务器申请获取新的access_token。

public static String getAccessToken() throws Exception {

	//首先判断本地有无记录,记录是否过期 7200s

    boolean isExpired = WeChatSystemContext.getInstance().isExpired();

    if(isExpired) {
    
    	//拼接url,APPID和APPSECRET从开发者中心获取

    	String APPID = "";//APPID

    	String APPSECRET = "";//APPSECRET

        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+ APPID + "&secret=" + APPSECRET";

        //发起HTTPS的GET请求

        String jsonStr = WeChatHTTPClient.get(url);

        Map<String, Object> map = JSONObject.parseObject(jsonStr);

        String accessToken = map.get("access_token").toString();

        //记录到配置 access_token 当前时间

        WeChatSystemContext.getInstance().saveLocalAccessonToke(accessToken);

        return accessToken;

    } else {

    	//从配置中直接获取access_token 

    	return WeChatConfigSingleton.getInstance().getAccessToken();

    }

}

说明:

(1)WeChatHTTPClient这个类是封装的一个HTTP请求的工具类,用户发起http请求返回相应的数据,后续会进行介绍;

(2)JSONObject这个是一个解析JSON的第三方库fastjson

2、存储access_token的单例类

public class WeChatSystemContext {

	private String accessToken;//接口访问凭据

	private long createTime;//接口访问凭据创建时间,理论上是2小时后过期

	
	static class WeChatSystemContextHolder {

		static WeChatSystemContext instance = new WeChatSystemContext();

	}
	

	public static WeChatSystemContext getInstance() {

		return WeChatSystemContextHolder.instance;

	}
	

	//是否过期

	public boolean isExpired() {

		long time = new Date().getTime();

		//如果当前记录时间为0

		if(this.createTime <= 0) {

			return true;

		}

		//判断记录时间是否超过7200s

		if(this.createTime/1000 + 7200 < time/1000) {

			return true;

		}

		return false;

	}

	
	//记录接口访问凭证

	public void saveLocalAccessonToke(String accessToken) {

		this.accessToken = accessToken;

		this.createTime = new Date().getTime();

	}

	
	public void setAccessToken(String accessToken) {

		this.accessToken = accessToken;

	}

	public String getAccessToken() {

		return accessToken;

	}

	public void setCreateTime(long createTime) {

		this.createTime = createTime;

	}

	public long getCreateTime() {

		return createTime;

	}

}

参考资料

1、《[051] 微信公众平台开发教程第22篇-如何保证access_token长期有效》

2、《获取access token》

最近的文章

阿里云Ubuntu系统搭建SVN服务器

近期入手了一台阿里云(阿里云是国内优秀的云计算服务提供商,属于阿里巴巴旗下)的云服务器(Ubuntu系统)打算用来做WEB API的服务器,另外为了便于对数据和相关文档的管理需要在服务器上搭建SVN服务器,本文主要是用于记录如何搭建SVN服务器以及在搭建过程中遇到的一些问题。SVN服务器相关软件安装1、使用SSH远程服务器(1)对于MAC OS/Liunx的用户直接打开终端输入ssh 用户名@实例名,例如 ssh root@192.168.1.100执行上面的命令后终端会提示输入密码,验证...…

Note继续阅读
更早的文章

iOS8中的通知中心快速回复

iOS8拥有了全新的通知中心,有全新的通知机制。当屏幕顶部收到推送时只需要往下拉,就能看到快速操作界面,并不需要进入该应用才能操作。在锁屏界面,对于推送项目也可以快速处理。基本上就是让用户尽量在不离开当前页面的前提下处理推送信息,再次提高处理效率。能够进行直接互动的短信、邮件、日历、提醒,第三方应用,可以让你不用进入程序就能进行快捷操作,并专注于手中正在做的事情,用户可以做如下操作: 在通知横幅快速回复信息,不用进入短信程序; 可直接拒绝或接受邮件邀请; 可对提醒进行标记为完成或推迟...…

iOS继续阅读