玩玩微信公众号Java版之三:access_token及存储access_token
微信官方参考文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183

那么在获取token时,可以根据appid和appsecret来获取,其中判断是否需要更新的方法为:

对应表结构参考如下:

对应的java代码如下: 如果能获取到,那么直接返回:
/**
* 通过参数获取Token信息
* @param appID
* @param appSceret
* @return
*/
public Token getToken(String appID, String appSceret)
{
mAppID = appID;
mAppSceret = appSceret; // 1.确定是否要更新token,无需更新则直接直接返回获取的token
if (updateToken())
{
return mToken;
} // 2. 如需更新
if (!getTokenbyhttps(mAppID, mAppSceret))
{
System.out.println("获取失败!");
return null;
} return mToken;
}
其中明细方法实现为:
/**
* 获取Token信息
* @return
*/
private boolean updateToken()
{
// 查询数据库数据,如果有则不用更新,无则需要更新
Connection con = null;
PreparedStatement stmt = null;
ResultSet rs = null;
// 判断当前token是否在有效时间内
String sql = " select * from token where appid ='" + mAppID + "' and appsecret ='" + mAppSceret
+ "' and ( current_timestamp -createtime) <expires_in order by createTime desc limit 0,1";
try
{
// 创建数据库链接
con = DBConnPool.getConnection();
// 创建处理器
stmt = con.prepareStatement(sql);
// 查询Token,读取1条记录
rs = stmt.executeQuery();
if (rs.next())
{
mToken.setTokenid(rs.getString("tokenid"));
mToken.setToken(rs.getString("token"));
mToken.setExpires_in(rs.getInt("expires_in"));
mToken.setAppid(rs.getString("appid"));
mToken.setAppsecret(rs.getString("appsecret"));
}
else
{
System.out.println("未查询到对应token");
return false;
}
}
catch (Exception e)
{
// TODO: handle exception
return false;
} System.out.println(mToken.getToken()); return true;
}

/**
* 通过https请求获取token
* @param appID
* @param appSceret
* @return
*/
private boolean getTokenbyhttps(String appID, String appSceret)
{
String current_time = new Date().getTime() + ""; try
{
// 请求地址
String path = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
+ appID + "&secret=" + appSceret; String strResp = WeChatUtil.doHttpsGet(path, "");
System.out.println(strResp); // 解析获取的token信息
Map<String, Object> tMap = WeChatUtil.jsonToMap(strResp); System.out.println(tMap.toString()); mToken.setTokenid(WeChatUtil.getMaxTokenID());
mToken.setToken((String) tMap.get("access_token"));
mToken.setExpires_in(Integer.parseInt((String) tMap.get("expires_in")));
mToken.setAppid(appID);
mToken.setAppsecret(appSceret);
mToken.setCreatetime(current_time); System.out.println(mToken.getToken()); }
catch (HttpException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} // 存储token至数据库
saveToken(mToken); return true;
} /**
* 保存Token信息
* @return
*/
private boolean saveToken(Token token)
{
PreparedStatement pst = null;
Connection conn = null;
try
{
Token tToken = token.clone(); System.out.println(tToken.getTokenid() + tToken.getToken()); conn = DBConnPool.getConnection();
// 创建预处理器
pst = conn.prepareStatement("insert into token(tokenid, token, expires_in,appid, appsecret,createtime) values (?,?,?,?,?,?)"); pst.setString(1, tToken.getTokenid());
pst.setString(2, tToken.getToken());
pst.setInt(3, tToken.getExpires_in());
pst.setString(4, tToken.getAppid());
pst.setString(5, tToken.getAppsecret());
long now = new Date().getTime();
pst.setTimestamp(6, new java.sql.Timestamp(now));
pst.execute(); }
catch (CloneNotSupportedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
catch (Exception e)
{
// TODO: handle exception
System.out.println("出现额外异常");
}
return true;
}
对于https的GET和POST调用,可以写2个公共方法,具体实现可参考:
/**
* HTTPS请求Get方法调用
* @param path
* @param requestData
* @return
* @throws HttpException
* @throws IOException
*/
public static String doHttpsGet(String path, String requestData) throws HttpException, IOException
{
// 创建https请求,未默认证书,可自行添加
// 设置编码
HttpClient httpClient = new HttpClient();
GetMethod getMethod = new GetMethod(path);
httpClient.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "UTF-8"); httpClient.executeMethod(getMethod); // 读取内容
byte[] responseBody = getMethod.getResponseBody();
String strResp = new String(responseBody, "UTF-8"); System.out.println(strResp); getMethod.releaseConnection(); return strResp;
} /**
* HTTPS请求Post方法调用
* @param path
* @param requestData
* @return
* @throws HttpException
* @throws IOException
*/
public static String doHttpsPost(String path, String requestData) throws HttpException, IOException
{
// 创建https请求,未默认证书,可自行添加
String strResp ="";
HttpClient httpClient = new HttpClient();
PostMethod postMethod = new PostMethod(path);
// 设置编码
httpClient.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "UTF-8"); System.out.println("path:" + path);
System.out.println("requestData:" + requestData); postMethod.setRequestBody(requestData); long start = System.currentTimeMillis();
// 执行getMethod
int statusCode = httpClient.executeMethod(postMethod);
System.out.println("cost:" + (System.currentTimeMillis() - start));
// 失败
if (statusCode != HttpStatus.SC_OK)
{
System.out.println("Method failed: " + postMethod.getStatusLine());
// 读取内容
byte[] responseBody = postMethod.getResponseBody();
// 处理内容
strResp = new String(responseBody, "UTF-8");
System.out.println(strResp);
}
else
{
// 读取内容
byte[] responseBody = postMethod.getResponseBody();
strResp = new String(responseBody, "UTF-8");
System.out.println("服务器返回:" + strResp);
} postMethod.releaseConnection(); return strResp;
}

