微信公众平台获取access_token的方法步骤


Posted in Javascript onMarch 29, 2019

前言: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白名单中,点击查看设置方法,否则将无法调用成功。

微信公众平台获取access_token的方法步骤

二、接口调用请求说明

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是否有效,有效就获取,无效再去请求接口。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 编程引入命名空间的方法
Jun 29 Javascript
javascript instanceof 与typeof使用说明
Jan 11 Javascript
prettify 代码高亮着色器google出品
Dec 28 Javascript
解读JavaScript中 For, While与递归的用法
May 07 Javascript
Jquery Validate 正则表达式实用验证代码大全
Aug 23 Javascript
JavaScrip实现PHP print_r的数功能(三种方法)
Nov 12 Javascript
jquery实现tab键进行选择后enter键触发click行为
Mar 29 jQuery
vue开发拖拽进度条滑动组件
Sep 21 Javascript
Vue表单控件数据绑定方法详解
Feb 05 Javascript
react-router-dom 嵌套路由的实现
May 02 Javascript
javascript实现移动端触屏拖拽功能
Jul 29 Javascript
jQuery实现简单评论区功能
Oct 26 jQuery
vue路由--网站导航功能详解
Mar 29 #Javascript
利用weixin-java-miniapp生成小程序码并直接返回图片文件流的方法
Mar 29 #Javascript
微信小程序实现获取小程序码和二维码java接口开发
Mar 29 #Javascript
详解vue项目打包步骤
Mar 29 #Javascript
jQuery实现动态添加和删除input框代码实例
Mar 29 #jQuery
Vue项目history模式下微信分享爬坑总结
Mar 29 #Javascript
vue中使用微信公众号js-sdk踩坑记录
Mar 29 #Javascript
You might like
PHP新手用的Insert和Update语句构造类
2012/03/31 PHP
PHP生成自定义长度随机字符串的函数分享
2014/05/04 PHP
ExtJS 2.2.1的grid控件在ie6中的显示问题
2009/05/04 Javascript
jquery弹出层类代码分享
2013/12/27 Javascript
直接在JS里创建JSON数据然后遍历使用
2014/07/25 Javascript
javascript日期格式化方法汇总
2015/10/04 Javascript
jQuery通过ajax方法获取json数据不执行success的原因及解决方法
2016/10/15 Javascript
Bootstrap modal 多弹窗之叠加显示不出弹窗问题的解决方案
2017/02/23 Javascript
基于 Immutable.js 实现撤销重做功能的实例代码
2018/03/01 Javascript
通过 JS 判断页面是否有滚动条的实现方法
2018/04/05 Javascript
bootstrap下拉分页样式 带跳转页码
2018/12/29 Javascript
vue-router命名路由和编程式路由传参讲解
2019/01/19 Javascript
mpvue开发音频类小程序踩坑和建议详解
2019/03/12 Javascript
js实现文字头像的生成代码
2020/03/07 Javascript
[01:41]DOTA2 2015国际邀请赛中国区预选赛第三日战报
2015/05/28 DOTA
Python MD5文件生成码
2009/01/12 Python
Linux 下 Python 实现按任意键退出的实现方法
2016/09/25 Python
Golang与python线程详解及简单实例
2017/04/27 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
2018/06/28 Python
解决安装python库时windows error5 报错的问题
2018/10/21 Python
python实现小球弹跳效果
2019/05/10 Python
Python实现个人微信号自动监控告警的示例
2019/07/03 Python
Django调用百度AI接口实现人脸注册登录代码实例
2020/04/23 Python
Python+Opencv实现把图片、视频互转的示例
2020/12/17 Python
HTML5 Canvas鼠标与键盘事件demo示例
2013/07/04 HTML / CSS
Jabra捷波朗美国官网:用于办公、车载和运动的无线蓝牙耳麦
2017/02/01 全球购物
美国排名第一的葡萄酒俱乐部:Firstleaf Wine Club
2020/01/02 全球购物
JSP&Servlet技术面试题
2015/05/21 面试题
会计职业生涯规划范文
2014/01/04 职场文书
2014乡镇党政班子四风问题思想汇报
2014/09/14 职场文书
房屋过户委托书范本
2014/10/07 职场文书
会议通知格式范文
2015/04/15 职场文书
关于国庆节的广播稿
2015/08/19 职场文书
2019年大学生职业生涯规划书
2019/03/25 职场文书
python入门之算法学习
2021/04/22 Python
Spring Boot接口定义和全局异常统一处理
2022/04/20 Java/Android