微信公众平台获取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 相关文章推荐
页面只有一个text的时候,回车自动submit的解决方法
Aug 12 Javascript
jQuery解决下拉框select设宽度时IE 6/7/8下option超出显示不全
May 27 Javascript
js实现TAB切换对应不同颜色的代码
Aug 31 Javascript
jQuery无刷新切换主题皮肤实例讲解
Oct 21 Javascript
jQuery的事件预绑定
Dec 05 Javascript
js实现移动端轮播图效果
Dec 09 Javascript
BootStrap点击保存后实现模态框自动关闭的思路(模态框)
Sep 26 Javascript
vue.js开发实现全局调用的MessageBox组件实例代码
Nov 22 Javascript
JS和Canvas实现图片的预览压缩和上传功能
Mar 30 Javascript
vue点击input弹出带搜索键盘并监听该元素的方法
Aug 25 Javascript
JS使用Dijkstra算法求解最短路径
Jan 17 Javascript
详解vue中使用微信jssdk
Apr 19 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
PHP删除特定数组内容并且重建数组索引的方法.
2011/03/25 PHP
php限制ip地址范围的方法
2015/03/31 PHP
php中引用&amp;的用法分析【变量引用,函数引用,对象引用】
2016/12/12 PHP
php使用yield对性能提升的测试实例分析
2019/09/19 PHP
JavaScript 计算当天是本年本月的第几周
2009/03/22 Javascript
禁用键盘上的(全局)指定键兼容iE、Chrome、火狐
2013/05/14 Javascript
jQuery学习笔记之jQuery.extend(),jQuery.fn.extend()分析
2014/06/09 Javascript
打造个性化的功能强大的Jquery虚拟键盘(VirtualKeyboard)
2014/10/11 Javascript
js使用setTimeout实现定时炸弹的方法
2015/04/10 Javascript
JS实现可展开折叠层的鼠标拖曳效果
2015/10/09 Javascript
js插件Jcrop自定义截取图片功能
2016/10/14 Javascript
原生js验证简洁注册登录页面
2016/12/17 Javascript
详解如何在vue中使用sass
2017/06/21 Javascript
基于nodejs+express4.X实现文件下载的实例代码
2017/07/13 NodeJs
基于Nodejs的Tcp封包和解包的理解
2018/09/19 NodeJs
详解vue 不同环境配置不同的打包命令
2019/04/07 Javascript
jquery实现掷骰子小游戏
2019/10/24 jQuery
[54:53]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第二场
2014/05/23 DOTA
Django学习笔记之为Model添加Action
2019/04/30 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
Django admin禁用编辑链接和添加删除操作详解
2019/11/15 Python
Python用dilb提取照片上人脸的示例
2020/10/26 Python
Python APScheduler执行使用方法详解
2020/12/10 Python
python BeautifulSoup库的安装与使用
2020/12/17 Python
在HTML5中使用MathML数学公式的简单讲解
2016/02/19 HTML / CSS
canvas像素点操作之视频绿幕抠图
2018/09/11 HTML / CSS
英国最大的美妆产品在线零售商之一:Beauty Bay
2017/09/29 全球购物
您熟悉ORM(Object-Relation Mapping)吗?请谈谈您所理解的ORM
2016/02/08 面试题
医学生实习自荐信
2013/10/01 职场文书
仓库门卫岗位职责
2013/12/22 职场文书
优秀员工演讲稿
2014/05/19 职场文书
公司总经理助理岗位职责
2014/07/09 职场文书
雷峰塔导游词
2015/02/09 职场文书
2016年全国爱眼日宣传教育活动总结
2016/04/05 职场文书
导游词之贵州百里杜鹃
2019/10/29 职场文书
CSS3实现的文字弹出特效
2021/04/16 HTML / CSS