Skip to content

Commit c2cfcdd

Browse files
0katekate0boris.bao
authored andcommitted
🎨 binarywang#3218【企业微信】增加获客助手事件回调通知
1 parent 936a70b commit c2cfcdd

5 files changed

Lines changed: 220 additions & 7 deletions

File tree

weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -302,10 +302,6 @@ public static class EventType {
302302
public static final String VIEW = "VIEW";
303303
public static final String MASS_SEND_JOB_FINISH = "MASSSENDJOBFINISH";
304304

305-
/**
306-
* 微信客服消息事件推送
307-
*/
308-
public static final String KF_MSG_OR_EVENT = "kf_msg_or_event";
309305
/**
310306
* 扫码推事件的事件推送
311307
*/

weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlMessage.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,27 @@ public class WxCpXmlMessage implements Serializable {
202202
@XStreamConverter(value = XStreamCDataConverter.class)
203203
private String openKfId;
204204

205+
/**
206+
* 新增授权的客服账号列表,多个AuthAddOpenKfId节点表示多个新增账号
207+
*/
208+
@XStreamAlias("AuthAddOpenKfId")
209+
@XStreamConverter(value = XStreamCDataConverter.class)
210+
private String authAddOpenKfId;
211+
212+
/**
213+
* 取消授权的客服账号列表,多个AuthDelOpenKfId节点表示多个取消账号
214+
*/
215+
@XStreamAlias("AuthDelOpenKfId")
216+
@XStreamConverter(value = XStreamCDataConverter.class)
217+
private String authDelOpenKfId;
218+
219+
/**
220+
* 失效的获客链接ID
221+
*/
222+
@XStreamAlias("LinkId")
223+
@XStreamConverter(value = XStreamCDataConverter.class)
224+
private String linkId;
225+
205226
/**
206227
* 通讯录变更事件.
207228
* 请参考常量 me.chanjar.weixin.cp.constant.WxCpConsts.ContactChangeType

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

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,60 @@ public static class EventType {
159159
*/
160160
public static final String LIVING_STATUS_CHANGE = "living_status_change";
161161

162+
/**
163+
* 微信客服消息事件
164+
*/
165+
public static final String KF_MSG_OR_EVENT = "kf_msg_or_event";
166+
167+
/**
168+
* 客服账号授权变更事件
169+
*/
170+
public static final String KF_ACCOUNT_AUTH_CHANGE = "kf_account_auth_change";
171+
172+
/**
173+
* 获客助手事件通知
174+
*/
175+
public static final String CUSTOMER_ACQUISITION = "customer_acquisition";
176+
177+
}
178+
179+
/**
180+
* 获客助手事件通知CHANGE_TYPE
181+
* https://developer.work.weixin.qq.com/document/path/97299
182+
*/
183+
@UtilityClass
184+
public static class CustomerAcquisitionChangeType {
185+
186+
/**
187+
* 获客额度即将耗尽事件
188+
*/
189+
public static final String BALANCE_LOW = "balance_low";
190+
191+
/**
192+
* 使用量已经耗尽事件
193+
*/
194+
public static final String BALANCE_EXHAUSTED = "balance_exhausted";
195+
196+
/**
197+
* 获客链接不可用事件
198+
*/
199+
public static final String LINK_UNAVAILABLE = "link_unavailable";
200+
201+
/**
202+
* 微信客户发起会话事件
203+
*/
204+
public static final String CUSTOMER_START_CHAT = "customer_start_chat";
205+
206+
/**
207+
* 删除获客链接事件
208+
*/
209+
public static final String DELETE_LINK = "delete_link";
210+
211+
/**
212+
* 通过获客链接申请好友事件
213+
*/
214+
public static final String friend_request = "friend_request";
215+
162216
}
163217

164218
/**

weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImplTest.java

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.google.common.collect.Lists;
44
import com.google.inject.Inject;
55
import me.chanjar.weixin.common.error.WxErrorException;
6+
import me.chanjar.weixin.common.util.XmlUtils;
67
import me.chanjar.weixin.cp.api.ApiTestModule;
78
import me.chanjar.weixin.cp.api.WxCpService;
89
import me.chanjar.weixin.cp.bean.WxCpBaseResp;
@@ -13,6 +14,9 @@
1314
import me.chanjar.weixin.cp.bean.external.msg.AttachmentBuilder;
1415
import me.chanjar.weixin.cp.bean.external.msg.Image;
1516
import me.chanjar.weixin.cp.bean.external.msg.Video;
17+
import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
18+
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
19+
import me.chanjar.weixin.cp.util.xml.XStreamTransformer;
1620
import org.apache.commons.lang3.time.DateFormatUtils;
1721
import org.testng.annotations.Guice;
1822
import org.testng.annotations.Test;
@@ -641,4 +645,124 @@ public void testCancelGroupMsgSend() throws WxErrorException {
641645
this.wxCpService.getExternalContactService()
642646
.cancelGroupMsgSend("msgGCAAAXtWyujaWJHDDGi0mACAAAA");
643647
}
648+
649+
/**
650+
* 获客助手事件通知
651+
* https://developer.work.weixin.qq.com/document/path/97299
652+
*
653+
* @throws WxErrorException
654+
*/
655+
@Test
656+
public void testEvent() throws WxErrorException {
657+
658+
/**
659+
* 获客额度即将耗尽事件
660+
*/
661+
String xml1 = "<xml>\n" +
662+
"\t<ToUserName><![CDATA[toUser]]></ToUserName>\n" +
663+
"\t<FromUserName><![CDATA[sys]]></FromUserName> \n" +
664+
"\t<CreateTime>1403610513</CreateTime>\n" +
665+
"\t<MsgType><![CDATA[event]]></MsgType>\n" +
666+
"\t<Event><![CDATA[customer_acquisition]]></Event>\n" +
667+
"\t<ChangeType><![CDATA[balance_low]]></ChangeType>\n" +
668+
"</xml>";
669+
670+
WxCpXmlMessage msg1 = XStreamTransformer.fromXml(WxCpXmlMessage.class, xml1);
671+
msg1.setAllFieldsMap(XmlUtils.xml2Map(xml1));
672+
System.out.println("获客额度即将耗尽事件:" + WxCpGsonBuilder.create().toJson(msg1));
673+
674+
/**
675+
* 使用量已经耗尽事件
676+
*/
677+
String xml2 = "<xml>\n" +
678+
"\t<ToUserName><![CDATA[toUser]]></ToUserName>\n" +
679+
"\t<FromUserName><![CDATA[sys]]></FromUserName> \n" +
680+
"\t<CreateTime>1403610513</CreateTime>\n" +
681+
"\t<MsgType><![CDATA[event]]></MsgType>\n" +
682+
"\t<Event><![CDATA[customer_acquisition]]></Event>\n" +
683+
"\t<ChangeType><![CDATA[balance_exhausted]]></ChangeType>\n" +
684+
"</xml>";
685+
686+
WxCpXmlMessage msg2 = XStreamTransformer.fromXml(WxCpXmlMessage.class, xml2);
687+
msg2.setAllFieldsMap(XmlUtils.xml2Map(xml2));
688+
System.out.println("使用量已经耗尽事件:" + WxCpGsonBuilder.create().toJson(msg2));
689+
690+
/**
691+
* 获客链接不可用事件
692+
*/
693+
String xml3 = "<xml>\n" +
694+
"\t<ToUserName><![CDATA[toUser]]></ToUserName>\n" +
695+
"\t<FromUserName><![CDATA[sys]]></FromUserName> \n" +
696+
"\t<CreateTime>1403610513</CreateTime>\n" +
697+
"\t<MsgType><![CDATA[event]]></MsgType>\n" +
698+
"\t<Event><![CDATA[customer_acquisition]]></Event>\n" +
699+
"\t<ChangeType><![CDATA[link_unavailable]]></ChangeType>\n" +
700+
"\t<LinkId><![CDATA[cawcdea7783d7330b4]]></LinkId>\n" +
701+
"</xml>";
702+
703+
WxCpXmlMessage msg3 = XStreamTransformer.fromXml(WxCpXmlMessage.class, xml3);
704+
msg3.setAllFieldsMap(XmlUtils.xml2Map(xml3));
705+
System.out.println("获客链接不可用事件:" + WxCpGsonBuilder.create().toJson(msg3));
706+
707+
/**
708+
* 微信客户发起会话事件
709+
*/
710+
String xml4 = "<xml>\n" +
711+
"<ToUserName><![CDATA[toUser]]></ToUserName>\n" +
712+
"<FromUserName><![CDATA[sys]]></FromUserName> \n" +
713+
"<CreateTime>1403610513</CreateTime>\n" +
714+
"<MsgType><![CDATA[event]]></MsgType>\n" +
715+
"<Event><![CDATA[customer_acquisition]]></Event>\n" +
716+
"<ChangeType><![CDATA[customer_start_chat]]></ChangeType>\n" +
717+
"<UserID><![CDATA[zhangsan]]></UserID>\n" +
718+
"<ExternalUserID><![CDATA[woAJ2GCAAAXtWyujaWJHDDGi0mAAAA]]></ExternalUserID>\n" +
719+
"</xml>";
720+
721+
WxCpXmlMessage msg4 = XStreamTransformer.fromXml(WxCpXmlMessage.class, xml4);
722+
msg4.setAllFieldsMap(XmlUtils.xml2Map(xml4));
723+
System.out.println("微信客户发起会话事件:" + WxCpGsonBuilder.create().toJson(msg4));
724+
725+
/**
726+
* 删除获客链接事件
727+
*/
728+
String xml5 = "<xml>\n" +
729+
"\t<ToUserName><![CDATA[toUser]]></ToUserName>\n" +
730+
"\t<FromUserName><![CDATA[sys]]></FromUserName> \n" +
731+
"\t<CreateTime>1403610513</CreateTime>\n" +
732+
"\t<MsgType><![CDATA[event]]></MsgType>\n" +
733+
"\t<Event><![CDATA[customer_acquisition]]></Event>\n" +
734+
"\t<ChangeType><![CDATA[delete_link]]></ChangeType>\n" +
735+
"\t<LinkId><![CDATA[cawcdea7783d7330b4]]></LinkId>\n" +
736+
"</xml>";
737+
738+
WxCpXmlMessage msg5 = XStreamTransformer.fromXml(WxCpXmlMessage.class, xml5);
739+
msg5.setAllFieldsMap(XmlUtils.xml2Map(xml5));
740+
System.out.println("删除获客链接事件:" + WxCpGsonBuilder.create().toJson(msg5));
741+
742+
/**
743+
* 通过获客链接申请好友事件
744+
*/
745+
String xml6 = "<xml>\n" +
746+
"\t<ToUserName><![CDATA[toUser]]></ToUserName>\n" +
747+
"\t<FromUserName><![CDATA[sys]]></FromUserName> \n" +
748+
"\t<CreateTime>1689171577</CreateTime>\n" +
749+
"\t<MsgType><![CDATA[event]]></MsgType>\n" +
750+
"\t<Event><![CDATA[customer_acquisition]]></Event>\n" +
751+
"\t<ChangeType><![CDATA[friend_request]]></ChangeType>\n" +
752+
"\t<LinkId><![CDATA[cawcdea7783d7330b4]]></LinkId>\n" +
753+
"\t<State><![CDATA[STATE]]></State>\n" +
754+
"</xml>";
755+
756+
WxCpXmlMessage msg6 = XStreamTransformer.fromXml(WxCpXmlMessage.class, xml6);
757+
msg6.setAllFieldsMap(XmlUtils.xml2Map(xml6));
758+
System.out.println("通过获客链接申请好友事件:" + WxCpGsonBuilder.create().toJson(msg6));
759+
760+
761+
/**
762+
* 获客助手事件通知ChangeType
763+
* @see me.chanjar.weixin.cp.constant.WxCpConsts.CustomerAcquisitionChangeType.CUSTOMER_START_CHAT
764+
*/
765+
766+
}
767+
644768
}

weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpKfServiceImplTest.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,12 +106,28 @@ public void testAccountDel() throws Exception {
106106
/**
107107
* 测试回调事件
108108
* https://developer.work.weixin.qq.com/document/path/94670
109+
* https://developer.work.weixin.qq.com/document/path/97712
109110
*
110111
* @throws Exception
111112
*/
112113
@Test(priority = 6)
113114
public void testEvent() throws Exception {
114115

116+
// 客服账号授权变更事件
117+
String xml1 = "<xml>\n" +
118+
" <ToUserName><![CDATA[toUser]]></ToUserName>\n" +
119+
" <FromUserName><![CDATA[sys]]></FromUserName> \n" +
120+
" <CreateTime>1348831860</CreateTime>\n" +
121+
" <MsgType><![CDATA[event]]></MsgType>\n" +
122+
" <Event><![CDATA[kf_account_auth_change]]></Event>\n" +
123+
" <AuthAddOpenKfId><![CDATA[wkxxxx1]]></AuthAddOpenKfId>\n" +
124+
" <AuthDelOpenKfId><![CDATA[wkxxxx2]]></AuthDelOpenKfId>\n" +
125+
"</xml>";
126+
127+
WxCpXmlMessage xmlMsg1 = XStreamTransformer.fromXml(WxCpXmlMessage.class, xml1);
128+
xmlMsg1.setAllFieldsMap(XmlUtils.xml2Map(xml1));
129+
System.out.println(WxCpGsonBuilder.create().toJson(xmlMsg1));
130+
115131
String xml = "<xml>\n" +
116132
" <ToUserName><![CDATA[ww12345678910]]></ToUserName>\n" +
117133
" <CreateTime>1348831860</CreateTime>\n" +
@@ -124,13 +140,15 @@ public void testEvent() throws Exception {
124140
WxCpXmlMessage xmlMsg = XStreamTransformer.fromXml(WxCpXmlMessage.class, xml);
125141
xmlMsg.setAllFieldsMap(XmlUtils.xml2Map(xml));
126142
System.out.println(WxCpGsonBuilder.create().toJson(xmlMsg));
143+
System.out.println("token:" + xmlMsg.getToken());
144+
System.out.println("openKfId:" + xmlMsg.getOpenKfId());
127145

128146
/**
129147
* 微信客服事件推送
130-
* @see WxConsts.EventType.KF_MSG_OR_EVENT
148+
* @see me.chanjar.weixin.cp.constant.WxCpConsts.EventType.KF_MSG_OR_EVENT
149+
* @see me.chanjar.weixin.cp.constant.WxCpConsts.EventType.KF_ACCOUNT_AUTH_CHANGE
131150
*/
132-
System.out.println("token:" + xmlMsg.getToken());
133-
System.out.println("openKfId:" + xmlMsg.getOpenKfId());
151+
System.out.println("微信客服事件:" + me.chanjar.weixin.cp.constant.WxCpConsts.EventType.KF_MSG_OR_EVENT);
134152
}
135153

136154
}

0 commit comments

Comments
 (0)