[3]java微信开发-获取access_token

来源:互联网 发布:台风战斗机知乎 编辑:程序博客网 时间:2024/06/06 23:43

什么是access_token?

   access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

access_token有什么用?

   access_token 作为公众号唯一的接口调用凭据,顾名思义就公众号调用微信提供的接口时都需要提供access_token,否则无法正常调用微信提供的接口。比如创建自定义菜单接口,获取微信服务器ip以及后面的JS-SDK 中获取api_ticket等等接口都会用到access_token。

怎么获取access_token?

通过GET请求接口:

 https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
 来获取access_token.

接口参数说明

参数 是否必须 说明 grant_type 是 获取access_token填写client_credential appid 是 第三方用户唯一凭证 secret 是 第三方用户唯一凭证密钥,即appsecret

从表格可看出,调用获取access_token的接口需要三个参数,第一个参数用client_credential就行。第二、三个参数对应“微信公众平台-开发-基本配置”微信公众号的AppID和AppSecret(开发者测试账号中测试号信息中的AppID和AppSecret)。

返回说明

正常情况下,微信会返回下述JSON数据包给公众号:

{“access_token”:”ACCESS_TOKEN”,”expires_in”:7200}

参数说明

参数 说明 access_token 获取到的凭证 expires_in 凭证有效时间,单位:秒

错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):

{“errcode”:40013,”errmsg”:”invalid appid”}

返回码说明

返回码 说明 -1 系统繁忙,此时请开发者稍候再试 0 请求成功 40001 AppSecret错误或者AppSecret不属于这个公众号,请开发者确认AppSecret的正确性 40002 请确保grant_type字段值为client_credential 40164 调用接口的IP地址不在白名单中,请在接口IP白名单中进行设置

获取access_token代码实现

1、实现X509TrustManager信任管理器。 

  https请求用到SSL技术,需要添加一个信任管理器。至于为什么,这里不做详细解释。感兴趣的童鞋可以自己去学习相关知识。

import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import javax.net.ssl.X509TrustManager;/** * 描述:HTTPS证书信任管理器,实现X509TrustManager接口 * @author pwu * 创建日期:2017-6-15 */public class MyX509TrustManager implements X509TrustManager {    //验证客户端证书    @Override    public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {        // TODO Auto-generated method stub    }    //验证服务端证书    @Override    public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {        // TODO Auto-generated method stub    }    //返回被信任的证书数组    @Override    public X509Certificate[] getAcceptedIssuers() {        // TODO Auto-generated method stub        return null;    }}

2、https请求代码实现

import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.ConnectException;import java.net.URL;import javax.net.ssl.HttpsURLConnection;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLSocketFactory;import javax.net.ssl.TrustManager;import com.alibaba.fastjson.JSONObject;import com.carwash.modules.wechat.common.MyX509TrustManager;public class HttpsUtils {    /**     * 描述:  发起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;        StringBuffer buffer = new StringBuffer();        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 httpsConn = (HttpsURLConnection) url.openConnection();            httpsConn.setSSLSocketFactory(ssf);            httpsConn.setDoOutput(true);            httpsConn.setDoInput(true);            httpsConn.setUseCaches(false);            // 设置请求方式(GET/POST)            httpsConn.setRequestMethod(requestMethod);            // 当有数据需要提交时            if (null != outputStr) {                OutputStream outputStream = httpsConn.getOutputStream();                // 注意编码格式,防止中文乱码                outputStream.write(outputStr.getBytes("UTF-8"));                outputStream.close();            }            // 将返回的输入流转换成字符串            InputStream inputStream = httpsConn.getInputStream();            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);            String str = null;            while ((str = bufferedReader.readLine()) != null) {                buffer.append(str);            }            bufferedReader.close();            inputStreamReader.close();            // 释放资源            inputStream.close();            inputStream = null;            httpsConn.disconnect();            jsonObject = JSONObject.parseObject(buffer.toString());        } catch (ConnectException ce) {            System.err.println("连接超时:"+ce);        } catch (Exception e) {            System.err.println("https请求异常:"+e);        }        return jsonObject;    }}

3、获取access_token实现

import com.alibaba.fastjson.JSONObject;import com.carwash.modules.wechat.common.Globle;import com.carwash.modules.wechat.entity.WxAccessToken;/** * 描述:微信access_token工具类 * @author pwu * 创建时间:2017-6-15 * @version V1.0 */public class AccessTokenUtils {    // 获取access_token的接口地址(GET) 限2000(次/天)    public final static String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";    public static WxAccessToken getAccessToken(){        //TODO 持久化token        WxAccessToken token = null;        //向微信请求access_token的url,由appid和appsecret组合微信请求接口构成        //Globle.appid和Globle.appsecret即为自己的appid和appsecret        String requestUrl = access_token_url.replace("APPID", Globle.appid).replace("APPSECRET", Globle.appsecret);        //发起https GET请求获取凭证json        JSONObject jsonObject = HttpsUtils.httpsRequest(requestUrl, "GET", null);           if(jsonObject != null){            token = new WxAccessToken();            token.setAccessToken(jsonObject.getString("access_token"));            token.setExpiresIn(jsonObject.getIntValue("expires_in"));        }        return token;    }}

结语 

   至此,微信access_token的获取完成,文章凭借的是网上查找资料及个人理解整理出来的,可能比较粗糙,如果有不对的地方,希望大家指出来,我及时改正避免误导其他人。如有看完这篇博客还不知道怎么获取access_token的朋友,欢迎留言或私信给我,我会及时解答。

原创粉丝点击