zoukankan      html  css  js  c++  java
  • 使用Java语言开发微信公众平台(六)——获取access_token

     

           在前四期的文章中,我们分别学习了“环境搭建与开发接入”、“文本消息的接收与响应”、“被关注回复与关键词回复”、“图文消息的发送与响应”等环节。那么,从本篇博文开始,我们将进去更高级的开发层面,调用微信公众平台提供的各种接口。

           今天,我们来学习一下微信公众平台最基础的一个接口——access_token,access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。

           当然,从本章开始,我们需要调用的各种接口,均需使用服务号开发。没有服务号的小伙伴,可以选择申请一个测试账号,详情查看系列博文第一篇<环境搭建与开发接入>

           一、了解access_token

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

          公众号可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在微信公众平台官网-开发者中心页中获得。且一个公众号每天获取access_token的次数上限为2000次。

         ① 接口调用请求地址

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

         ② 需要传递参数说明

     

     

     

     

        ③ 返回参数说明

         从上述请求地址,以及参数和响应表格可以知道,我们需要通过请求传递三个参数给微信公众平台,分别是grant_type(获取access_token填写client_credential)、appid、appsecret,请求成功后,公众平台会将access_token以及有效期返回给我们。

     

       二    在了解了access_token之后,我们开始组装一个工具类,来向服务器发送请求获取access_token。在我们之前的Util包下,新建一个WeiXinUtil.java工具类

     

        [剧透一下]由于在开发过程中,我们需要① 将接收过来的结果转成JSON格式 ② 使用HttpClient发送HTTP请求,所以需要导入几个Jar包,导入Jar包列表如下(其中,红色框为第①部分所需,蓝色框为第②部分所需):

         Jar包导入完成后,进入我们的代码实战环节,打开我们的WeiXinUtil.java工具类,封装三个常量,分别是我们的APPID、APPSECRET、以及请求access_token的URL:

         接下来我们组装两个方法,分别是使用Get和Post对我们的URL发起请求,当我们直接请求URL而不需要传递参数时,可使用Get请求,而当我们需要传递参数的时候,就需要使用Post请求,这两个请求的实现,均需借助我们导入HttpClient这两个Jar包:

        ① Get请求的实现(相关代码解释已在注释阐明)

           ② Post请求的实现(相关代码解释已在注释阐明)

           三、创建AccessToken实体类

     

          由第一部分返回结果说明我们可以知道,当我们执行请求URL,并且请求成功后,公众平台会将access_token以及有效期返回给我们。所以我们需要新建一个AccessToken实体类用于组装返回结果,实体类属性如下:

     

         四、获取Access_Token并编写测试类

     

        ① 在WeiXinUtil.java工具类中,新增getAccessToken方法

     

           ② 编写测试类,测试方法

     

            ③ 运行测试类,即可取到Access_Token及有效期

          由于每个公众账号一天请求2000次Access_Token,在一些访问量大的公众号上显然是不够用的,因此我们可以将取到的Access_Token存到本地,每次使用时判断是否过期,如果没有过期就不要再发送请求啦~

          这个问题呢,作为一个课后练习,有能力的小伙伴可能自行尝试哦~

        【附】WeiXinUtil.Java 源码部分

     

    复制代码
    package com.jredu.util;
    import java.io.IOException;
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.util.EntityUtils;
    import com.jredu.entity.AccessToken;
    import net.sf.json.JSONObject;
    
    public class WeiXinUtil {
        //从微信后台拿到APPID和APPSECRET 并封装为常量
        private static final String APPID = "wxe09763a06d980f09";
        private static final String APPSECRET = "3a6005a4c7589ca9e93297c72f7eaf4d";
        private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
        /**
         * 编写Get请求的方法。但没有参数传递的时候,可以使用Get请求
         * 
         * @param url 需要请求的URL
         * @return 将请求URL后返回的数据,转为JSON格式,并return
         */
        public static JSONObject doGetStr(String url) throws ClientProtocolException, IOException {
            DefaultHttpClient client = new DefaultHttpClient();//获取DefaultHttpClient请求
            HttpGet httpGet = new HttpGet(url);//HttpGet将使用Get方式发送请求URL
            JSONObject jsonObject = null;
            HttpResponse response = client.execute(httpGet);//使用HttpResponse接收client执行httpGet的结果
            HttpEntity entity = response.getEntity();//从response中获取结果,类型为HttpEntity
            if(entity != null){
                String result = EntityUtils.toString(entity,"UTF-8");//HttpEntity转为字符串类型
                jsonObject = JSONObject.fromObject(result);//字符串类型转为JSON类型
            }
            return jsonObject;
        }
        
        /**
         * 编写Post请求的方法。当我们需要参数传递的时候,可以使用Post请求
         * 
         * @param url 需要请求的URL
         * @param outStr  需要传递的参数
         * @return 将请求URL后返回的数据,转为JSON格式,并return
         */
        public static JSONObject doPostStr(String url,String outStr) throws ClientProtocolException, IOException {
            DefaultHttpClient client = new DefaultHttpClient();//获取DefaultHttpClient请求
            HttpPost httpost = new HttpPost(url);//HttpPost将使用Get方式发送请求URL
            JSONObject jsonObject = null;
            httpost.setEntity(new StringEntity(outStr,"UTF-8"));//使用setEntity方法,将我们传进来的参数放入请求中
            HttpResponse response = client.execute(httpost);//使用HttpResponse接收client执行httpost的结果
            String result = EntityUtils.toString(response.getEntity(),"UTF-8");//HttpEntity转为字符串类型
            jsonObject = JSONObject.fromObject(result);//字符串类型转为JSON类型
            return jsonObject;
        }
        
        /**
         * 获取AccessToken
         * @return 返回拿到的access_token及有效期
         */
        public static AccessToken getAccessToken() throws ClientProtocolException, IOException{
            AccessToken token = new AccessToken();
            String url = ACCESS_TOKEN_URL.replace("APPID", APPID).replace("APPSECRET", APPSECRET);//将URL中的两个参数替换掉
            JSONObject jsonObject = doGetStr(url);//使用刚刚写的doGet方法接收结果
            if(jsonObject!=null){ //如果返回不为空,将返回结果封装进AccessToken实体类
                token.setToken(jsonObject.getString("access_token"));//取出access_token
                token.setExpiresIn(jsonObject.getInt("expires_in"));//取出access_token的有效期
            }
            return token;
        }
    }

    作者:KeerDi —— 北方的后生

    出处:http://www.cnblogs.com/keerdi/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    discuz制作
    Cookie和Session专题
    ecmall二次开发 直接实例化mysql对象
    ecmall widgets 挂件开发详解
    都是iconv惹的祸
    discuz+ecmall+phpcms整合
    replace into
    权限管理设计二
    权限管理设计一
    SVN服务器搭建和使用(二)
  • 原文地址:https://www.cnblogs.com/123hll/p/6956964.html
Copyright © 2011-2022 走看看