From 3662a25cceabc9f7c7c6bf6be42d63f3f5eab4a5 Mon Sep 17 00:00:00 2001 From: wangkai Date: Thu, 7 Dec 2023 16:06:44 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E3=80=90=E4=BC=81=E4=B8=9A=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E3=80=91=20#3178=EF=BC=8C=E4=BF=AE=E5=A4=8D=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=E5=AD=98=E6=A1=A3=E5=8F=8D=E5=BA=8F=E5=88=97=E5=8C=96?= =?UTF-8?q?uint64=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cp/api/impl/WxCpMsgAuditServiceImpl.java | 14 +++--- .../cp/bean/msgaudit/WxCpChatDatas.java | 2 +- .../cp/bean/msgaudit/WxCpChatModel.java | 11 +++- .../weixin/cp/bean/msgaudit/WxCpFileItem.java | 6 ++- .../weixin/cp/util/crypto/WxCpCryptUtil.java | 6 ++- .../weixin/cp/api/WxCpMsgAuditTest.java | 50 +++++++++++++++++-- 6 files changed, 71 insertions(+), 18 deletions(-) diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMsgAuditServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMsgAuditServiceImpl.java index fc4f7cef64..5ede317fbb 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMsgAuditServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMsgAuditServiceImpl.java @@ -196,12 +196,11 @@ public void getMediaFile(@NonNull long sdk, @NonNull String sdkfileid, String pr @Override public void getMediaFile(@NonNull long sdk, @NonNull String sdkfileid, String proxy, String passwd, @NonNull long timeout, @NonNull Consumer action) throws WxErrorException { -/** - * 1、媒体文件每次拉取的最大size为512k,因此超过512k的文件需要分片拉取。 - * 2、若该文件未拉取完整,sdk的IsMediaDataFinish接口会返回0,同时通过GetOutIndexBuf接口返回下次拉取需要传入GetMediaData的indexbuf。 - * 3、indexbuf一般格式如右侧所示,”Range:bytes=524288-1048575“:表示这次拉取的是从524288到1048575的分片。单个文件首次拉取填写的indexbuf - * 为空字符串,拉取后续分片时直接填入上次返回的indexbuf即可。 - */ + /** + * 1、媒体文件每次拉取的最大size为512k,因此超过512k的文件需要分片拉取。 + * 2、若该文件未拉取完整,sdk的IsMediaDataFinish接口会返回0,同时通过GetOutIndexBuf接口返回下次拉取需要传入GetMediaData的indexbuf。 + * 3、indexbuf一般格式如右侧所示,”Range:bytes=524288-1048575“:表示这次拉取的是从524288到1048575的分片。单个文件首次拉取填写的indexbuf为空字符串,拉取后续分片时直接填入上次返回的indexbuf即可。 + */ String indexbuf = ""; int ret, data_len = 0; log.debug("正在分片拉取媒体文件 sdkFileId为{}", sdkfileid); @@ -215,8 +214,7 @@ public void getMediaFile(@NonNull long sdk, @NonNull String sdkfileid, String pr } data_len += Finance.GetDataLen(mediaData); - log.info("正在分片拉取媒体文件 len:{}, data_len:{}, is_finis:{} \n", Finance.GetIndexLen(mediaData), data_len, - Finance.IsMediaDataFinish(mediaData)); + log.debug("正在分片拉取媒体文件 len:{}, data_len:{}, is_finish:{} \n", Finance.GetIndexLen(mediaData), data_len, Finance.IsMediaDataFinish(mediaData)); try { // 大于512k的文件会分片拉取,此处需要使用追加写,避免后面的分片覆盖之前的数据。 diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/msgaudit/WxCpChatDatas.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/msgaudit/WxCpChatDatas.java index 89f0219395..732da06a53 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/msgaudit/WxCpChatDatas.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/msgaudit/WxCpChatDatas.java @@ -25,7 +25,7 @@ public class WxCpChatDatas implements Serializable { private String errMsg; @SerializedName("sdk") - private long sdk; + private Long sdk; @SerializedName("chatdata") private List chatData; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/msgaudit/WxCpChatModel.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/msgaudit/WxCpChatModel.java index 05098e5e02..d843cad6cf 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/msgaudit/WxCpChatModel.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/msgaudit/WxCpChatModel.java @@ -7,6 +7,7 @@ import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import java.io.Serializable; +import java.math.BigInteger; import java.util.List; /** @@ -844,8 +845,11 @@ public String toJson() { public static class Details implements Serializable { private static final long serialVersionUID = -5028321625140879571L; + /** + * 表项id Uint64类型 + */ @SerializedName("id") - private Long id; + private BigInteger id; @SerializedName("ques") private String ques; @@ -943,8 +947,11 @@ public static class Meeting implements Serializable { @SerializedName("meetingtype") private Integer meetingType; + /** + * 会议id Uint64类型 + */ @SerializedName("meetingid") - private Long meetingId; + private BigInteger meetingId; @SerializedName("status") private Integer status; diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/msgaudit/WxCpFileItem.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/msgaudit/WxCpFileItem.java index 384f29f756..35bbe36a14 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/msgaudit/WxCpFileItem.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/msgaudit/WxCpFileItem.java @@ -5,6 +5,7 @@ import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; import java.io.Serializable; +import java.math.BigInteger; /** * 会话存档 文档信息对象 @@ -25,8 +26,11 @@ public class WxCpFileItem implements Serializable { @SerializedName("sdkfileid") private String sdkFileId; + /** + * 共享文件的大小 Uint64类型 + */ @SerializedName("filesize") - private Long fileSize; + private BigInteger fileSize; /** * From json wx cp file item. diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/crypto/WxCpCryptUtil.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/crypto/WxCpCryptUtil.java index 835aa79797..08ea292b4f 100755 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/crypto/WxCpCryptUtil.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/crypto/WxCpCryptUtil.java @@ -14,9 +14,11 @@ import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.RSAPrivateCrtKeySpec; import java.util.Base64; +import java.util.Objects; /** * The type Wx cp crypt util. + * * @author qian */ public class WxCpCryptUtil extends WxCryptUtil { @@ -50,11 +52,11 @@ public WxCpCryptUtil(WxCpConfigStorage wxCpConfigStorage) { * @throws Exception the exception */ public static String decryptPriKey(String encryptRandomKey, String msgAuditPriKey, Integer pkcs1) throws Exception { - if (pkcs1 == null) { + if (Objects.isNull(pkcs1)) { throw new WxErrorException("请配置会话存档解密方式"); } - if (pkcs1 == 1) { + if (Objects.equals(pkcs1, 1)) { return decryptPriKeyByPKCS1(encryptRandomKey, msgAuditPriKey); } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMsgAuditTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMsgAuditTest.java index 740725cb82..ec7362ed5d 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMsgAuditTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMsgAuditTest.java @@ -18,10 +18,8 @@ import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; +import java.math.BigInteger; +import java.util.*; /** * 企业微信会话内容存档测试类. @@ -755,4 +753,48 @@ public void testGetMediaFile() throws Exception { } Finance.DestroySdk(chatDatas.getSdk()); } + + // 测试Uint64类型 + public static void main(String[] args){ + /* + * 会议邀请信息 + */ + String meeting = "{\"msgid\":\"5935786683775673543_1603877328\",\"action\":\"send\",\"from\":\"ken\"," + + "\"tolist\":[\"icef\",\"test\"],\"roomid\":\"wr2vOpDgAAN4zVWKbS\",\"msgtime\":1603877328914," + + "\"msgtype\":\"meeting\",\"meeting\":{\"topic\":\"夕会\",\"starttime\":1603877400,\"endtime\":1603881000," + + "\"address\":\"\",\"remarks\":\"\",\"meetingtype\":102,\"meetingid\":11101571002822706744,\"status\":1}}"; + WxCpChatModel modelMeeting = WxCpChatModel.fromJson(meeting); + modelMeeting.getMeeting().getMeetingId(); + System.out.println(modelMeeting.toJson()); + + /* + * 音频共享文档消息 + */ + String voipDocShare = "{\"msgid\":\"16527954622422422847_1594199256\",\"action\":\"send\"," + + "\"from\":\"18002520162\",\"tolist\":[\"wo137MCgAAYW6pIiKKrDe5SlzEhSgwbA\"],\"msgtime\":1594199235014," + + "\"msgtype\":\"voip_doc_share\",\"voipid\":\"gr2751c98b19300571f8afb3b74514bd32\"," + + "\"voip_doc_share\":{\"filename\":\"欢迎使用微盘.pdf.pdf\",\"md5sum\":\"ff893900f24e55e216e617a40e5c4648\"," + + "\"filesize\":11101571002822706744," + + "\"sdkfileid" + + "\":\"CpsBKjAqZUlLdWJMd2gvQ1JxMzd0ZjlpdW5mZzJOOE9JZm5kbndvRmRqdnBETjY0QlcvdGtHSFFTYm95dHM2VlllQXhkUUN5KzRmSy9KT3pudnA2aHhYZFlPemc2aVZ6YktzaVh3YkFPZHlqNnl2L2MvcGlqcVRjRTlhZEZsOGlGdHJpQ2RWSVNVUngrVFpuUmo3TGlPQ1BJemlRPT0SOE5EZGZNVFk0T0RnMU16YzVNVGt5T1RJMk9GODFNelUyTlRBd01qQmZNVFU1TkRFNU9USTFOZz09GiA3YTcwNmQ2Zjc5NjY3MDZjNjY2Zjc4NzI3NTZmN2E2YQ==\"}}"; + WxCpChatModel modelVoipDocShare = WxCpChatModel.fromJson(voipDocShare); + System.out.println(modelVoipDocShare.toJson()); + + /* + * 填表消息 + */ + String collect = "{\"msgid\":\"2500536226619379797_1576034482\",\"action\":\"send\",\"from\":\"nick\"," + + "\"tolist\":[\"XuJinSheng\",\"15108264797\"],\"roomid\":\"wrjc7bDwYAOAhf9quEwRRxyyoMm0QAAA\"," + + "\"msgtime\":1576034482344,\"msgtype\":\"collect\",\"collect\":{\"room_name\":\"这是一个群\",\"creator\":\"nick\"," + + "\"create_time\":\"2019-12-11 11:21:22\",\"title\":\"这是填表title\",\"details\":[{\"id\":11101571002822706744,\"ques\":\"表项1,文本\"," + + "\"type\":\"Text\"},{\"id\":2,\"ques\":\"表项2,数字\",\"type\":\"Number\"},{\"id\":3,\"ques\":\"表项3,日期\"," + + "\"type\":\"Date\"},{\"id\":4,\"ques\":\"表项4,时间\",\"type\":\"Time\"}]}}"; + WxCpChatModel modelCollect = WxCpChatModel.fromJson(collect); + System.out.println(modelCollect.toJson()); + + BigInteger id = modelCollect.getCollect().getDetails().get(0).getId(); + System.out.println(id); + + } + } From e1dd962d306d6681dd1c5f1ddc93c45be7d73da9 Mon Sep 17 00:00:00 2001 From: wangkai Date: Fri, 8 Dec 2023 11:20:44 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E3=80=90=E5=BE=AE=E4=BF=A1=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E3=80=91=20#3160=20=E4=BF=AE=E6=94=B9servlet=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E4=B8=8D=E5=8F=AF=E4=BC=A0=E9=80=92=EF=BC=8C=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E5=92=8C=E6=B5=8B=E8=AF=95=E6=97=B6=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- weixin-java-pay/pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml index 648f2836ad..c3b44806f4 100644 --- a/weixin-java-pay/pom.xml +++ b/weixin-java-pay/pom.xml @@ -77,6 +77,8 @@ javax.servlet javax.servlet-api 4.0.1 + true + provided From 1f0db66847f21a2372b20410e224d5822ffae91b Mon Sep 17 00:00:00 2001 From: wangkai Date: Thu, 11 Jan 2024 14:51:36 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E3=80=90=E4=BC=81=E4=B8=9A=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E3=80=91=E5=A2=9E=E5=8A=A0=E5=BE=AE=E4=BF=A1=E5=AE=A2?= =?UTF-8?q?=E6=9C=8D=E5=9B=9E=E8=B0=83=E4=BA=8B=E4=BB=B6=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/common/api/WxConsts.java | 5 +++ .../cp/bean/message/WxCpXmlMessage.java | 16 ++++++++ .../cp/api/impl/WxCpKfServiceImplTest.java | 38 ++++++++++++++++++- 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java index 3d2f62affe..a82ed86ef2 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java @@ -301,6 +301,11 @@ public static class EventType { public static final String CLICK = "CLICK"; public static final String VIEW = "VIEW"; public static final String MASS_SEND_JOB_FINISH = "MASSSENDJOBFINISH"; + + /** + * 微信客服消息事件推送 + */ + public static final String KF_MSG_OR_EVENT = "kf_msg_or_event"; /** * 扫码推事件的事件推送 */ diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlMessage.java index 51e395ab13..6f18a8572b 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlMessage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlMessage.java @@ -187,6 +187,21 @@ public class WxCpXmlMessage implements Serializable { @XStreamConverter(value = XStreamCDataConverter.class) private String taskId; + /** + * 微信客服 + * 调用拉取消息接口时,需要传此token,用于校验请求的合法性 + */ + @XStreamAlias("Token") + @XStreamConverter(value = XStreamCDataConverter.class) + private String token; + + /** + * 有新消息的客服账号。可通过sync_msg接口指定open_kfid获取此客服账号的消息 + */ + @XStreamAlias("OpenKfId") + @XStreamConverter(value = XStreamCDataConverter.class) + private String openKfId; + /** * 通讯录变更事件. * 请参考常量 me.chanjar.weixin.cp.constant.WxCpConsts.ContactChangeType @@ -222,6 +237,7 @@ public class WxCpXmlMessage implements Serializable { @XStreamAlias("WelcomeCode") @XStreamConverter(value = XStreamCDataConverter.class) private String welcomeCode; + /** * 新的UserID,变更时推送(userid由系统生成时可更改一次). */ diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpKfServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpKfServiceImplTest.java index c918c297bb..74b6266f04 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpKfServiceImplTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpKfServiceImplTest.java @@ -3,10 +3,14 @@ import com.google.inject.Inject; import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; +import me.chanjar.weixin.common.util.XmlUtils; import me.chanjar.weixin.cp.api.ApiTestModule; import me.chanjar.weixin.cp.api.WxCpService; import me.chanjar.weixin.cp.bean.WxCpBaseResp; import me.chanjar.weixin.cp.bean.kf.*; +import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage; +import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; +import me.chanjar.weixin.cp.util.xml.XStreamTransformer; import org.testng.annotations.Guice; import org.testng.annotations.Test; @@ -14,7 +18,9 @@ /** * WxCpKfServiceImpl-测试类 - * 需要用到专门的 secret https://kf.weixin.qq.com/api/doc/path/93304#secret + * 需要用到专门的secret + * 官方文档1 + * 官方文档2 * * @author Fu created on 2022/1/19 20:12 */ @@ -97,4 +103,34 @@ public void testAccountDel() throws Exception { System.out.println(resp); } + /** + * 测试回调事件 + * https://developer.work.weixin.qq.com/document/path/94670 + * + * @throws Exception + */ + @Test(priority = 6) + public void testEvent() throws Exception { + + String xml = "\n" + + " \n" + + " 1348831860\n" + + " \n" + + " \n" + + " \n" + + " \n" + + ""; + + WxCpXmlMessage xmlMsg = XStreamTransformer.fromXml(WxCpXmlMessage.class, xml); + xmlMsg.setAllFieldsMap(XmlUtils.xml2Map(xml)); + System.out.println(WxCpGsonBuilder.create().toJson(xmlMsg)); + + /** + * 微信客服事件推送 + * @see WxConsts.EventType.KF_MSG_OR_EVENT + */ + System.out.println("token:" + xmlMsg.getToken()); + System.out.println("openKfId:" + xmlMsg.getOpenKfId()); + } + }