微信公众平台获取access_token的方法步骤
前言:access_token是微信公众平台接口的重要参数,很多接口都需要这个参数。
微信公众平台文档地址:
一、access_token说明
access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
1:公众平台的api调用所需的access_token的使用
1、建议公众号开发者使用中控服务器统一获取和刷新access_token,其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致access_token覆盖而影响业务;
2、目前access_token的有效期通过返回的expire_in来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新access_token。在刷新过程中,中控服务器对外输出的依然是老access_token,此时公众平台后台会保证在刷新短时间内,新老access_token都可用,这保证了第三方业务的平滑过渡;
3、access_token的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token的接口,这样便于业务服务器在api调用获知access_token已超时的情况下,可以触发access_token的刷新流程。
2:access_token的生成说明
公众号可以使用appid和appsecret调用本接口来获取access_token。appid和appsecret可在“微信公众平台-开发-基本配置”页中获得(需要已经成为开发者,且帐号没有异常状态)。调用接口时,请登录“微信公众平台-开发-基本配置”提前将服务器ip地址添加到ip白名单中,点击查看设置方法,否则将无法调用成功。
二、接口调用请求说明
1:接口调用
https请求方式: get
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=appid&secret=appsecret
2:参数说明
参数 | 是否必须 | 说明 |
---|---|---|
grant_type | 是 | 获取access_token填写client_credential |
appid | 是 | 第三方用户唯一凭证 |
secret | 是 | 第三方用户唯一凭证密钥,即appsecret |
3:返回说明
正常情况下,微信会返回下述json数据包给公众号:
{"access_token":"access_token","expires_in":7200}
参数说明
参数 | 说明 |
---|---|
access_token | 获取到的凭证 |
expires_in | 凭证有效时间,单位:秒 |
错误时微信会返回错误码等信息,json数据包示例如下(该示例为appid无效错误):
{"errcode":40013,"errmsg":"invalid appid"}
4:返回码说明
返回码 | 说明 |
---|---|
-1 | 系统繁忙,此时请开发者稍候再试 |
0 | 请求成功 |
40001 | appsecret错误或者appsecret不属于这个公众号,请开发者确认appsecret的正确性 |
40002 | 请确保grant_type字段值为client_credential |
40164 | 调用接口的ip地址不在白名单中,请在接口ip白名单中进行设置 |
三、java接口开发
1:返回接口封装类token
/** * 类名: token.java</br> * 描述: 凭证</br> */ public class token { // 接口访问凭证 private string accesstoken; // 凭证有效期,单位:秒 private int expiresin; public string getaccesstoken() { return accesstoken; } public void setaccesstoken(string accesstoken) { this.accesstoken = accesstoken; } public int getexpiresin() { return expiresin; } public void setexpiresin(int expiresin) { this.expiresin = expiresin; } }
2:获取接口访问凭证
/** * 获取接口访问凭证 * @param appid 凭证 * @param appsecret 密钥 * @return */ public static token gettoken(string appid, string appsecret) { token token = null; string requesturl = weixinconstants.token_url.replace("appid", appid).replace("appsecret", appsecret); // 发起get请求获取凭证 jsonobject jsonobject = httpsrequest(requesturl, "get", null); if (null != jsonobject) { try { token = new token(); token.setaccesstoken(jsonobject.getstring("access_token")); token.setexpiresin(jsonobject.getint("expires_in")); } catch (jsonexception e) { token = null; // 获取token失败 log.error("获取token失败 errcode:{} errmsg:{}", jsonobject.getint("errcode"), jsonobject.getstring("errmsg")); } } return token; }
3:http请求工具类
/** * 发送https请求 * @param requesturl 请求地址 * @param requestmethod 请求方式(get、post) * @param outputstr 提交的数据 * @return jsonobject(通过jsonobject.get(key)的方式获取json对象的属性值) */ public static jsonobject httpsrequest(string requesturl, string requestmethod, string outputstr) { jsonobject jsonobject = null; try { // 创建sslcontext对象,并使用我们指定的信任管理器初始化 trustmanager[] tm = { new myx509trustmanager() }; sslcontext sslcontext = sslcontext.getinstance("ssl", "sunjsse"); sslcontext.init(null, tm, new java.security.securerandom()); // 从上述sslcontext对象中得到sslsocketfactory对象 sslsocketfactory ssf = sslcontext.getsocketfactory(); url url = new url(requesturl); httpsurlconnection conn = (httpsurlconnection) url.openconnection(); conn.setsslsocketfactory(ssf); conn.setdooutput(true); conn.setdoinput(true); conn.setusecaches(false); // 设置请求方式(get/post) conn.setrequestmethod(requestmethod); // 当outputstr不为null时向输出流写数据 if (null != outputstr) { outputstream outputstream = conn.getoutputstream(); // 注意编码格式 outputstream.write(outputstr.getbytes("utf-8")); outputstream.close(); } // 从输入流读取返回内容 inputstream inputstream = conn.getinputstream(); inputstreamreader inputstreamreader = new inputstreamreader(inputstream, "utf-8"); bufferedreader bufferedreader = new bufferedreader(inputstreamreader); string str = null; stringbuffer buffer = new stringbuffer(); while ((str = bufferedreader.readline()) != null) { buffer.append(str); } // 释放资源 bufferedreader.close(); inputstreamreader.close(); inputstream.close(); inputstream = null; conn.disconnect(); jsonobject = jsonobject.fromobject(buffer.tostring()); } catch (connectexception ce) { log.error("连接超时:{}", ce); } catch (exception e) { log.error("https请求异常:{}", e); } return jsonobject; }
4:信任管理器工具类
/** * 类名: myx509trustmanager.java</br> * 描述: 信任管理器</br> */ public class myx509trustmanager implements x509trustmanager { // 检查客户端证书 public void checkclienttrusted(x509certificate[] chain, string authtype) throws certificateexception { } // 检查服务器端证书 public void checkservertrusted(x509certificate[] chain, string authtype) throws certificateexception { } // 返回受信任的x509证书数组 public x509certificate[] getacceptedissuers() { return null; } }
四、总结
上述java接口简单归纳就是按照接口地址通过get方式传递appid和appsecret两个参数发送http请求,获取access_token。看似很简单,请求后也可以获取access_token参数,但是微信公众平台的接口文档也说明了,access_token的有效期是7200秒,而且还需要中控服务器去控制access_token的刷新,所以建议将生产的access_token存放在redis中,redis缓存的有效时间等于access_token的有效时间。这样可以避免接口的不必要请求,减少并发量。先去redis中判断access_token是否有效,有效就获取,无效再去请求接口。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。