微信公众平台获取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 一行代码,轻松搞定浮动快捷留言-V2升级版
Apr 02 Javascript
有关于JS辅助函数inherit()的问题
Apr 07 Javascript
判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
Nov 07 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
Nov 06 Javascript
学习Angularjs分页指令
Jul 01 Javascript
AngularJS基础 ng-click 指令示例代码
Aug 01 Javascript
jQuery插件FusionWidgets实现的Bulb图效果示例【附demo源码下载】
Mar 23 jQuery
xmlplus组件设计系列之列表(4)
Apr 26 Javascript
JS jQuery使用正则表达式去空字符的简单实现代码
May 20 jQuery
Vue 换肤的示例实践
Jan 23 Javascript
JavaScript递归函数解“汉诺塔”算法代码解析
Jul 05 Javascript
详解Node.js异步处理的各种写法
Jun 09 Javascript
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
收音机频率指针指示不准确和灵敏度低问题
2021/03/02 无线电
php文件操作实例代码
2012/05/10 PHP
PHP判断数据库中的记录是否存在的方法
2014/11/14 PHP
JavaScript之appendChild、insertBefore和insertAfter使用说明
2010/12/30 Javascript
js验证电话号码与手机支持+86的正则表达式
2014/01/23 Javascript
js 去除字符串第一位逗号的方法
2014/06/07 Javascript
jQuery 浮动导航菜单适合购物商品类型的网站
2014/09/09 Javascript
JavaScript设计模式之工厂方法模式介绍
2014/12/28 Javascript
使用jQuery获得内容以及内容的属性
2015/02/26 Javascript
基于javascript实现tab选项卡切换特效调试笔记
2016/03/30 Javascript
nodejs加密Crypto的实例代码
2016/07/07 NodeJs
js 单引号替换成双引号,双引号替换成单引号的实现方法
2017/02/16 Javascript
详解Node中导入模块require和import的区别
2017/08/11 Javascript
浅析Javascript中双等号(==)隐性转换机制
2017/10/27 Javascript
React为 Vue 引入容器组件和展示组件的教程详解
2018/05/03 Javascript
vue项目中mock.js的使用及基本用法
2019/05/22 Javascript
Python基于scrapy采集数据时使用代理服务器的方法
2015/04/16 Python
python实现红包裂变算法
2016/02/16 Python
python安装mysql-python简明笔记(ubuntu环境)
2016/06/25 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
2017/04/05 Python
pip matplotlib报错equired packages can not be built解决
2018/01/06 Python
基于pip install django失败时的解决方法
2018/06/12 Python
Python爬虫实现爬取百度百科词条功能实例
2019/04/05 Python
Pandas之Dropna滤除缺失数据的实现方法
2019/06/25 Python
python如何删除文件中重复的字段
2019/07/16 Python
Python3的高阶函数map,reduce,filter的示例详解
2019/07/23 Python
解决Python命令行下退格,删除,方向键乱码(亲测有效)
2020/01/16 Python
Optimalprint加拿大:在线打印服务
2020/04/03 全球购物
我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。 为什么如下的代码((int *)p)++; 不行?
2013/05/09 面试题
颁奖典礼主持词
2014/03/25 职场文书
活动总结模板
2014/05/09 职场文书
机械加工与数控专业自荐书
2014/06/04 职场文书
祖国在我心中演讲稿600字
2014/09/23 职场文书
长辈生日祝福语大全(72句)
2019/08/09 职场文书
只用40行Python代码就能写出pdf转word小工具
2021/05/31 Python
python ansible自动化运维工具执行流程
2021/06/24 Python