5.2.2 获取凭证的方式

获取凭证的方式可以分为两种:手动获取和程序获取。手动获取就是将请求地址放到浏览器地址栏进行访问,而程序获取是指通过编程调用获取凭证接口。两种获取方式本质上都是向微信服务器发送HTTPS GET请求。

假定在申请完自定义菜单后,公众账号中的参数如下:

●appid为000000000000000000;

●appsecret为11111111111111111111111111111111。

下面就来看看如何通过这两种方式获取凭证。

1.手动获取

手动获取凭证的方式比较简单。首先,将请求地址中的参数appid和secret的值替换为公众账号的appid和appsecret的值,替换结果如下:

  1. https:// api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=
  2. 000000000000000000&secret=11111111111111111111111111111111

接着,通过浏览器访问上面的请求地址,正常情况下会返回如下所示的凭证信息。

  1. {"access_token":"XEkr7Ze-xOmZU5_dnd-CvfbN7V8UxveRznnGt21jCOGMu6kixS2JSFdhJy1
  2. yT4gV8QXRTCkg6U-L8GUqpqkNdssfkTTPEnhrZKDkYUj8_UvKKZT8bcTlrip1OUxXPMPjc1akcM4eP3
  3. XVrnyn-c8o8w","expires_in":7200}

2.程序获取

在Java中,访问HTTP链接需要使用HttpURLConnection类,而访问HTTPS链接就需要用到HttpsURLConnection类。获取凭证的示例代码如下:

  1. import java.io.BufferedReader;
  2. import java.io.InputStream;
  3. import java.io.InputStreamReader;
  4. import java.net.URL;
  5. import javax.net.ssl.HttpsURLConnection;
  6. import javax.net.ssl.SSLContext;
  7. import javax.net.ssl.SSLSocketFactory;
  8. import javax.net.ssl.TrustManager;
  9. import org.liufeng.course.util.MyX509TrustManager;
  10.  
  11. /**
  12. * 测试获取凭证(HTTPS GET请求)
  13. *
  14. * @author liufeng
  15. * @date 2013-10-12
  16. */
  17. public class TokenTest {
  18. public static void main(String[] args) throws Exception {
  19. // 获取凭证接口地址
  20. String tokenUrl ="https:// api.weixin.qq.com/cgi-bin/token?grant_type=client_
  21. credential&appid=000000000000000000&secret=11111111111111111111111111111111";
  22. // 建立连接
  23. URL url = new URL(tokenUrl);
  24. HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
  25. // 使用自定义的信任管理器
  26. TrustManager[] tm = { new MyX509TrustManager() };
  27. SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
  28. sslContext.init(null, tm, new java.security.SecureRandom());
  29. SSLSocketFactory ssf = sslContext.getSocketFactory();
  30. conn.setSSLSocketFactory(ssf);
  31. conn.setDoInput(true);
  32. // 设置请求方式
  33. conn.setRequestMethod("GET");
  34. // 取得输入流
  35. InputStream inputStream = conn.getInputStream();
  36. InputStreamReader inputStreamReader = new InputStreamReader(inputStream,
  37. "utf-8");
  38. BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
  39. // 读取响应内容
  40. StringBuffer buffer = new StringBuffer();
  41. String str = null;
  42. while ((str = bufferedReader.readLine()) != null) {
  43. buffer.append(str);
  44. }
  45. // 关闭/释放资源
  46. bufferedReader.close();
  47. inputStreamReader.close();
  48. inputStream.close();
  49. conn.disconnect();
  50. // 输出返回结果
  51. System.out.println(buffer);
  52. }
  53. }

以上代码先通过URL对象的openConnection()方法与微信的凭证处理服务建立连接,并将HTTPS请求方式设置为GET。再使用HttpsURLConnection类的getInputStream()方法得到输入流,读取输入流中的内容(正常情况下得到的是凭证信息)。最后关闭输入流,断开连接,将凭证信息输出到控制台,如下所示。

  1. {"access_token":"KUESZgORI7ZrGAXQ3D1nYKXTCtqvIv5OXYocemW6Z6PVk-ohAobZ45NOKXXWOM
  2. zteSb5lN7MYxa18thlJma2htaGeJAKDOceeMqTCsCpqfCZYP0pWUQkoNxJbmlEOR82LyJqfO0i6qvnAt
  3. 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包:

  1. commons-beanutils-1.7.0.jar
  2. commons-collections-3.2.1.jar
  3. commons-lang-2.3.jar
  4. commons-logging-1.0.4.jar
  5. ezmorph-1.0.6.jar

JSON-lib有一个重要类JSONObject,它是一个无序的键值对集合,通过它的静态方法fromObject()能够将JSON格式的凭证信息转换成JSONObject对象,然后再从JSONObject中取出access_token和expires_in。使用JSON-lib解析凭证信息的代码如下:

  1. // 将返回的JSON字符串转换成JSONObject对象
  2. JSONObject jsonObject = JSONObject.fromObject(buffer.toString());
  3. // 接口访问凭证
  4. String accessToken = jsonObject.getString("access_token");
  5. // 凭证的有效期
  6. int expiresIn = jsonObject.getInt("expires_in");

这样就完成了通过程序获取接口访问凭证access_token,下面要使用该凭证调用自定义菜单的相关接口。