玩玩微信公众号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/
随机推荐
- NodeJs的简单介绍
Nodejs是由谷歌v8运行.c++编写的js运行的环境,这里需要记住的是Nodejs只是一个环境. 目前很多主流网站都是使用nodejs,如知乎等大型的网站. 我们关于nodejs学习目标:安装N ...
- SpringBoot学习helloworld
这几天开始学习springBoot记录一下(Hello World) pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0 ...
- 搭建rtmp直播流服务之2:使用java实现ffmpeg命令接口化调用(用java执行ffmpeg命令)
欢迎大家积极开心的加入讨论群 群号:371249677 (点击这里进群) 一.环境搭建 1.安装ffmpeg 下载对应系统的ffmpeg安装包,个人采用windows平台进行开发,所以安装了windo ...
- git clone https://github.com/istester/ido.git ,确提示“Failed to connect to 192.168.1.22 port 8080: Connection refused” 的解决办法 。
不知道是否有同学遇到如下的问题: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo } span.s1 { } git clone ...
- python 标准库 -- multiprocessing
multiprocessing 与 threading.Thread 类似 multiprocessing.Process 创建进程, 该进程可以运行用 python 编写的函数. multiproc ...
- 深入理解 JavaScript 事件循环(二)— task and microtask
引言 microtask 这一名词是 JS 中比较新的概念,几乎所有人都是在学习 ES6 的 Promise 时才接触这一新概念,我也不例外.当我刚开始学习 Promise 的时候,对其中回调函数的执 ...
- Java学习笔记--反射API
反射API 1.反射API的介绍 通过反射API可以获取Java程序在运行时刻的内部结构.比如Java类中包含的构造方法.域和方法等元素,并可以与这些元素进行交换. 按照 一般地面向对象的设计 ...
- Python读取和处理文件后缀为".sqlite"的数据文件
最近在弄一个项目分析的时候,看到有一个后缀为”.sqlite”的数据文件,由于以前没怎么接触过,就想着怎么用python来打开并进行数据分析与处理,于是稍微研究了一下. SQLite是一款非常流行的关 ...
- PHP中几个输出函数echo,print(),print_r(),sprintf(),var_dump()的区别
1:echo:是语句不是函数,没有返回值,可输出多个变量值,不需要圆括号.不能输出数组和对象,只能打印简单类型(如int,string). 2:print:是语句不是函数,有返回值 1 ,只能输出一个 ...
- 调用phprpc的时候出现Fatal error: Cannot redeclare gzdecode()
出现这个问题的原因是:php在5.4版本后,已经自包含了gzdecode()函数,开发者自己定义的gzdecode()函数会与其冲突. 在 ....\phpRPC\compat.php文件的第72行( ...