Skip to content

Commit a17d8ae

Browse files
0katekate0binarywang
authored andcommitted
🆕 #2721 【企业微信】增加家校通讯录-变更事件类型的回调消息支持
1 parent ba13eef commit a17d8ae

File tree

4 files changed

+201
-4
lines changed

4 files changed

+201
-4
lines changed

weixin-java-cp/src/main/java/com/tencent/wework/Finance.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,17 @@
55
import java.util.List;
66

77
/**
8+
* 企业微信会话内容存档Finance类
89
* 注意:
9-
* 此类必须配置在com.tencent.wework路径底下,否则会报错:
10-
* java.lang.UnsatisfiedLinkError: com.xxx.Finance.NewSdk()
10+
* 此类必须配置在com.tencent.wework路径底下,否则会报错:java.lang.UnsatisfiedLinkError: com.xxx.Finance.NewSdk()
1111
* <p>
1212
* Q:JAVA版本的sdk报错UnsatisfiedLinkError?
1313
* A:请检查是否修改了sdk的包名。
1414
* <p>
1515
* 官方文档:
1616
* https://developer.work.weixin.qq.com/document/path/91552
1717
*
18-
* @author Wang_Wong
18+
* @author <a href="https://github.com/0katekate0">Wang_Wong</a>
1919
* @date 2022-01-17
2020
*/
2121
@Slf4j

weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpConsts.java

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ public static class EventType {
9494
public static final String TASKCARD_CLICK = "taskcard_click";
9595

9696
/**
97-
* 企业成员添加外部联系人事件推送
97+
* 企业成员添加外部联系人事件推送 & 会话存档客户同意进行聊天内容存档事件回调事件
9898
*/
9999
public static final String CHANGE_EXTERNAL_CONTACT = "change_external_contact";
100100

@@ -143,6 +143,56 @@ public static class EventType {
143143
*/
144144
public static final String DELETE_SCHEDULE = "delete_schedule";
145145

146+
/**
147+
* 家校通讯录事件
148+
*/
149+
public static final String CHANGE_SCHOOL_CONTACT = "change_school_contact";
150+
151+
/**
152+
* 产生会话回调事件
153+
*/
154+
public static final String MSGAUDIT_NOTIFY = "msgaudit_notify";
155+
156+
}
157+
158+
/**
159+
* 会话存档事件CHANGE_TYPE
160+
* https://developer.work.weixin.qq.com/document/path/92005
161+
*/
162+
@UtilityClass
163+
public static class MsgAuditChangeType {
164+
165+
public static final String MSG_AUDIT_APPROVED = "msg_audit_approved";
166+
167+
}
168+
169+
/**
170+
* 家校通讯录变更事件CHANGE_TYPE
171+
*/
172+
@UtilityClass
173+
public static class SchoolContactChangeType {
174+
175+
/**
176+
* 部门变更事件
177+
* https://developer.work.weixin.qq.com/document/path/92052
178+
*/
179+
public static final String CREATE_DEPARTMENT = "create_department";
180+
public static final String UPDATE_DEPARTMENT = "update_department";
181+
public static final String DELETE_DEPARTMENT = "delete_department";
182+
183+
/**
184+
* 成员变更事件
185+
* https://developer.work.weixin.qq.com/document/path/92032
186+
*/
187+
public static final String CREATE_STUDENT = "create_student";
188+
public static final String UPDATE_STUDENT = "update_student";
189+
public static final String DELETE_STUDENT = "delete_student";
190+
public static final String CREATE_PARENT = "create_parent";
191+
public static final String UPDATE_PARENT = "update_parent";
192+
public static final String DELETE_PARENT = "delete_parent";
193+
public static final String SUBSCRIBE = "subscribe";
194+
public static final String UNSUBSCRIBE = "unsubscribe";
195+
146196
}
147197

148198
/**

weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMsgAuditTest.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
package me.chanjar.weixin.cp.api;
2+
23
import com.google.common.collect.Lists;
34
import lombok.extern.slf4j.Slf4j;
5+
import me.chanjar.weixin.common.util.XmlUtils;
46
import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl;
7+
import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
58
import me.chanjar.weixin.cp.bean.msgaudit.*;
69
import me.chanjar.weixin.cp.config.WxCpConfigStorage;
10+
import me.chanjar.weixin.cp.constant.WxCpConsts;
711
import me.chanjar.weixin.cp.demo.WxCpDemoInMemoryConfigStorage;
12+
import me.chanjar.weixin.cp.util.xml.XStreamTransformer;
13+
import org.eclipse.jetty.util.ajax.JSON;
814
import org.testng.annotations.Test;
915

1016
import java.io.InputStream;
@@ -38,6 +44,55 @@ public void test() throws Exception {
3844
cpService = new WxCpServiceImpl();
3945
cpService.setWxCpConfigStorage(config);
4046

47+
48+
/**
49+
* 客户同意进行聊天内容存档事件回调
50+
* 配置了客户联系功能的成员添加外部联系人同意进行聊天内容存档时,回调该事件。
51+
*
52+
* https://developer.work.weixin.qq.com/document/path/92005
53+
*/
54+
String msgAuditApprovedXml = "<xml>\n" +
55+
"\t<ToUserName><![CDATA[toUser]]></ToUserName>\n" +
56+
"\t<FromUserName><![CDATA[sys]]></FromUserName> \n" +
57+
"\t<CreateTime>1403610513</CreateTime>\n" +
58+
"\t<MsgType><![CDATA[event]]></MsgType>\n" +
59+
"\t<Event><![CDATA[change_external_contact]]></Event>\n" +
60+
"\t<ChangeType><![CDATA[msg_audit_approved]]></ChangeType>\n" +
61+
"\t<UserID><![CDATA[zhangsan]]></UserID>\n" +
62+
"\t<ExternalUserID><![CDATA[woAJ2GCAAABiuyujaWJHDDGi0mACHAAA]]></ExternalUserID>\n" +
63+
"\t<WelcomeCode><![CDATA[WELCOMECODE]]></WelcomeCode>\n" +
64+
"</xml>";
65+
66+
final WxCpXmlMessage msgAuditApprovedXmlMsg = XStreamTransformer.fromXml(WxCpXmlMessage.class, msgAuditApprovedXml);
67+
msgAuditApprovedXmlMsg.setAllFieldsMap(XmlUtils.xml2Map(msgAuditApprovedXml));
68+
log.info("msgAuditApprovedXmlMsg:{}", JSON.toString(msgAuditApprovedXmlMsg));
69+
70+
/**
71+
* 产生会话回调事件
72+
* 为了提升企业会话存档的使用性能,降低无效的轮询次数。
73+
* 当企业收到或发送新消息时,企业微信可以以事件的形式推送到企业指定的url。回调间隔为15秒,在15秒内若有消息则触发回调,若无消息则不会触发回调。
74+
*
75+
* https://developer.work.weixin.qq.com/document/path/95039
76+
*/
77+
String msgAuditNotifyXml = "<xml>\n" +
78+
" <ToUserName><![CDATA[CorpID]]></ToUserName>\n" +
79+
" <FromUserName><![CDATA[sys]]></FromUserName> \n" +
80+
" <CreateTime>1629101687</CreateTime>\n" +
81+
" <MsgType><![CDATA[event]]></MsgType>\n" +
82+
" <AgentID>2000004</AgentID>\n" +
83+
" <Event><![CDATA[msgaudit_notify]]></Event>\n" +
84+
"</xml>";
85+
86+
final WxCpXmlMessage msgAuditNotifyXmlMsg = XStreamTransformer.fromXml(WxCpXmlMessage.class, msgAuditNotifyXml);
87+
msgAuditNotifyXmlMsg.setAllFieldsMap(XmlUtils.xml2Map(msgAuditNotifyXml));
88+
log.info("msgAuditNotifyXmlMsg:{}", JSON.toString(msgAuditNotifyXmlMsg));
89+
90+
/**
91+
* 增加变更事件类型:产生会话回调事件
92+
*/
93+
String msgauditNotify = WxCpConsts.EventType.MSGAUDIT_NOTIFY;
94+
95+
4196
/**
4297
* 仔细配置:
4398
* <xml>

weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpSchoolUserTest.java

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,20 @@
44
import lombok.extern.slf4j.Slf4j;
55
import lombok.var;
66
import me.chanjar.weixin.common.error.WxErrorException;
7+
import me.chanjar.weixin.common.util.XmlUtils;
78
import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl;
89
import me.chanjar.weixin.cp.bean.WxCpBaseResp;
10+
import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
911
import me.chanjar.weixin.cp.bean.school.user.*;
1012
import me.chanjar.weixin.cp.config.WxCpConfigStorage;
1113
import me.chanjar.weixin.cp.demo.WxCpDemoInMemoryConfigStorage;
14+
import me.chanjar.weixin.cp.util.xml.XStreamTransformer;
15+
import org.eclipse.jetty.util.ajax.JSON;
1216
import org.testng.annotations.Test;
1317

1418
import java.io.InputStream;
1519
import java.util.List;
20+
import java.util.Map;
1621

1722
/**
1823
* 企业微信家校沟通相关接口.
@@ -47,6 +52,93 @@ public void test() throws WxErrorException {
4752
final String exUserId = "wmOQpTDwAAJFHrryZ8I8ALLEZuLHIUKA";
4853

4954

55+
// String changeContact = WxCpConsts.EventType.CHANGE_CONTACT;
56+
/**
57+
* 增加变更事件类型:
58+
*/
59+
// WxCpConsts.EventType.CHANGE_SCHOOL_CONTACT;
60+
// WxCpConsts.SchoolContactChangeType.DELETE_STUDENT;
61+
// WxCpConsts.SchoolContactChangeType.CREATE_DEPARTMENT;
62+
63+
/**
64+
* 测试家校通讯录变更回调
65+
* https://developer.work.weixin.qq.com/document/path/92052
66+
*
67+
* 新增学生事件
68+
* 当学校在家校通讯录中新增学生时,回调此事件。
69+
*/
70+
String createStudentXml = "<xml>\n" +
71+
"\t<ToUserName><![CDATA[toUser]]></ToUserName>\n" +
72+
"\t<FromUserName><![CDATA[sys]]></FromUserName> \n" +
73+
"\t<CreateTime>1403610513</CreateTime>\n" +
74+
"\t<MsgType><![CDATA[event]]></MsgType>\n" +
75+
"\t<Event><![CDATA[change_school_contact]]></Event>\n" +
76+
"\t<ChangeType><![CDATA[create_student]]></ChangeType>\n" +
77+
"\t<Id><![CDATA[xiaoming]]></Id>\n" +
78+
"</xml>";
79+
80+
/**
81+
* 家长取消关注事件
82+
* 当家长取消关注家校通知时,回调此事件。
83+
*/
84+
String unSubscribeXml = "<xml>\n" +
85+
"\t<ToUserName><![CDATA[toUser]]></ToUserName>\n" +
86+
"\t<FromUserName><![CDATA[sys]]></FromUserName> \n" +
87+
"\t<CreateTime>1403610513</CreateTime>\n" +
88+
"\t<MsgType><![CDATA[event]]></MsgType>\n" +
89+
"\t<Event><![CDATA[change_school_contact]]></Event>\n" +
90+
"\t<ChangeType><![CDATA[unsubscribe]]></ChangeType>\n" +
91+
"\t<Id><![CDATA[xiaoming]]></Id>\n" +
92+
"</xml>";
93+
94+
/**
95+
* 创建部门事件
96+
* 当学校在家校通讯录中创建部门时,回调此事件。
97+
*/
98+
String createDepartmentXml = "<xml>\n" +
99+
"\t<ToUserName><![CDATA[toUser]]></ToUserName>\n" +
100+
"\t<FromUserName><![CDATA[sys]]></FromUserName> \n" +
101+
"\t<CreateTime>1403610513</CreateTime>\n" +
102+
"\t<MsgType><![CDATA[event]]></MsgType>\n" +
103+
"\t<Event><![CDATA[change_school_contact]]></Event>\n" +
104+
"\t<ChangeType><![CDATA[create_deparmtment]]></ChangeType>\n" +
105+
"\t<Id><![CDATA[1]]></Id>\n" +
106+
"</xml>";
107+
108+
/**
109+
* 删除部门事件
110+
* 当学校删除家校通讯录部门时,回调此事件。
111+
*/
112+
String deleteDepartmentXml = "<xml>\n" +
113+
"\t<ToUserName><![CDATA[toUser]]></ToUserName>\n" +
114+
"\t<FromUserName><![CDATA[sys]]></FromUserName> \n" +
115+
"\t<CreateTime>1403610513</CreateTime>\n" +
116+
"\t<MsgType><![CDATA[event]]></MsgType>\n" +
117+
"\t<Event><![CDATA[change_school_contact]]></Event>\n" +
118+
"\t<ChangeType><![CDATA[delete_deparmtment]]></ChangeType>\n" +
119+
"\t<Id><![CDATA[1]]></Id>\n" +
120+
"</xml>";
121+
122+
// WxCpXmlMessage.fromXml(createStudentXml);
123+
final WxCpXmlMessage createStudentMsg = XStreamTransformer.fromXml(WxCpXmlMessage.class, createStudentXml);
124+
Map<String, Object> map1 = XmlUtils.xml2Map(createStudentXml);
125+
createStudentMsg.setAllFieldsMap(map1);
126+
log.info("createStudentMsg:{}", JSON.toString(createStudentMsg));
127+
128+
final WxCpXmlMessage unSubscribeMsg = XStreamTransformer.fromXml(WxCpXmlMessage.class, unSubscribeXml);
129+
Map<String, Object> map2 = XmlUtils.xml2Map(unSubscribeXml);
130+
unSubscribeMsg.setAllFieldsMap(map2);
131+
log.info("unSubscribeMsg:{}", JSON.toString(unSubscribeMsg));
132+
133+
final WxCpXmlMessage createDepartmentMsg = XStreamTransformer.fromXml(WxCpXmlMessage.class, createDepartmentXml);
134+
createDepartmentMsg.setAllFieldsMap(XmlUtils.xml2Map(createDepartmentXml));
135+
log.info("createDepartmentMsg:{}", JSON.toString(createDepartmentMsg));
136+
137+
final WxCpXmlMessage deleteDepartmentMsg = XStreamTransformer.fromXml(WxCpXmlMessage.class, deleteDepartmentXml);
138+
deleteDepartmentMsg.setAllFieldsMap(XmlUtils.xml2Map(deleteDepartmentXml));
139+
log.info("deleteDepartmentMsg:{}", JSON.toString(deleteDepartmentMsg));
140+
141+
50142
/**
51143
* 获取可使用的家长范围
52144
* https://developer.work.weixin.qq.com/document/path/94895

0 commit comments

Comments
 (0)