- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java微信公众平台开发(6) 微信开发中的token获取由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
(一)token的介绍 。
引用:access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效! 。
(二)token的获取参考文档 。
获取的流程我们完全可以参考微信官方文档:http://mp.weixin.qq.com/wiki/14/9f9c82c1af308e3b14ba9b973f99a8ba.html 如图:
(三)token获取流程分析 。
从公众平台获取账号的AppID和AppSecret; token获取并解析存储执行体; 采用任务调度每隔两小时执行一次token获取执行体; 。
(四)token的获取流程的具体实现 ①获取appid和appsecret 。
在微信公众平台【开发】——>【基本配置】中可以查看到我们需要的两个参数:
这里我们将他们定义到我们的配置文件【wechat.properties】中,大致代码为:
1
2
3
4
|
#获取到的appid
appid=wx7e32765bc24XXXX
#获取到的AppSecret
AppSecret=d58051564fe9d86093f9XXXXX
|
②token获取并解析存储执行体的代码编写 。
由于在这里我们需要通过http的get请求向微信服务器获取时效性为7200秒的token,所以我在这里写了一个http请求的工具类,以方便我们的使用,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
|
package
com.cuiyongzhi.wechat.util;
import
java.io.BufferedInputStream;
import
java.io.BufferedReader;
import
java.io.IOException;
import
java.io.InputStream;
import
java.io.InputStreamReader;
import
java.io.OutputStreamWriter;
import
java.net.MalformedURLException;
import
java.net.URI;
import
java.net.URL;
import
java.net.URLConnection;
import
java.util.ArrayList;
import
java.util.List;
import
java.util.Map;
import
java.util.Set;
import
java.util.zip.GZIPInputStream;
import
org.apache.http.HttpResponse;
import
org.apache.http.NameValuePair;
import
org.apache.http.client.ClientProtocolException;
import
org.apache.http.client.HttpClient;
import
org.apache.http.client.entity.UrlEncodedFormEntity;
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.message.BasicNameValuePair;
import
org.apache.http.protocol.HTTP;
import
org.apache.http.util.EntityUtils;
/**
* ClassName: HttpUtils
*
* @Description: http请求工具类
* @author dapengniao
* @date 2016年3月10日 下午3:57:14
*/
@SuppressWarnings
(
"deprecation"
)
public
class
HttpUtils {
/**
* @Description: http get请求共用方法
* @param @param reqUrl
* @param @param params
* @param @return
* @param @throws Exception
* @author dapengniao
* @date 2016年3月10日 下午3:57:39
*/
@SuppressWarnings
(
"resource"
)
public
static
String sendGet(String reqUrl, Map<String, String> params)
throws
Exception {
InputStream inputStream =
null
;
HttpGet request =
new
HttpGet();
try
{
String url = buildUrl(reqUrl, params);
HttpClient client =
new
DefaultHttpClient();
request.setHeader(
"Accept-Encoding"
,
"gzip"
);
request.setURI(
new
URI(url));
HttpResponse response = client.execute(request);
inputStream = response.getEntity().getContent();
String result = getJsonStringFromGZIP(inputStream);
return
result;
}
finally
{
if
(inputStream !=
null
) {
inputStream.close();
}
request.releaseConnection();
}
}
/**
* @Description: http post请求共用方法
* @param @param reqUrl
* @param @param params
* @param @return
* @param @throws Exception
* @author dapengniao
* @date 2016年3月10日 下午3:57:53
*/
@SuppressWarnings
(
"resource"
)
public
static
String sendPost(String reqUrl, Map<String, String> params)
throws
Exception {
try
{
Set<String> set = params.keySet();
List<NameValuePair> list =
new
ArrayList<NameValuePair>();
for
(String key : set) {
list.add(
new
BasicNameValuePair(key, params.get(key)));
}
if
(list.size() >
0
) {
try
{
HttpClient client =
new
DefaultHttpClient();
HttpPost request =
new
HttpPost(reqUrl);
request.setHeader(
"Accept-Encoding"
,
"gzip"
);
request.setEntity(
new
UrlEncodedFormEntity(list, HTTP.UTF_8));
HttpResponse response = client.execute(request);
InputStream inputStream = response.getEntity().getContent();
try
{
String result = getJsonStringFromGZIP(inputStream);
return
result;
}
finally
{
inputStream.close();
}
}
catch
(Exception ex) {
ex.printStackTrace();
throw
new
Exception(
"网络连接失败,请连接网络后再试"
);
}
}
else
{
throw
new
Exception(
"参数不全,请稍后重试"
);
}
}
catch
(Exception ex) {
ex.printStackTrace();
throw
new
Exception(
"发送未知异常"
);
}
}
/**
* @Description: http post请求json数据
* @param @param urls
* @param @param params
* @param @return
* @param @throws ClientProtocolException
* @param @throws IOException
* @author dapengniao
* @date 2016年3月10日 下午3:58:15
*/
public
static
String sendPostBuffer(String urls, String params)
throws
ClientProtocolException, IOException {
HttpPost request =
new
HttpPost(urls);
StringEntity se =
new
StringEntity(params, HTTP.UTF_8);
request.setEntity(se);
// 发送请求
@SuppressWarnings
(
"resource"
)
HttpResponse httpResponse =
new
DefaultHttpClient().execute(request);
// 得到应答的字符串,这也是一个 JSON 格式保存的数据
String retSrc = EntityUtils.toString(httpResponse.getEntity());
request.releaseConnection();
return
retSrc;
}
/**
* @Description: http请求发送xml内容
* @param @param urlStr
* @param @param xmlInfo
* @param @return
* @author dapengniao
* @date 2016年3月10日 下午3:58:32
*/
public
static
String sendXmlPost(String urlStr, String xmlInfo) {
// xmlInfo xml具体字符串
try
{
URL url =
new
URL(urlStr);
URLConnection con = url.openConnection();
con.setDoOutput(
true
);
con.setRequestProperty(
"Pragma:"
,
"no-cache"
);
con.setRequestProperty(
"Cache-Control"
,
"no-cache"
);
con.setRequestProperty(
"Content-Type"
,
"text/xml"
);
OutputStreamWriter out =
new
OutputStreamWriter(
con.getOutputStream());
out.write(
new
String(xmlInfo.getBytes(
"utf-8"
)));
out.flush();
out.close();
BufferedReader br =
new
BufferedReader(
new
InputStreamReader(
con.getInputStream()));
String lines =
""
;
for
(String line = br.readLine(); line !=
null
; line = br
.readLine()) {
lines = lines + line;
}
return
lines;
// 返回请求结果
}
catch
(MalformedURLException e) {
e.printStackTrace();
}
catch
(IOException e) {
e.printStackTrace();
}
return
"fail"
;
}
private
static
String getJsonStringFromGZIP(InputStream is) {
String jsonString =
null
;
try
{
BufferedInputStream bis =
new
BufferedInputStream(is);
bis.mark(
2
);
// 取前两个字节
byte
[] header =
new
byte
[
2
];
int
result = bis.read(header);
// reset输入流到开始位置
bis.reset();
// 判断是否是GZIP格式
int
headerData = getShort(header);
// Gzip 流 的前两个字节是 0x1f8b
if
(result != -
1
&& headerData ==
0x1f8b
) {
// LogUtil.i("HttpTask", " use GZIPInputStream ");
is =
new
GZIPInputStream(bis);
}
else
{
// LogUtil.d("HttpTask", " not use GZIPInputStream");
is = bis;
}
InputStreamReader reader =
new
InputStreamReader(is,
"utf-8"
);
char
[] data =
new
char
[
100
];
int
readSize;
StringBuffer sb =
new
StringBuffer();
while
((readSize = reader.read(data)) >
0
) {
sb.append(data,
0
, readSize);
}
jsonString = sb.toString();
bis.close();
reader.close();
}
catch
(Exception e) {
e.printStackTrace();
}
return
jsonString;
}
private
static
int
getShort(
byte
[] data) {
return
(data[
0
] <<
8
) | data[
1
] &
0xFF
;
}
/**
* 构建get方式的url
*
* @param reqUrl
* 基础的url地址
* @param params
* 查询参数
* @return 构建好的url
*/
public
static
String buildUrl(String reqUrl, Map<String, String> params) {
StringBuilder query =
new
StringBuilder();
Set<String> set = params.keySet();
for
(String key : set) {
query.append(String.format(
"%s=%s&"
, key, params.get(key)));
}
return
reqUrl +
"?"
+ query.toString();
}
}
|
我们在做http请求的时候需要目标服务器的url,这里在项目中为了方便对url的管理我们在资源目录下建立了interface_url.properties用于存放目标url,这里我们将请求token的url存入:
1
2
|
#获取token的url
tokenUrl=https:
//api.weixin.qq.com/cgi-bin/token
|
我们需要将我们配置的配置文件在项目初始化后能得到启动,所以我在这里加入一个项目初始化的代码实现,用于项目启动初始化interface_url.properties和wechat.properties中的配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package
com.cuiyongzhi.web.start;
import
javax.servlet.ServletConfig;
import
javax.servlet.ServletException;
import
javax.servlet.http.HttpServlet;
/**
* ClassName: InterfaceUrlIntiServlet
* @Description: 项目启动初始化servlet
* @author dapengniao
* @date 2016年3月10日 下午4:08:43
*/
public
class
InterfaceUrlIntiServlet
extends
HttpServlet {
private
static
final
long
serialVersionUID = 1L;
@Override
public
void
init(ServletConfig config)
throws
ServletException {
InterfaceUrlInti.init();
}
}
|
初始化的具体实现,将初始化过后的方法都存入到GlobalConstants中方便项目中随意调用,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
package
com.cuiyongzhi.web.start;
import
java.io.IOException;
import
java.io.InputStream;
import
java.util.Properties;
import
com.cuiyongzhi.web.util.GlobalConstants;
/**
* ClassName: InterfaceUrlInti
* @Description: 项目启动初始化方法
* @author dapengniao
* @date 2016年3月10日 下午4:08:21
*/
public
class
InterfaceUrlInti {
public
synchronized
static
void
init(){
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Properties props =
new
Properties();
if
(GlobalConstants.interfaceUrlProperties==
null
){
GlobalConstants.interfaceUrlProperties =
new
Properties();
}
InputStream in =
null
;
try
{
in = cl.getResourceAsStream(
"interface_url.properties"
);
props.load(in);
for
(Object key : props.keySet()){
GlobalConstants.interfaceUrlProperties.put(key, props.get(key));
}
props =
new
Properties();
in = cl.getResourceAsStream(
"wechat.properties"
);
props.load(in);
for
(Object key : props.keySet()){
GlobalConstants.interfaceUrlProperties.put(key, props.get(key));
}
}
catch
(IOException e) {
e.printStackTrace();
}
finally
{
if
(in!=
null
){
try
{
in.close();
}
catch
(IOException e) {
e.printStackTrace();
}
}
}
return
;
}
}
|
当我们把所有的准备工作都做好了之后我们可以开始真正的去获取token了,这里我们将获取到的token解析之后依然存储到GlobalConstants中方便使用,简单代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
package
com.cuiyongzhi.wechat.common;
import
java.util.HashMap;
import
java.util.Map;
import
net.sf.json.JSONObject;
import
com.cuiyongzhi.web.util.GlobalConstants;
import
com.cuiyongzhi.wechat.util.HttpUtils;
/**
* ClassName: WeChatTask
* @Description: 微信两小时定时任务体
* @author dapengniao
* @date 2016年3月10日 下午1:42:29
*/
public
class
WeChatTask {
/**
* @Description: 任务执行体
* @param @throws Exception
* @author dapengniao
* @date 2016年3月10日 下午2:04:37
*/
public
void
getToken_getTicket()
throws
Exception {
Map<String, String> params =
new
HashMap<String, String>();
params.put(
"grant_type"
,
"client_credential"
);
params.put(
"appid"
, GlobalConstants.getInterfaceUrl(
"appid"
));
params.put(
"secret"
, GlobalConstants.getInterfaceUrl(
"AppSecret"
));
String jstoken = HttpUtils.sendGet(
GlobalConstants.getInterfaceUrl(
"tokenUrl"
), params);
String access_token = JSONObject.fromObject(jstoken).getString(
"access_token"
);
// 获取到token并赋值保存
GlobalConstants.interfaceUrlProperties.put(
"access_token"
, access_token);
System.out.println(
new
SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss"
).format(
new
Date())+
"token为=============================="
+access_token);
}
}
|
(三)采用任务调度每隔两小时执行一次token获取执行体 。
我们阅读过微信的文档会发现我们的token获取的接口每天是有调用次数限制的,为了防止我们业务量比较大的情况下token的直接调用的接口次数不够用,所以我们需要根据token的时效性(7200s)在自己的业务服务器上做到token的缓存并定时获取,我这里用到的任务调度的方式是采用quartz,有关quartz的使用可以参考文章 http://cuiyongzhi.com/?tags=%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1 ,下面具体代码的实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
package
com.cuiyongzhi.wechat.quartz;
import
org.apache.log4j.Logger;
import
com.cuiyongzhi.wechat.common.WeChatTask;
public
class
QuartzJob{
private
static
Logger logger = Logger.getLogger(QuartzJob.
class
);
/**
* @Description: 任务执行获取token
* @param
* @author dapengniao
* @date 2016年3月10日 下午4:34:26
*/
public
void
workForToken() {
try
{
WeChatTask timer =
new
WeChatTask();
timer.getToken_getTicket();
}
catch
(Exception e) {
logger.error(e, e);
}
}
}
|
这里新建配置文件spring-quartz.xml以方便quartz任务的管理和启用,这里将我们需要用到的workForToken()加入到执行任务中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<
beans
>
<!-- 要调用的工作类 -->
<
bean
id
=
"quartzJob"
class
=
"com.cuiyongzhi.wechat.quartz.QuartzJob"
></
bean
>
<!-- 定义调用对象和调用对象的方法 -->
<
bean
id
=
"jobtaskForToken"
class
=
"org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
>
<!-- 调用的类 -->
<
property
name
=
"targetObject"
>
<
ref
bean
=
"quartzJob"
/>
</
property
>
<!-- 调用类中的方法 -->
<
property
name
=
"targetMethod"
>
<
value
>workForToken</
value
>
</
property
>
</
bean
>
<!-- 定义触发时间 -->
<
bean
id
=
"doTimeForToken"
class
=
"org.springframework.scheduling.quartz.CronTriggerBean"
>
<
property
name
=
"jobDetail"
>
<
ref
bean
=
"jobtaskForToken"
/>
</
property
>
<!-- cron表达式 -->
<
property
name
=
"cronExpression"
>
<
value
>0 0/1 * * * ?</
value
>
</
property
>
</
bean
>
<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<
bean
id
=
"startQuertz"
lazy-init
=
"false"
autowire
=
"no"
class
=
"org.springframework.scheduling.quartz.SchedulerFactoryBean"
>
<
property
name
=
"triggers"
>
<
list
>
<
ref
bean
=
"doTimeForToken"
/>
</
list
>
</
property
>
</
bean
>
</
beans
>
|
这里我为了测试将执行间隔时间设置成了1分钟一次,根据需要可以自行修改执行时间;最后我们需要在我们的web.xml启动项中开启quartz的使用:
1
2
3
4
5
|
<
context-param
>
<
param-name
>contextConfigLocation</
param-name
>
<
param-value
>classpath:spring.xml,classpath:spring-mybatis.xml,classpath:spring-quartz.xml</
param-value
>
<!-- ,classpath:spring-quartz.xml 用于做任务调度 任务定时都可以 -->
</
context-param
>
|
当这一切都准备完毕之后我们启动项目,会发现每间隔一分钟就会有token获取到,这里我是将其存储在项目变量中,但是如果需要考虑到项目横向扩展这里建议将token存储到缓存中;运行结果如下:
那么到这里token的获取和保存就基本讲完了,下一篇将讲述【多媒体消息的回复】,感谢你的翻阅,如果有需要源码或有疑问可以留言! 。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:http://www.cuiyongzhi.com/post/44.html 。
最后此篇关于Java微信公众平台开发(6) 微信开发中的token获取的文章就讲到这里了,如果你想了解更多关于Java微信公众平台开发(6) 微信开发中的token获取的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
当有人使用微信(微信)分享我的一款游戏(用 JavaScript 制作)时,我正在使用 WeixinJSBridge 修改分享参数。 下面的代码位于一个很大的 JavaScript 文件(超过 250
我转微信了padplus来自wechaty-puppet-puppeteer的傀儡并发现它比 wechaty-puppet-puppeteer 更频繁地停止.即,wechaty-puppet-pupp
微信小程序一出,立马炸开了锅,都去搭建自己的开发环境,我这里也来尝尝先,之前发了一篇文章,有人问demo怎么导入? demo源代码(来自网络) 百度: https://pan.baidu.com
微信小程序可谓是今天最火的一个名词了,一经出现真是轰炸了整个开发人员,当然很多app开发人员有了一个担心,微信小程序的到来会不会给移动端app带来一个寒冬,身为一个android开发者我是不相信的,
memcache缓存存储用户信息7000秒 ? 1
微信开发生成带参数的二维码的讲解 在微信公众号平台开发者那里,在“账号管理”那里,有一项功能是“生成带参数的二维码”,通过这儿生成的二维码,只要通过微信扫一扫之后,会把事件自动推送到微信公众号上
某日,一同学给小的发了 Github 源码,说是可以轻松查到删除自己的微信好友,于是就开始了作死之路。 Github 源码请看:0x5e/wechat-deleted-friends 前言
近段时间山西的连续降雨,不少的城市都出现了洪灾,救灾物资匮乏,不少明星及爱心人士都纷纷向山西捐款,那么目前来说山西捐款的通道有哪些呢?在支付宝,微信上如何给山西捐款呢?下面就和小编一起来看看山西捐款
一.集成支付宝支付 支付宝集成官方教程 https://docs.open.alipay.com/204/105295/ 支付宝集成官方demo https://docs.o
一.越来越多的app增加第三方的功能,可能app有不同的页面但调用相同的支付方式,例如界面如下: 这两个页面都会使用第三方支付支付:(微信,支付宝,银联)如果在每一个页面都直接调用第三方支付的
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我安装了一个虚假的位置应用程序并将我的位置设置为不同的位置。然后打开谷歌地图和微信应用, Google map 将我的位置显示为我设置的(假的) 微信应用忽略虚假位置并检测真实位置(如何?) 然后我想
前言 支付分APP支付、H5支付、扫码支付等。app支付一般在app中使用,并且需要集成相应的支付SDK,H5支付多用于网页。如果你的APP不想集成支付SDK,又想实现支付功能,你可以在项目中使用
最近一直在调用微信的api,却发现一直调用不成功,纠结了好久,各方面找教程,找官方,官方里的文档也只是写得很模糊,说是按三步走。 1、申请app_id 2、填写包名3、 获取程序签
和平精英QQ/微信 每日登陆抽奖1~188Q币 活动两个QQ和微信都可以 每天登陆游戏并且玩一局 然后可以去活动界面抽奖Q币 QQ端(需玩一局):http://t.cn/Ai1Jn7Tz
目前,当我使用带有 Link 插件的 TinyMce4.5.1 时。即使我将属性 link_list 设置为 false,我也找不到隐藏默认 URL 选项(#top、#bottom)的方法。除了破
实际上,我正在尝试使用微信为我的 Web 应用程序设置 OAuth 登录。所以,我在微信上创建了一个帐户,并使用了一个测试帐户来无限访问。 因此,在测试帐户配置中,我已成功验证来自微信的 token
不管是腾讯还是新浪,查看他们的API,PHP都是有完整的接口,但对C#支持似乎都不是那么完善,都没有,腾讯是完全没有,新浪是提供第三方的,而且后期还不一定升级,NND,用第三方的动辄就一个类库,各种
和平精英QQ/微信 每日登陆抽奖1~188Q币/现金红包 活动两个QQ和微信都可以 QQ的登录游戏和分享好友即可获得三次抽奖次数 微信登录游戏就可以抽奖 如果没有反应就分享链接出去从分享的链接进
我想做什么 我正在尝试将我自己的基于 WebGL 的引擎移植到微信小游戏环境,目前只是尝试让 WebGL 上下文被粉红色清除: 有什么问题 我已经按照腾讯提供的示例以及 ThreeJS 示例来设置游戏
我是一名优秀的程序员,十分优秀!