一、前言
之前一直在说”微信公众平台接口”、”SDK”等概念,这里终于可以调用微信接口了,今天讲解access_token的调用。
二、access_token简介
2.1 access_token
accessToken在微信开发者文档中是这样定义的: access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存(至于保存到数据库还是服务器缓存中就要看具体的业务需要了)。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。 备注: 1.access_token是加密的字符串,其目的是为了接口安全考虑,不然随便就能调用微信服务器的接口会有很大风险; 2.access_token:公众号的全局唯一票据(登陆后的凭据,证明你已经登陆,相当于你拿着票去看演唱会,说明你已经买票了,才会让你进);
2.2 AppId和AppSecret
AppID:开发者ID是公众号开发识别码,配合开发者密码可调用公众号的接口能力。 AppSecret:开发者密码是校验公众号开发者身份的密码,具有极高的安全性。切记勿把密码直接交给第三方开发者或直接存储在代码中。如需第三方代开发公众号,请使用授权方式接入。 如图:
2.3 ip白名单
在配置AppSecret时需要设置ip白名单。 1.启用ip白名单的目的 微信公众平台目前已经发布通知在平台接口调用上为了提高安全性需要添加IP白名单并仅允许白名单IP调用。 目前微信公众平台面向开发者主要提供的开发者ID和开发者密钥,在调用时ID和密钥通过检验即可进行调用。 新增的IP白名单是当前各种安全模式中非常流行的安全策略,在泄露开发者ID和密钥的情况下也不易被盗用。 备注: 1.该IP指的是调用该接口的服务器IP地址; 2.当调用时返回错误代码40164即代表调用的IP地址不在白名单中,因此如遇此问题请检查IP白名单设置。 2.查询ip的方法: 通过浏览器访问http://ip.qq.com/,可查看当前IP地址。
三、获取access_token
3.1 接口调用请求说明
1.接口调用请求说明 http请求方式: GET
https://api
.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
2.参数说明
参数是否必须说明grant_type 是获取access_token填写client_credentialappid是第三方用户唯一凭证secret是第三方用户唯一凭证密钥,既appsecret
3.返回说明 正常情况下,微信会返回下述JSON数据包给公众号:
{"
access_token":
"ACCESS_TOKEN","
expires_in":
7200}
参数说明access_token 获取到的凭证aexpires_in凭证有效时间,单位:秒
错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):
{"
errcode":
40013,"
errmsg":
"invalid appid"}
3.2 代码实现
package cn.edu.sdut.service;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import javax.faces.bean.ManagedBean;
import javax.enterprise.context.RequestScoped;
@SuppressWarnings(
"deprecation")
@RequestScoped
@ManagedBean(name =
"accessTokenUtil")
public class AccessTokenUtil {
public static final String GET_TOKEN_URL =
"https://api.weixin.qq.com/cgi-bin/token";
public static final String APP_ID =
"wxa549b28c24cf341e";
public static final String SECRET =
"78d8a8cd7a4fa700142d06b96bf44a37";
private static HttpClient client;
@SuppressWarnings(
"finally")
public static String
getToken(String apiurl, String appid, String secret) {
String turl = String.format(
"%s?grant_type=client_credential&appid=%s&secret=%s", apiurl, appid, secret);
client =
new DefaultHttpClient();
HttpGet get =
new HttpGet(turl);
JsonParser jsonparer =
new JsonParser();
String result =
null;
try {
HttpResponse res = client.execute(get);
String responseContent =
null;
HttpEntity entity = res.getEntity();
responseContent = EntityUtils.toString(entity,
"UTF-8");
JsonObject json = jsonparer.parse(responseContent).getAsJsonObject();
if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
if (json.get(
"errcode") !=
null) {
}
else {
result = json.get(
"access_token").getAsString();
}
}
}
catch (Exception e) {
e.printStackTrace();
}
finally {
client.getConnectionManager().shutdown();
return result;
}
}
public void printToken()
throws Exception {
System.out.println(
"=========1获取token=========");
String accessToken = getToken(GET_TOKEN_URL, APP_ID, SECRET);
if (accessToken !=
null)
System.out.println(accessToken);
}
}
四、微信公众平台接口调试工具
https://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t=index&type=基础支持&form=获取access_token接口 /token
五、代码库
详细完整代码,请移步: https://github.com/GaoZiqiang/WeChatDevelopment