玩玩微信公众号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/
随机推荐
- 手把手教你用Eclipse+TestNG搭建接口自动化测试框架
转载于:http://qa.blog.163.com/blog/static/190147002201510275306185/ 把群博里关于接口自动化的文章都看了一遍,都是关于测试过程中遇到的问题及 ...
- 简单vue项目脚手架(vue+webpack2.0+vuex+vue-router)
github地址 使用技术栈 webpack(^2.6.1) webpack-dev-server(^2.4.5) vue(^2.3.3) vuex(^2.3.1) vue-router(^2.5.3 ...
- DELPHI XE8 远程调试
最近公司项目遇到问题需要远程调试搜索了一下怎么用 发现网上能找到最新的是XE2上的说明现在已经有一些不同了 按照上面的方法不能调试成功 经过测试XE8的方法如下:1.项目编译设置:2.在被调试电脑上运 ...
- CSS浮动、绝对、相对定位
浮动 float:属性{ float:none; 默认值,对象,不漂浮 float:left; 文本流向对象的右边 float:right; }; 清除浮动 clear:属性{ clear:no ...
- NodeMCU入门(4):搭建Web服务器,配置网络连接
准备工作 1.NodeMCU模块 2.ESPlorer v0.2.0-rc6 3.NodeMCU-HTTP-Server 搭建web服务器 下载https://github.com/wangzexi/ ...
- php实现ppt转图片,php调用com组件问题
PHP 调用com组件将ppt转为图片. 需要在php.ini中开启 extension=php_com_dotnet.dllcom.allow_dcom = true 测试代码如下: < ...
- 没有main方法真的不能执行代码了吗?
今天看北大慕课遇到一段代码,于是下载下来跑了一下,奇葩的是,没有main方法既没报错,还出了结果. 下面贴出代码: class InitialTest { public static void mai ...
- Nignx入门location、root配置
nginx的配置.首当其冲的就是location配置了,下面是笔记参考的博文链接 http://www.cnblogs.com/sunkeydev/p/5225051.html location匹 ...
- 基于Spring的最简单的定时任务实现与配置(一)
朋友的项目中有点问题.他那边是Spring架构的,有一个比较简单的需要定时的任务执行.在了解了他的需求之后,于是提出了比较简单的Spring+quartz的实现方式. 注意本文只是讨论,在已搭建完毕的 ...
- 谈谈Nancy中让人又爱又恨的Diagnostics【上篇】
前言 在Nancy中有个十分不错的功能-Diagnostics,可以说这个功能让人又爱又恨. 或许我们都做过下面这样的一些尝试: 记录某一个功能用到的相关技术信息 记录下网站的访问记录 全局配置某些框 ...