玩玩微信公众号Java版之三:access_token及存储access_token的更多相关文章
- 玩玩微信公众号Java版之七:自定义微信分享
前面已经学会了微信网页授权,现在微信网页的功能也可以开展起来啦! 首先,我们先来学习一下分享,如何在自己的页面获取分享接口及让小伙伴来分享呢? 今天的主人公: 微信 JS-SDK, 对应官方链接为:微 ...
- 玩玩微信公众号Java版之四:自定义公众号菜单
序: 微信公众号基本的菜单很难满足个性化及多功能的实现,那么微信能否实现自定菜单呢,具体的功能又如何去实现么?下面就来学习一下微信自定义公众号菜单吧! 自定义菜单接口可实现多种类型按钮,如下: 1.c ...
- 玩玩微信公众号Java版之一:配置微信公众平台服务器信息
在进行微信公众平台开发前,前先做好准备工作,好了以后,我们可以开始啦! 第一.准备好服务端接口 定义一个http服务接口,主要分为如下几步: 1.创建一个servlet类,用来接收请求: ...
- 玩玩微信公众号Java版之准备
微信自2013年流行起来,现在的发展已经超过了我们的想象,那么对应的公众平台,小程序等都是让人眼前一亮的东西,这里来学习一下微信工作号的对接,实现为Java,希望大家一起学习! 这里大概描述一下所 ...
- 玩玩微信公众号Java版之六:微信网页授权
我们经常会访问一些网站,用微信登录的时候需要用到授权,那么微信网页授权是怎么一回事呢,一起来看看吧! 参考官方文档:https://mp.weixin.qq.com/wiki?t=resource ...
- 玩玩微信公众号Java版之五:获取关注用户信息
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同).公众号可通过本接口来根据Op ...
- 玩玩微信公众号Java版之二:接收、处理及返回微信消息
前面已经配置了微信服务器,那么先开始最简单的接收微信消息吧~ 可以用我们的微信号来直接进行测试,下面先看测试效果图: 这是最基本的文本消息的接收.处理及返回,来看看是怎么实现的吧! 首先可 ...
- 微信公众号Java接入demo
微信公众号Java接入demo 前不久买了一台服务,本来是用来当梯子用的,后来买了一个域名搭了一个博客网站,后来不怎么在上面写博客一直闲着,最近申请了一个微信公众号就想着弄点什么玩玩.周末没事就鼓捣了 ...
- 微信公众平台Java版极速SDK
JEEWX-API 是第一个微信公众平台Java版极速SDK,基于 jeewx-api 开发可以立即拥有简单易用的API,让开发更加轻松自如,节省更多时间 http://www.jeewx.com/
随机推荐
- Kafka.net使用编程入门(四)
新建一个cmd窗口,zkServer命令启动zookeeper 打开另一个cmd窗口,输入: cd D:\Worksoftware\Apachekafka2.11\bin\windows kafka- ...
- .net 利用Emit将object转为DbParameter,DataTable转为List<>
先放测试结果图,测试的方法是拷贝了老赵的一个简单的性能计数器:CodeTimer.发现速度还是比利用反射来获取快了2倍左右的,将object转为DbParameter的反射方法我没写. ...
- java并发编程(Exchanger)
package org.bianqi.demo1; import java.util.concurrent.Exchanger; import java.util.concurrent.Executo ...
- 【javascript】Promise/A+ 规范简单实现 异步流程控制思想
——基于es6:Promise/A+ 规范简单实现 异步流程控制思想 前言: nodejs强大的异步处理能力使得它在服务器端大放异彩,基于它的应用不断的增加,但是异步随之带来的嵌套.难以理解的代码让 ...
- angular指令ng-class巧用
什么是ng-class ng-class最大的妙用就是可以根据你的逻辑表达式.来添加或移除对应的class ng-class是angular.js里面内置的一个指令. 项目中,有时候,我们需要根据需求 ...
- java中计算两个时间差
java计算时间差及比较时间大小 比如:现在是2004-03-26 13:31:40 过去是:2004-01-02 11:30:24 我现在要获得两个日期差,差的形式为:XX天XX小时XX分XX秒 方 ...
- win7双系统安装openSUSE13.2解决【引导加载器安装期间出错】问题
原始日期:2015-08-17 14:16 昨晚不知道哪根筋不对,突然想装一个liunx系统,与win7形成双系统,最终选定openSUSE13.2,想想以前也安装过Ubuntu,应该差不多,所以直接 ...
- java当中成员变量和局部变量的区别
1:成员变量定义在类中,整个类中都可以访问.2:局部变量定义在函数,语句,局部代码块中,只在所属的区域有效.3:成员变量存在于堆内存的对象中.4:局部变量存在于栈内存的方法中.5:成员变量随着对象的创 ...
- 遍历Map和List的几种方法和性能比较
public static void main(String[] args) { Map<String, String> map = new HashMap<String, Stri ...
- 【LeetCode】118. Pascal's Triangle
题目: Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,R ...