接口调用返回的结果是两个字段: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的获取(下)的更多相关文章

  1. 慕课网access_token的获取

    access_token的接口是微信公众号一个基础接口,access_token接口微信公众号一个非常重要的接口 access_token是微信公众号的全局唯一票据,公众号的所有接口的调用都需要使用到 ...

  2. 【小尝试】Java获取慕课网原有路径课程列表

    作为一个老慕课网(https://www.imooc.com/)粉丝,还记得最开始的慕课网有很多免费的路径课程,练习什么的也特别详细,是入门一门语言的好方法. 现在慕课网发展起来了收费模式,添加了很多 ...

  3. 使用js脚本批量下载慕课网视频

    慕课网(http://www.imooc.com/)上有很多不错的视频,当然我不是来给慕课网打广告的,我本人学习过很多慕课网上的免费的视频. 在线看如果网速慢时,可能会有卡顿,没网时无法观看.所有说下 ...

  4. react入门——慕课网笔记

    一. jsx 1. 被称为语法糖:糖衣语法,计算机语言中添加的某种语法,对语言的功能没有影响,更方便程序员使用,增加程序的可读性,降低出错的可能性 类似的还有(coffeescript,typescr ...

  5. JavaScript(转载自 计科学院 慕课网)

    什么是脚本语言? ①脚本语言介于HTML和C,C++,Java,C#等编程语言之间 ②脚本语言与编程语言有相似地方,其函数与编程语言类似,也有变量.与编程语言之间最大的区别是编程语言的语法和规则更为严 ...

  6. PHP消息队列实现及应用_慕课网学习

    https://blog.csdn.net/d_g_h/article/details/79643714 https://blog.csdn.net/tTU1EvLDeLFq5btqiK/articl ...

  7. 慕课网Hibernate初探之一对多映射实验及总结

    慕课网Hibernate初探之一对多映射实验及总结 一.本课核心 * 1.如何在MyEclipse中使用Hibernate * 2.如何实现Hibernate中一对多的映射 * 3.如何创建Sessi ...

  8. 07慕课网《进击Node.js基础(一)》HTTP小爬虫

    获取HTML页面 var http = require('http') var url='http://www.imooc.com/learn/348' http.get(url,function(r ...

  9. JavaScript进阶--慕课网学习笔记

                         JAVASCRIPT—进阶篇 给变量取个名字(变量命名) 变量名字可以任意取,只不过取名字要遵循一些规则: 1.必须以字母.下划线或美元符号开头,后面可以跟字 ...

随机推荐

  1. nginx和apache最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程

    nginx和apache的一些优缺点比较,摘自网络,加自己的一些整理. nginx相对于apache的优点: 1.轻量级,同样是web 服务,比apache 占用更少的内存及资源 2.抗并发,ngin ...

  2. 峰Spring4学习(2)依赖注入的几种方式

    一.装配一个bean 二.依赖注入的几种方式 com.cy.entity   People.java: package com.cy.entity; public class People { pri ...

  3. mysql binlog协议分析--具体event

    这几天在修改canal, 连接mysql和maria接收到的event有所区别 拿一个简单的insert sql来举例 mysql 会有以下几个event写入到binlog里 1.ANONYMOUS_ ...

  4. 操他妈的,jquery1.4以上不能用toggle()轮流切换函数

    query 1.9里面已经删除了toggle(fn1, fn2)函数 (2013-05-07 13:44:27) 转载▼ 标签: it 分类: js jquery 1.9里面已经删除了toggle(f ...

  5. Maven 插件管理

    偶然与巧合 舞动了蝶翼 谁的心头风起 前赴而后继 万千人追寻 荒漠唯一菩提 似擦身相遇 或擦肩而去 命运犹如险棋 无数时间线 无数可能性 终于交织向你

  6. 在visual code的debugger for chrome中调试webpack构建的项目

    一直使用chrome中内置的调试器, 感觉世界那么美好, 自从学了react之后,使用visual code作为编辑器, 它提供了很多插件, 其中就包括debugger for chrome, 一款使 ...

  7. Android SDK的安装与环境配置

    一.Android SDK工具下载.安装 Android SDK工具下载:http://www.androiddevtools.cn/ SDK下载页面如下,由于电脑Windows系统所以下载的Wind ...

  8. vb 水晶报表打印

    vb里面的水晶报表打印控件:CrystalReportViewer 用到的dll文件: 水晶报表打印其实很简单,只要创建报表对象,再对其传递数据就可以打印出来.当然所传递的数据要与水晶报表设计里面的数 ...

  9. Coxph model Pvalue Select2

    4   1) Put summary(coxphobject) into a variable summcph <- summary(coxphobject) 2) examine it wit ...

  10. angular 获取当前值