欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-11-05 11:31:04
前言:access_token是微信公众平台接口的重要参数,很多接口都需要这个参数。 微信公众平台文档地址: 一、access_token说明 access_toke...

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

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