Java企业微信开发_02_通讯录同步

一、本节要点

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, 请求包);  

 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     }  
View Code

 

二、代码实现

相关jar包:

 

2.1 工具类之微信参数封装类——WeiXinParamesUtil.java

此类封装了微信的相关参数,如企业id、应用凭证、通讯录凭证等。封装起来更易维护,实现一处修改多处改变。

 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 }
View Code

 

2.2 工具类之微信辅助类——WeiXinUtil.java

此类封装了http请求、https请求、获取accessToken的方法

  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             
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值