一、本节要点
1.获取通讯录密钥
获取方式:
登录企业微信—>管理工具—>通讯录同步助手—>开启“API接口同步” ; 开启后,即可看到通讯录密钥,也可设置通讯录API的权限:读取或者编辑通讯录。
获取通讯录密钥的目的:
通过企业ID(CorpId)和 通讯录密钥可以获取通讯录相关接口的使用凭证(AccessToken)。有了AccessToken,就可以使用通讯录相关接口了。
凭证的获取方式有两种(此处暂时存疑,以待勘误):
通讯录AccessToken:CorpId+通讯录密钥
其他AccessToken:CorpId+应用密钥
2.json序列化
2.1序列化和反序列化的概念
把对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为对象的过程称为对象的反序列化。
2.2对象的序列化的目的
1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2) 在网络上传送对象的字节序列。
2.3java序列化方式
(1)java原生序列化
(2)json序列化
而json序列化可使用 ① json-lib
②fastJson
③gson
2.4json序列化与反序列化
这里我们采用gson来实现java对象的序列化,需要引入 gson-2.7.jar 包。
(1)简单的Jason
{ "userid": "zhangsan", "name": "张三", "english_name": "jackzhang" }
使用gson.toJson(user)即可将user对象顺序转成json字符串,如下
Gson gson = new Gson(); String jsonU1 =gson.toJson(user);
(2)带数组的json
将department设为list<Integer>类型即可
{ "userid": "zhangsan", "name": "张三", "english_name": "jackzhang" "department": [1, 2], }
(3)包含子对象的json
以下代码为文本消息的json字符串,将text属性类型设为Text,Text类中包含content属性。然后使用 gson.toJson(user)
{ "msgtype" : "text", "agentid" : 1, "text" : { "content" : "你的快递已到,请携带工卡前往邮件中心领取。\n出发前可查看<a href=\"http://work.weixin.qq.com\">邮件中心视频实况</a>,聪明避开排队。" }, }
关于Json序列化,读者在 Java企业微信开发_05_消息推送之发送消息 这一节会有更深刻的理解,这一周将会继续总结。
3.企业微信开发思路
企业微信的开发大体可分为以下几步:
(1)封装实体类
参考官方文档给出的请求包、回包(即响应包),封装对应的java实体类。
(2)java对象的序列化
将java对象序列化为json格式的字符串
(3)获取AccessToken,拼接请求接口url
(4)调用接口发送http请求
封装好http请求方法:httpRequest(请求url, 请求方法POST/GET, 请求包);
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 /** 2 * 1.发起https请求并获取结果 3 * 4 * @param requestUrl 请求地址 5 * @param requestMethod 请求方式(GET、POST) 6 * @param outputStr 提交的数据 7 * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值) 8 */ 9 public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) { 10 JSONObject jsonObject = null; 11 StringBuffer buffer = new StringBuffer(); 12 try { 13 // 创建SSLContext对象,并使用我们指定的信任管理器初始化 14 TrustManager[] tm = { new MyX509TrustManager() }; 15 SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); 16 sslContext.init(null, tm, new java.security.SecureRandom()); 17 // 从上述SSLContext对象中得到SSLSocketFactory对象 18 SSLSocketFactory ssf = sslContext.getSocketFactory(); 19 20 URL url = new URL(requestUrl); 21 HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection(); 22 httpUrlConn.setSSLSocketFactory(ssf); 23 24 httpUrlConn.setDoOutput(true); 25 httpUrlConn.setDoInput(true); 26 httpUrlConn.setUseCaches(false); 27 // 设置请求方式(GET/POST) 28 httpUrlConn.setRequestMethod(requestMethod); 29 30 if ("GET".equalsIgnoreCase(requestMethod)) 31 httpUrlConn.connect(); 32 33 // 当有数据需要提交时 34 if (null != outputStr) { 35 OutputStream outputStream = httpUrlConn.getOutputStream(); 36 // 注意编码格式,防止中文乱码 37 outputStream.write(outputStr.getBytes("UTF-8")); 38 outputStream.close(); 39 } 40 41 // 将返回的输入流转换成字符串 42 InputStream inputStream = httpUrlConn.getInputStream(); 43 InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); 44 BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 45 46 String str = null; 47 while ((str = bufferedReader.readLine()) != null) { 48 buffer.append(str); 49 } 50 bufferedReader.close(); 51 inputStreamReader.close(); 52 // 释放资源 53 inputStream.close(); 54 inputStream = null; 55 httpUrlConn.disconnect(); 56 jsonObject = JSONObject.fromObject(buffer.toString()); 57 } catch (ConnectException ce) { 58 log.error("Weixin server connection timed out."); 59 } catch (Exception e) { 60 log.error("https request error:{}", e); 61 } 62 return jsonObject; 63 }
二、代码实现
相关jar包:
2.1 工具类之微信参数封装类——WeiXinParamesUtil.java
此类封装了微信的相关参数,如企业id、应用凭证、通讯录凭证等。封装起来更易维护,实现一处修改多处改变。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 package com.ray.util; 2 /** 3 * 微信参数 4 * @author shirayner 5 * 6 */ 7 public class WeiXinParamesUtil { 8 //1.微信参数 9 //token 10 public final static String token = "ray"; 11 // encodingAESKey 12 public final static String encodingAESKey = "z2W9lyOAR1XjY8mopEmiSqib0TlBZzCFiCLp6IdS2Iv"; 13 //企业ID 14 public final static String corpId = "ww92f5da92bb24696e"; 15 16 //应用的凭证密钥 17 public final static String agentSecret = "I73733veH3uCs6H_ijPvIq0skjTaOePsFF4MyCEi3Ag"; 18 //通讯录秘钥 19 public final static String contactsSecret = "1m_9XP62YrXjSiYtL5ThbexiLVWBThukiK5sH7wm1TM"; 20 21 //企业应用的id,整型。可在应用的设置页面查看 22 public final static int agentId = 1000002; 23 24 }
2.2 工具类之微信辅助类——WeiXinUtil.java
此类封装了http请求、https请求、获取accessToken的方法
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 package com.ray.util; 2 3 import java.io.BufferedReader; 4 import java.io.InputStream; 5 import java.io.InputStreamReader; 6 import java.io.OutputStream; 7 import java.net.ConnectException; 8 import java.net.HttpURLConnection; 9 import java.net.URL; 10 import javax.net.ssl.HttpsURLConnection; 11 import javax.net.ssl.SSLContext; 12 import javax.net.ssl.SSLSocketFactory; 13 import javax.net.ssl.TrustManager; 14 import org.slf4j.Logger; 15 import org.slf4j.LoggerFactory; 16 import com.ray.pojo.AccessToken; 17 import net.sf.json.JSONException; 18 import net.sf.json.JSONObject; 19 20 public class WeiXinUtil { 21 22 private static Logger log = LoggerFactory.getLogger(WeiXinUtil.class); 23 //微信的请求url 24 //获取access_token的接口地址(GET) 限200(次/天) 25 public final static String access_token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpId}&corpsecret={corpsecret}"; 26 27 28 29 /** 30 * 1.发起https请求并获取结果 31 * 32 * @param requestUrl 请求地址 33 * @param requestMethod 请求方式(GET、POST) 34 * @param outputStr 提交的数据 35 * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值) 36 */ 37 public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) { 38 JSONObject jsonObject = null; 39 StringBuffer buffer = new StringBuffer(); 40 try { 41 // 创建SSLContext对象,并使用我们指定的信任管理器初始化 42 TrustManager[] tm = { new MyX509TrustManager() }; 43 SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); 44 sslContext.init(null, tm, new java.security.SecureRandom()); 45 // 从上述SSLContext对象中得到SSLSocketFactory对象 46 SSLSocketFactory ssf = sslContext.getSocketFactory(); 47 48 URL url = new URL(requestUrl); 49 HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection(); 50 httpUrlConn.setSSLSocketFactory(ssf); 51 52 httpUrlConn.setDoOutput(true); 53 httpUrlConn.setDoInput(true); 54 httpUrlConn.setUseCaches(false); 55 // 设置请求方式(GET/POST) 56 httpUrlConn.setRequestMethod(requestMethod); 57 58 if ("GET".equalsIgnoreCase(requestMethod)) 59 httpUrlConn.connect(); 60 61