慕课网access_token的获取(下)

接口调用返回的结果是两个字段:access_token和expires_in,所以需要创建一个实体类封装这两个字段

运行测试类WeixinTest.java控制台打印出错误信息

重置开发者密钥试试看

还是报错。原来是把接口返回信息的字段名搞错了,是access_token不是access_tocken

再次运行测试类WeixinTest.java,可以了

可以可以,获取的时候先找本地文件里存的token,如果时间超过7200秒就重新获取,这个方法可以避免多次刷新产生冲突,人多了就麻烦了。这个可以自己课后去实现一下
1、为了保密appsecrect,第三方需要一个access_token获取和刷新的中控服务器。而其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则会造成access_token覆盖而影响业务;2、目前access_token的有效期通过返回的expire_in来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新access_token。在刷新过程中,中控服务器对外输出的依然是老access_token,此时公众平台后台会保证在刷新短时间内,新老access_token都可用,这保证了第三方业务的平滑过渡;3、access_token的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token的接口,这样便于业务服务器在API调用获知access_token已超时的情况下,可以触发access_token的刷新流程。
公众号可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在微信公众平台官网-开发页中获得(需要已经成为开发者,且帐号没有异常状态)。注意调用所有微信接口时均需使用https协议。如果第三方不使用中控服务器,而是选择各个业务逻辑点各自去刷新access_token,那么就可能会产生冲突,导致服务不稳定。
下面贴一下代码吧,与上一节重复的代码就不展示了,只展示本节主要的代码:
WeixinUtil.java
package com.imooc.util;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
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.imooc.po.AccessTocken;
import net.sf.json.JSONObject;
public class WeixinUtil {
private static final String APPID = "wxed6e9c3206e06192";
private static final String APPSECRET = "aa3f4c8ddced84c29ea0718d0b2f4a38";
private static final String ACCESS_TOCKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";//
//用到JSONObject,因为要把接收过来结果转成JSON格式
/**
* gett请求
* @param url
* @return
*/
public static JSONObject doGetStr(String url){//url为接口地址参数
//通过HttpClient去实现
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);//初始化的时候把url传递进去 它里面有一个HttpGet 因为我们这个方法是通过GET方式去提交
//所以我们用HttpGet的方式
JSONObject jsonObject = null;//创建一个接收变量
try {
HttpResponse response = httpClient.execute(httpGet);
HttpEntity entity= response.getEntity();//有一个getEntity()方法从它的消息体里面去拿结果
if(entity!=null){
String result = EntityUtils.toString(entity,"UTF-8");//接收到的结果不为空,将entity转换成String类型
//可以将HttpEntity的类型转换成String的类型 设置编码格式 防止乱码
jsonObject = JSONObject.fromObject(result);//将String类型转换成JSON的格式 以便于后面以键值的方式去里面拿取结果
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//HttpResponse去接收它那个执行的结果
return jsonObject ;
}
/**
* post请求
* @param url
* @param outStr
* @return
*/
public static JSONObject doPostStr(String url,String outStr) throws ClientProtocolException, IOException{
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
JSONObject jsonObject = null;
try {
httpPost.setEntity(new StringEntity(outStr,"UTF-8"));
HttpResponse response = httpClient.execute(httpPost);
String result = EntityUtils.toString(response.getEntity(),"UTF-8");//EntityUtils把接收到的结果转成String类型 接收的时候把结果转成UTF-8
jsonObject = JSONObject.fromObject(result);//把接收的结果转成JSON格式
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//
return null;
}
/**
* 获取access_tocken
* @return
*/
public static AccessTocken getAccessTocken(){
AccessTocken tocken = new AccessTocken();
String url = ACCESS_TOCKEN_URL.replace("APPID",APPID).replace("APPSECRET",APPSECRET);//把接口地址的两个实际参数给替换掉
JSONObject jsonObject = doGetStr(url);//通过doGet方法去获取它的结果
if(jsonObject!=null){
tocken.setTocken(jsonObject.getString("access_token"));//原来是把字段名搞错了卧槽
tocken.setExpiresIn(jsonObject.getInt("expires_in"));
}
return tocken;
}
}
AccessToken.java
package com.imooc.po;
public class AccessTocken {
private String tocken;//返回的凭证
private int expiresIn;//凭证的有效时间
public String getTocken() {
return tocken;
}
public void setTocken(String tocken) {
this.tocken = tocken;
}
public int getExpiresIn() {
return expiresIn;
}
public void setExpiresIn(int expiresIn) {
this.expiresIn = expiresIn;
}
}
WeixinTest.java
package com.imooc.test;
import com.imooc.po.AccessTocken;
import com.imooc.util.WeixinUtil;
public class WeixinTest {
public static void main(String[] args) {
AccessTocken tocken = WeixinUtil.getAccessTocken();
System.out.println("票据:"+tocken.getTocken());
System.out.println("有效时间:"+tocken.getExpiresIn());
}
}
慕课网access_token的获取(下)的更多相关文章
- 慕课网access_token的获取
access_token的接口是微信公众号一个基础接口,access_token接口微信公众号一个非常重要的接口 access_token是微信公众号的全局唯一票据,公众号的所有接口的调用都需要使用到 ...
- 【小尝试】Java获取慕课网原有路径课程列表
作为一个老慕课网(https://www.imooc.com/)粉丝,还记得最开始的慕课网有很多免费的路径课程,练习什么的也特别详细,是入门一门语言的好方法. 现在慕课网发展起来了收费模式,添加了很多 ...
- 使用js脚本批量下载慕课网视频
慕课网(http://www.imooc.com/)上有很多不错的视频,当然我不是来给慕课网打广告的,我本人学习过很多慕课网上的免费的视频. 在线看如果网速慢时,可能会有卡顿,没网时无法观看.所有说下 ...
- react入门——慕课网笔记
一. jsx 1. 被称为语法糖:糖衣语法,计算机语言中添加的某种语法,对语言的功能没有影响,更方便程序员使用,增加程序的可读性,降低出错的可能性 类似的还有(coffeescript,typescr ...
- JavaScript(转载自 计科学院 慕课网)
什么是脚本语言? ①脚本语言介于HTML和C,C++,Java,C#等编程语言之间 ②脚本语言与编程语言有相似地方,其函数与编程语言类似,也有变量.与编程语言之间最大的区别是编程语言的语法和规则更为严 ...
- PHP消息队列实现及应用_慕课网学习
https://blog.csdn.net/d_g_h/article/details/79643714 https://blog.csdn.net/tTU1EvLDeLFq5btqiK/articl ...
- 慕课网Hibernate初探之一对多映射实验及总结
慕课网Hibernate初探之一对多映射实验及总结 一.本课核心 * 1.如何在MyEclipse中使用Hibernate * 2.如何实现Hibernate中一对多的映射 * 3.如何创建Sessi ...
- 07慕课网《进击Node.js基础(一)》HTTP小爬虫
获取HTML页面 var http = require('http') var url='http://www.imooc.com/learn/348' http.get(url,function(r ...
- JavaScript进阶--慕课网学习笔记
JAVASCRIPT—进阶篇 给变量取个名字(变量命名) 变量名字可以任意取,只不过取名字要遵循一些规则: 1.必须以字母.下划线或美元符号开头,后面可以跟字 ...
随机推荐
- 学习笔记之数据库Database
SQL@Wiki http://en.wikipedia.org/wiki/SQL 一篇文章,掌握所有开源数据库的现状 - AI前线 https://mp.weixin.qq.com/s?__biz= ...
- linux 守护进程 daemon
Linux的Service/Daemon你真的懂了吗? Linux 守护进程的启动方法 linux系统编程之进程(八):守护进程详解及创建,daemon()使用 linux守护进程 daemon 详解
- class<T>和 class<?>类型 有什么区别
平时看java源代码的时候,如果碰到泛型的话,我想? T K V E这些是经常出现的,但是有时想不起来代表什么意思,今天整理下: ? 表示不确定的java类型. T 表示java类型. K V 分别代 ...
- 廖雪峰Java1-2程序基础-8字符和字符串
1.字符类型char char是基本的数据类型 char:保存一个字符,如英文字符.中文字符. Java使用unicode表示字符,可以将char赋值给int类型,查看字符对应的unicode编码. ...
- Ubuntu12.10下Vsftpd的安装
安装Vsftpd sudo apt-get install vsftpd 配置 sudo vim /etc/vsftpd.conf 取消以下两行前面的注释 local_enable=YES write ...
- Python 编程规范梳理
缘由 由于项目团队中新加入了几名攻城狮, 大家之前的背景各不相同,写出的代码也是“风格迥异”.正所谓:“无规则不成方圆”,因此需要对编程进行必要的规范. 整体的思路是:依照PEP8 Python 编码 ...
- javascript创建对象之寄生构造函数模式(六)
这种模式的基本思想是创建一个函数,该函数的作用仅仅是封装创建对象的代码,然后再返回新创建的对象; 但是从表面上看,这个函数有很像典型的构造函数. function createHuman(name,s ...
- STL容器能力一览表和各个容器操作函数异常保证
STL容器能力一览表 Vector Deque List Set Multiset map Multimap 典型内部 结构 dynamic array Array of arrays Doubly ...
- php trim() 函数实例讲解
php trim() 函数移除字符串两侧的空白字符或其他预定义字符,本文章向码农介绍php trim() 函数的使用方法和实例,感兴趣的码农可以参考一下. 定义和用法 trim() 函数移除字符串两侧 ...
- solr联合多个字段进行检索(multivalued和copyfield的使用)
在实际工作中不仅仅对索引中的单个字段进行搜索.需要进行综合查询. 比如book表中有id,name(标题),price,summary(摘要),content(内容),我们要找一本书的时候,查询关键字 ...