5.2.2 获取凭证的方式
获取凭证的方式可以分为两种:手动获取和程序获取。手动获取就是将请求地址放到浏览器地址栏进行访问,而程序获取是指通过编程调用获取凭证接口。两种获取方式本质上都是向微信服务器发送HTTPS GET请求。
假定在申请完自定义菜单后,公众账号中的参数如下:
●appid为000000000000000000;
●appsecret为11111111111111111111111111111111。
下面就来看看如何通过这两种方式获取凭证。
1.手动获取
手动获取凭证的方式比较简单。首先,将请求地址中的参数appid和secret的值替换为公众账号的appid和appsecret的值,替换结果如下:
- https:// api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=
- 000000000000000000&secret=11111111111111111111111111111111
接着,通过浏览器访问上面的请求地址,正常情况下会返回如下所示的凭证信息。
- {"access_token":"XEkr7Ze-xOmZU5_dnd-CvfbN7V8UxveRznnGt21jCOGMu6kixS2JSFdhJy1
- yT4gV8QXRTCkg6U-L8GUqpqkNdssfkTTPEnhrZKDkYUj8_UvKKZT8bcTlrip1OUxXPMPjc1akcM4eP3
- XVrnyn-c8o8w","expires_in":7200}
2.程序获取
在Java中,访问HTTP链接需要使用HttpURLConnection类,而访问HTTPS链接就需要用到HttpsURLConnection类。获取凭证的示例代码如下:
- import java.io.BufferedReader;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.net.URL;
- import javax.net.ssl.HttpsURLConnection;
- import javax.net.ssl.SSLContext;
- import javax.net.ssl.SSLSocketFactory;
- import javax.net.ssl.TrustManager;
- import org.liufeng.course.util.MyX509TrustManager;
- /**
- * 测试获取凭证(HTTPS GET请求)
- *
- * @author liufeng
- * @date 2013-10-12
- */
- public class TokenTest {
- public static void main(String[] args) throws Exception {
- // 获取凭证接口地址
- String tokenUrl ="https:// api.weixin.qq.com/cgi-bin/token?grant_type=client_
- credential&appid=000000000000000000&secret=11111111111111111111111111111111";
- // 建立连接
- URL url = new URL(tokenUrl);
- HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
- // 使用自定义的信任管理器
- TrustManager[] tm = { new MyX509TrustManager() };
- SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
- sslContext.init(null, tm, new java.security.SecureRandom());
- SSLSocketFactory ssf = sslContext.getSocketFactory();
- conn.setSSLSocketFactory(ssf);
- conn.setDoInput(true);
- // 设置请求方式
- conn.setRequestMethod("GET");
- // 取得输入流
- InputStream inputStream = conn.getInputStream();
- InputStreamReader inputStreamReader = new InputStreamReader(inputStream,
- "utf-8");
- BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
- // 读取响应内容
- StringBuffer buffer = new StringBuffer();
- String str = null;
- while ((str = bufferedReader.readLine()) != null) {
- buffer.append(str);
- }
- // 关闭/释放资源
- bufferedReader.close();
- inputStreamReader.close();
- inputStream.close();
- conn.disconnect();
- // 输出返回结果
- System.out.println(buffer);
- }
- }
以上代码先通过URL对象的openConnection()方法与微信的凭证处理服务建立连接,并将HTTPS请求方式设置为GET。再使用HttpsURLConnection类的getInputStream()方法得到输入流,读取输入流中的内容(正常情况下得到的是凭证信息)。最后关闭输入流,断开连接,将凭证信息输出到控制台,如下所示。
- {"access_token":"KUESZgORI7ZrGAXQ3D1nYKXTCtqvIv5OXYocemW6Z6PVk-ohAobZ45NOKXXWOM
- zteSb5lN7MYxa18thlJma2htaGeJAKDOceeMqTCsCpqfCZYP0pWUQkoNxJbmlEOR82LyJqfO0i6qvnAt
- RjoIuKA","Uexpires_in":7200}
接下来要解决的问题是如何从上面的JSON字符串中解析出access_token和expires_in。这里向读者推荐一款开源的JSON开发工具包JSON-lib,它能够将JSON字符串转换成Java对象,这样就可以方便地从对象中取数据了。读者可以从http://json-lib.sourceforge.net/上了解关于JSON-lib的更多信息,也可以下载到它的JAR包,笔者下载的是json-lib-2.2.3-jdk13.jar。需要注意的是,JSON-lib不能单独使用,它依赖于以下JAR包:
- commons-beanutils-1.7.0.jar
- commons-collections-3.2.1.jar
- commons-lang-2.3.jar
- commons-logging-1.0.4.jar
- ezmorph-1.0.6.jar
JSON-lib有一个重要类JSONObject,它是一个无序的键值对集合,通过它的静态方法fromObject()能够将JSON格式的凭证信息转换成JSONObject对象,然后再从JSONObject中取出access_token和expires_in。使用JSON-lib解析凭证信息的代码如下:
- // 将返回的JSON字符串转换成JSONObject对象
- JSONObject jsonObject = JSONObject.fromObject(buffer.toString());
- // 接口访问凭证
- String accessToken = jsonObject.getString("access_token");
- // 凭证的有效期
- int expiresIn = jsonObject.getInt("expires_in");
这样就完成了通过程序获取接口访问凭证access_token,下面要使用该凭证调用自定义菜单的相关接口。