diff --git a/clients/java/wechat-ferry-mvn/CHANGELOG.md b/clients/java/wechat-ferry-mvn/CHANGELOG.md index 451218f..7df6334 100644 --- a/clients/java/wechat-ferry-mvn/CHANGELOG.md +++ b/clients/java/wechat-ferry-mvn/CHANGELOG.md @@ -20,11 +20,13 @@ | 发送表情消息 | /send/emojiMsg | x | 该版本不支持 | | 发送文件消息 | /send/fileMsg | x | 该版本不支持 | | 拍一拍群友 | /patOnePat | √ | 已测试 | +| 撤回消息 | /revokeMsg | ? | 待测试 | | 通过好友申请 | /passFriendApply | ? | 待测试 | | 添加群成员为微信好友 | /addFriend/groupMember | ? | 待测试 | | 查询群成员 | /groupMember/list | √ | 已测试 | | 邀请群成员 | /groupMember/invite | ? | 待测试 | | 删除群成员 | /groupMember/delete | ? | 待测试 | +| 查询朋友圈 | /friendCircle | ? | 待测试 | ### 已知BUG diff --git a/clients/java/wechat-ferry-mvn/src/main/java/com/wechat/ferry/controller/WeChatDllController.java b/clients/java/wechat-ferry-mvn/src/main/java/com/wechat/ferry/controller/WeChatDllController.java index 91b870b..f98d86b 100644 --- a/clients/java/wechat-ferry-mvn/src/main/java/com/wechat/ferry/controller/WeChatDllController.java +++ b/clients/java/wechat-ferry-mvn/src/main/java/com/wechat/ferry/controller/WeChatDllController.java @@ -18,6 +18,7 @@ import com.wechat.ferry.entity.vo.request.WxPpWcfGroupMemberReq; import com.wechat.ferry.entity.vo.request.WxPpWcfInviteGroupMemberReq; import com.wechat.ferry.entity.vo.request.WxPpWcfPassFriendApplyReq; import com.wechat.ferry.entity.vo.request.WxPpWcfPatOnePatMsgReq; +import com.wechat.ferry.entity.vo.request.WxPpWcfRevokeMsgReq; import com.wechat.ferry.entity.vo.request.WxPpWcfSendEmojiMsgReq; import com.wechat.ferry.entity.vo.request.WxPpWcfSendFileMsgReq; import com.wechat.ferry.entity.vo.request.WxPpWcfSendImageMsgReq; @@ -181,12 +182,12 @@ public class WeChatDllController { // return TResponse.ok(ResponseCodeEnum.SUCCESS, list); // } - // @ApiOperation(value = "撤回消息", notes = "queryMsgTypeList") - // @PostMapping(value = "/list/msgType") - // public TResponse queryMsgTypeList() { - // return TResponse.ok(ResponseCodeEnum.SUCCESS, list); - // } - // + @ApiOperation(value = "撤回消息", notes = "revokeMsg") + @PostMapping(value = "/revokeMsg") + public TResponse revokeMsg(@Validated @RequestBody WxPpWcfRevokeMsgReq request) { + return TResponse.ok(ResponseCodeEnum.SUCCESS); + } + // @ApiOperation(value = "转发消息", notes = "queryMsgTypeList") // @PostMapping(value = "/list/msgType") // public TResponse queryMsgTypeList() { @@ -215,7 +216,7 @@ public class WeChatDllController { @ApiOperation(value = "添加群成员为微信好友", notes = "addFriendGroupMember") @PostMapping(value = "/addFriend/groupMember") - public TResponse addFriendGroupMember(WxPpWcfAddFriendGroupMemberReq request) { + public TResponse addFriendGroupMember(@Validated @RequestBody WxPpWcfAddFriendGroupMemberReq request) { weChatDllService.addFriendGroupMember(request); return TResponse.ok(ResponseCodeEnum.SUCCESS); } @@ -229,24 +230,25 @@ public class WeChatDllController { @ApiOperation(value = "邀请群成员", notes = "inviteGroupMember") @PostMapping(value = "/groupMember/invite") - public TResponse inviteGroupMember(WxPpWcfInviteGroupMemberReq request) { + public TResponse inviteGroupMember(@Validated @RequestBody WxPpWcfInviteGroupMemberReq request) { weChatDllService.inviteGroupMember(request); return TResponse.ok(ResponseCodeEnum.SUCCESS); } @ApiOperation(value = "删除群成员", notes = "deleteGroupMember") @PostMapping(value = "/groupMember/delete") - public TResponse deleteGroupMember(WxPpWcfDeleteGroupMemberReq request) { + public TResponse deleteGroupMember(@Validated @RequestBody WxPpWcfDeleteGroupMemberReq request) { weChatDllService.deleteGroupMember(request); return TResponse.ok(ResponseCodeEnum.SUCCESS); } - // @ApiOperation(value = "获取朋友圈消息", notes = "queryMsgTypeList") - // @PostMapping(value = "/list/msgType") - // public TResponse queryMsgTypeList() { - // return TResponse.ok(ResponseCodeEnum.SUCCESS, list); - // } - // + @ApiOperation(value = "查询朋友圈", notes = "queryFriendCircle") + @PostMapping(value = "/friendCircle") + public TResponse queryFriendCircle() { + weChatDllService.queryFriendCircle(); + return TResponse.ok(ResponseCodeEnum.SUCCESS); + } + // @ApiOperation(value = "下载图片、视频、文件", notes = "queryMsgTypeList") // @PostMapping(value = "/list/msgType") // public TResponse queryMsgTypeList() { diff --git a/clients/java/wechat-ferry-mvn/src/main/java/com/wechat/ferry/entity/vo/request/WxPpWcfPassFriendApplyReq.java b/clients/java/wechat-ferry-mvn/src/main/java/com/wechat/ferry/entity/vo/request/WxPpWcfPassFriendApplyReq.java index 17fd1f8..1c801c5 100644 --- a/clients/java/wechat-ferry-mvn/src/main/java/com/wechat/ferry/entity/vo/request/WxPpWcfPassFriendApplyReq.java +++ b/clients/java/wechat-ferry-mvn/src/main/java/com/wechat/ferry/entity/vo/request/WxPpWcfPassFriendApplyReq.java @@ -19,6 +19,7 @@ public class WxPpWcfPassFriendApplyReq { /** * 申请人 * v3 xml.attrib["encryptusername"] + * 加密用户名 (好友申请消息里 v3 开头的字符串) */ @NotBlank(message = "申请人不能为空") @ApiModelProperty(value = "申请人") @@ -27,6 +28,7 @@ public class WxPpWcfPassFriendApplyReq { /** * 审核人 * v4 xml.attrib["ticket"] + * Ticket (好友申请消息里 v4 开头的字符串) * 一般指自己,别人申请添加,自己审核是否通过 */ @NotBlank(message = "审核人不能为空") @@ -35,6 +37,7 @@ public class WxPpWcfPassFriendApplyReq { /** * 场景 + * 申请方式 (好友申请消息里的 scene); 为了兼容旧接口,默认为扫码添加 (30) */ @ApiModelProperty(value = "场景") private String scene; diff --git a/clients/java/wechat-ferry-mvn/src/main/java/com/wechat/ferry/entity/vo/request/WxPpWcfRevokeMsgReq.java b/clients/java/wechat-ferry-mvn/src/main/java/com/wechat/ferry/entity/vo/request/WxPpWcfRevokeMsgReq.java new file mode 100644 index 0000000..81abd17 --- /dev/null +++ b/clients/java/wechat-ferry-mvn/src/main/java/com/wechat/ferry/entity/vo/request/WxPpWcfRevokeMsgReq.java @@ -0,0 +1,25 @@ +package com.wechat.ferry.entity.vo.request; + +import javax.validation.constraints.NotBlank; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 请求入参-撤回消息 + * + * @author chandler + * @date 2024-12-25 12:00 + */ +@Data +@ApiModel(value = "wxPpWcfRevokeMsgReq", description = "个微WCF撤回消息请求入参") +public class WxPpWcfRevokeMsgReq { + + /** + * 消息编号 + */ + @ApiModelProperty(value = "场景") + private String msgId; + +} diff --git a/clients/java/wechat-ferry-mvn/src/main/java/com/wechat/ferry/service/WeChatDllService.java b/clients/java/wechat-ferry-mvn/src/main/java/com/wechat/ferry/service/WeChatDllService.java index 6f47f17..94df650 100644 --- a/clients/java/wechat-ferry-mvn/src/main/java/com/wechat/ferry/service/WeChatDllService.java +++ b/clients/java/wechat-ferry-mvn/src/main/java/com/wechat/ferry/service/WeChatDllService.java @@ -10,6 +10,7 @@ import com.wechat.ferry.entity.vo.request.WxPpWcfGroupMemberReq; import com.wechat.ferry.entity.vo.request.WxPpWcfInviteGroupMemberReq; import com.wechat.ferry.entity.vo.request.WxPpWcfPassFriendApplyReq; import com.wechat.ferry.entity.vo.request.WxPpWcfPatOnePatMsgReq; +import com.wechat.ferry.entity.vo.request.WxPpWcfRevokeMsgReq; import com.wechat.ferry.entity.vo.request.WxPpWcfSendEmojiMsgReq; import com.wechat.ferry.entity.vo.request.WxPpWcfSendFileMsgReq; import com.wechat.ferry.entity.vo.request.WxPpWcfSendImageMsgReq; @@ -200,6 +201,16 @@ public interface WeChatDllService { */ WxPpWcfSendPatOnePatMsgResp patOnePat(WxPpWcfPatOnePatMsgReq request); + /** + * 撤回消息 + * + * @return 结果状态 + * + * @author chandler + * @date 2024-12-25 11:59 + */ + String revokeMsg(WxPpWcfRevokeMsgReq request); + /** * 通过好友申请 * @@ -255,4 +266,14 @@ public interface WeChatDllService { */ String deleteGroupMember(WxPpWcfDeleteGroupMemberReq request); + /** + * 查询朋友圈 + * + * @return 结果状态 + * + * @author chandler + * @date 2024-12-25 11:11 + */ + String queryFriendCircle(); + } diff --git a/clients/java/wechat-ferry-mvn/src/main/java/com/wechat/ferry/service/impl/WeChatDllServiceImpl.java b/clients/java/wechat-ferry-mvn/src/main/java/com/wechat/ferry/service/impl/WeChatDllServiceImpl.java index 67418ef..1fd9237 100644 --- a/clients/java/wechat-ferry-mvn/src/main/java/com/wechat/ferry/service/impl/WeChatDllServiceImpl.java +++ b/clients/java/wechat-ferry-mvn/src/main/java/com/wechat/ferry/service/impl/WeChatDllServiceImpl.java @@ -29,6 +29,7 @@ import com.wechat.ferry.entity.vo.request.WxPpWcfGroupMemberReq; import com.wechat.ferry.entity.vo.request.WxPpWcfInviteGroupMemberReq; import com.wechat.ferry.entity.vo.request.WxPpWcfPassFriendApplyReq; import com.wechat.ferry.entity.vo.request.WxPpWcfPatOnePatMsgReq; +import com.wechat.ferry.entity.vo.request.WxPpWcfRevokeMsgReq; import com.wechat.ferry.entity.vo.request.WxPpWcfSendEmojiMsgReq; import com.wechat.ferry.entity.vo.request.WxPpWcfSendFileMsgReq; import com.wechat.ferry.entity.vo.request.WxPpWcfSendImageMsgReq; @@ -425,6 +426,22 @@ public class WeChatDllServiceImpl implements WeChatDllService { return null; } + @Override + public String revokeMsg(WxPpWcfRevokeMsgReq request) { + long startTime = System.currentTimeMillis(); + log.info("[撤回消息]-[消息撤回]-入参打印:{}", request); + long msgId = Long.parseLong(request.getMsgId()); + Wcf.Request wcfReq = Wcf.Request.newBuilder().setFuncValue(Wcf.Functions.FUNC_REVOKE_MSG_VALUE).setUi64(msgId).build(); + Wcf.Response rsp = wechatSocketClient.sendCmd(wcfReq); + int state = judgeWcfCmdState(rsp); + // 回调处理 + String stringJson = JSON.toJSONString(request); + sendMsgCallback(stringJson, state); + long endTime = System.currentTimeMillis(); + log.info("[撤回消息]-[消息撤回]-处理结束,耗时:{}ms", (endTime - startTime)); + return ""; + } + @Override public String passFriendApply(WxPpWcfPassFriendApplyReq request) { long startTime = System.currentTimeMillis(); @@ -562,6 +579,18 @@ public class WeChatDllServiceImpl implements WeChatDllService { return ""; } + @Override + public String queryFriendCircle() { + long startTime = System.currentTimeMillis(); + log.info("[查询]-[刷新朋友圈]-开始"); + Wcf.Request req = Wcf.Request.newBuilder().setFuncValue(Wcf.Functions.FUNC_REFRESH_PYQ_VALUE).build(); + Wcf.Response rsp = wechatSocketClient.sendCmd(req); + int state = judgeWcfCmdState(rsp); + long endTime = System.currentTimeMillis(); + log.info("[查询]-[刷新朋友圈]-处理结束,耗时:{}ms", (endTime - startTime)); + return ""; + } + /** * 获取SQL类型 * @@ -597,7 +626,7 @@ public class WeChatDllServiceImpl implements WeChatDllService { if (converter != null) { return converter.apply(content.toByteArray()); } else { - log.warn("未知的SQL类型: {}", type); + log.warn("[SQL转换类型]-未知的SQL类型: {}", type); return content.toByteArray(); } }