使用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;
}
}
使用Java语言开发微信公众平台(六)——获取access_token的更多相关文章
- 使用Java语言开发微信公众平台(五)——获取access_token
在前四期的文章中,我们分别学习了"环境搭建与开发接入"."文本消息的接收与响应"."被关注回复与关键词回复"."图文消息的发送与响 ...
- 使用Java语言开发微信公众平台(六)
在上一节课程中,我们来学习了微信公众平台最基础的一个接口--access_token,并且能够从微信公众平台中取到access_token. 那么,在本节课程中,我们要以上节课获取到的access_t ...
- 使用Java语言开发微信公众平台(七)——音乐消息的回复
在上一节课程中,我们学习了图片消息的回复功能.根据微信公众平台的消息类型显示,微信共支持文本.图片.语音.视频.音乐.图文等6种消息类型的回复: 其中,我们已经实现了文本.图文.图片等消息的回复处理, ...
- 使用Java语言开发微信公众平台(四)——图文消息的发送与响应
在上一篇文章中,我们实现了被关注回复与关键词回复功能.在用户关注的时候自动推送功能菜单,并根据用户输入的关键词,回复特定信息.但是,我们只能回复文本消息给用户,如何才回复一条图文消息呢?本周,我们一起 ...
- 使用Java语言开发微信公众平台(三)——被关注回复与关键词回复
在上一篇文章中,我们实现了文本消息的接收与响应.可以在用户发送任何内容的时候,回复一段固定的文字.本章节中,我们将对上一章节的代码进行适当的完善,同时实现[被关注回复与关键词回复]功能. 一.微信可提 ...
- 使用Java语言开发微信公众平台(五)——被关注回复与关键词回复
在上一篇文章中,我们实现了文本消息的接收与响应.可以在用户发送任何内容的时候,回复一段固定的文字.本章节中,我们将对上一章节的代码进行适当的完善,同时实现[被关注回复与关键词回复]功能. 一.微信 ...
- 使用Java语言开发微信公众平台(三)
在上一节课程中,我们来学习了微信公众平台最基础的一个接口——access_token,并且能够从微信公众平台中取到access_token. 那么,在本节课程中,我们要以上节课获取到的 ...
- 使用Java语言开发微信公众平台(八)——自定义菜单功能
随着上一篇文章的结束,我们已经实现了所有消息的类型的回复功能.今天,我们来学习更加高大上,也更加重要的自定义菜单功能. 一.了解自定义菜单 自定义菜单是微信公众平台最常用也是最重要的功能之一.根据微信 ...
- PHP语言开发微信公众平台(订阅号)之注册
1.百度搜索"微信公众平台" 2.选择微信公众平台官网并单击打开 3.进入官网页面,单击 "立即注册" 进入注册页面 4.进入注册页面,单击订阅号 5.进入订阅 ...
随机推荐
- springMVC学习笔记_转载(一)-----springMVC原理
阅读目录 一.什么是springmvc 二.mvc在b/s系统下的应用 三.SpringMVC框架介绍 回到顶部 一.什么是springmvc springMVC是spring框架的一个模块,spri ...
- 洛谷 P4180 【模板】严格次小生成树[BJWC2010] LCT
首次采用了压行,感觉还不错. Code: // luogu-judger-enable-o2 #include <cstdio> #include <algorithm> #i ...
- php八大设计模式之适配器模式
将一个抽象被具体后的结果转换成另外一个需求所需的格式. 在生活中也处处有适配器的出现,比如转换头,就是让两种不同的规格合适的搭配在一起. <?php header("content-t ...
- WSGI和CGI
https://www.zhihu.com/question/19998865 https://segmentfault.com/a/1190000003069785
- 移动端viewport解惑
我们在做移动端webapp的时候需要设置这么一段: <meta name="viewport" content="width=device-width, initi ...
- 微信小程序 获取数组长度
wxml中直接 {{array.length}} js中 array.length 小程序调用API返回的数据全部都是异步的:所以前提是要确保array中的数据,是存在的
- MySql系列之表的数据类型
存储引擎介绍 存储引擎即表类型,mysql根据不同的表类型会有不同的处理机制 什么是存储引擎 mysql中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的文件 ...
- 紫书 习题 10-3 UVa 1643(计算几何 叉乘)
直观感觉对角线重合的时候面积最大 然后可以根据方程和割补算出阴影部分的面积 注意知道两点坐标,可以求出与原点形成的三角形的面积 用叉乘,叉乘的几何意义以这两个向量为边的平行四边形的面积 所以用叉乘除以 ...
- GenIcam标准(五)
2.8.10.Enumeration, EnumEntry Enumeration节点把一个名称(name)映射到一个索引值(index value),并实现Ienumeration接口.Enumer ...
- 基于ArcGIS Flex API实现动态标绘(1.2)
动态标绘API 1.2,相较前一版本号(点击进入),该版本号新增对基本标绘符号的支持,包含: 单点.多点.折线.手绘线.多边形.手绘多边形.矩形,并提供对应的编辑功能. 例如以下图所看到的,对多点的编 ...