瀏覽代碼

CID接口接口优化-删除暂不需要用到的接口,优化返回类型

cgp 1 天之前
父節點
當前提交
8397a8189c
共有 71 個文件被更改,包括 837 次插入1395 次删除
  1. 0 9
      fs-service/src/main/java/com/fs/wxcid/dto/admin/GenAuthKey1Request.java
  2. 23 0
      fs-service/src/main/java/com/fs/wxcid/dto/callback/CallbackConfigResponse.java
  3. 0 66
      fs-service/src/main/java/com/fs/wxcid/dto/callback/CallbackMessage.java
  4. 0 11
      fs-service/src/main/java/com/fs/wxcid/dto/callback/ImgBuf.java
  5. 0 19
      fs-service/src/main/java/com/fs/wxcid/dto/callback/MessageCallbackRequest.java
  6. 0 17
      fs-service/src/main/java/com/fs/wxcid/dto/callback/StringWrapper.java
  7. 53 0
      fs-service/src/main/java/com/fs/wxcid/dto/common/ApiResponseCommon.java
  8. 0 35
      fs-service/src/main/java/com/fs/wxcid/dto/friend/AgreeAddRequest.java
  9. 23 0
      fs-service/src/main/java/com/fs/wxcid/dto/friend/BaseResponse.java
  10. 43 0
      fs-service/src/main/java/com/fs/wxcid/dto/friend/ContactList.java
  11. 29 0
      fs-service/src/main/java/com/fs/wxcid/dto/friend/ContactListResponse.java
  12. 0 15
      fs-service/src/main/java/com/fs/wxcid/dto/friend/DelContactRequest.java
  13. 17 0
      fs-service/src/main/java/com/fs/wxcid/dto/friend/ErrMsg.java
  14. 0 21
      fs-service/src/main/java/com/fs/wxcid/dto/friend/GetContactDetailsListRequest.java
  15. 0 15
      fs-service/src/main/java/com/fs/wxcid/dto/friend/GetFriendRelationRequest.java
  16. 0 27
      fs-service/src/main/java/com/fs/wxcid/dto/friend/SearchContactRequest.java
  17. 0 24
      fs-service/src/main/java/com/fs/wxcid/dto/friend/UploadMContactRequest.java
  18. 0 7
      fs-service/src/main/java/com/fs/wxcid/dto/friend/VerifyUserRequest.java
  19. 23 0
      fs-service/src/main/java/com/fs/wxcid/dto/login/BaseResp.java
  20. 0 21
      fs-service/src/main/java/com/fs/wxcid/dto/login/DeviceInfo.java
  21. 25 0
      fs-service/src/main/java/com/fs/wxcid/dto/login/LoginJournal.java
  22. 35 0
      fs-service/src/main/java/com/fs/wxcid/dto/login/LoginQrCodeResponseData.java
  23. 0 32
      fs-service/src/main/java/com/fs/wxcid/dto/login/LoginRequest.java
  24. 73 0
      fs-service/src/main/java/com/fs/wxcid/dto/login/LoginStatusData.java
  25. 113 0
      fs-service/src/main/java/com/fs/wxcid/dto/login/LoginStatusResponseData.java
  26. 0 21
      fs-service/src/main/java/com/fs/wxcid/dto/login/SlideVerifyRequest.java
  27. 0 20
      fs-service/src/main/java/com/fs/wxcid/dto/login/VerifyCodeRequest.java
  28. 0 16
      fs-service/src/main/java/com/fs/wxcid/dto/message/AddMessageMgrRequest.java
  29. 0 16
      fs-service/src/main/java/com/fs/wxcid/dto/message/AppMessageItem.java
  30. 23 0
      fs-service/src/main/java/com/fs/wxcid/dto/message/BaseResponse.java
  31. 0 17
      fs-service/src/main/java/com/fs/wxcid/dto/message/CdnUploadVideoRequest.java
  32. 59 0
      fs-service/src/main/java/com/fs/wxcid/dto/message/ChatSendRet.java
  33. 0 16
      fs-service/src/main/java/com/fs/wxcid/dto/message/DownloadEmojiGifRequest.java
  34. 0 23
      fs-service/src/main/java/com/fs/wxcid/dto/message/EmojiItem.java
  35. 0 15
      fs-service/src/main/java/com/fs/wxcid/dto/message/ForwardEmojiRequest.java
  36. 0 25
      fs-service/src/main/java/com/fs/wxcid/dto/message/ForwardImageItem.java
  37. 0 16
      fs-service/src/main/java/com/fs/wxcid/dto/message/ForwardImageMessageRequest.java
  38. 0 27
      fs-service/src/main/java/com/fs/wxcid/dto/message/ForwardVideoItem.java
  39. 0 5
      fs-service/src/main/java/com/fs/wxcid/dto/message/ForwardVideoMessageRequest.java
  40. 0 34
      fs-service/src/main/java/com/fs/wxcid/dto/message/GetMsgBigImgRequest.java
  41. 0 3
      fs-service/src/main/java/com/fs/wxcid/dto/message/GetMsgVideoRequest.java
  42. 0 19
      fs-service/src/main/java/com/fs/wxcid/dto/message/GetMsgVoiceRequest.java
  43. 0 14
      fs-service/src/main/java/com/fs/wxcid/dto/message/GroupMassMsgImageRequest.java
  44. 0 14
      fs-service/src/main/java/com/fs/wxcid/dto/message/GroupMassMsgTextRequest.java
  45. 0 10
      fs-service/src/main/java/com/fs/wxcid/dto/message/HttpSyncMsgRequest.java
  46. 0 3
      fs-service/src/main/java/com/fs/wxcid/dto/message/RevokeMsgNewRequest.java
  47. 0 25
      fs-service/src/main/java/com/fs/wxcid/dto/message/RevokeMsgRequest.java
  48. 0 18
      fs-service/src/main/java/com/fs/wxcid/dto/message/Section.java
  49. 0 11
      fs-service/src/main/java/com/fs/wxcid/dto/message/SendAppMessageRequest.java
  50. 0 11
      fs-service/src/main/java/com/fs/wxcid/dto/message/SendEmojiMessageRequest.java
  51. 0 3
      fs-service/src/main/java/com/fs/wxcid/dto/message/SendImageMessageRequest.java
  52. 0 3
      fs-service/src/main/java/com/fs/wxcid/dto/message/SendImageNewMessageRequest.java
  53. 35 0
      fs-service/src/main/java/com/fs/wxcid/dto/message/SendMessageResult.java
  54. 31 0
      fs-service/src/main/java/com/fs/wxcid/dto/message/SendResponse.java
  55. 0 19
      fs-service/src/main/java/com/fs/wxcid/dto/message/SendVoiceRequest.java
  56. 0 22
      fs-service/src/main/java/com/fs/wxcid/dto/message/ShareCardMessageRequest.java
  57. 20 0
      fs-service/src/main/java/com/fs/wxcid/dto/message/UserNameWrapper.java
  58. 0 10
      fs-service/src/main/java/com/fs/wxcid/dto/user/DelayAuthKeyRequest.java
  59. 0 9
      fs-service/src/main/java/com/fs/wxcid/dto/user/DeleteAuthKeyRequest.java
  60. 0 9
      fs-service/src/main/java/com/fs/wxcid/dto/user/DisableAuthKeyRequest.java
  61. 4 29
      fs-service/src/main/java/com/fs/wxcid/service/AdminLicenseService.java
  62. 3 128
      fs-service/src/main/java/com/fs/wxcid/service/FriendService.java
  63. 7 21
      fs-service/src/main/java/com/fs/wxcid/service/LoginService.java
  64. 6 5
      fs-service/src/main/java/com/fs/wxcid/service/MessageCallbackService.java
  65. 4 23
      fs-service/src/main/java/com/fs/wxcid/service/MessageService.java
  66. 15 81
      fs-service/src/main/java/com/fs/wxcid/service/impl/AdminLicenseServiceImpl.java
  67. 22 82
      fs-service/src/main/java/com/fs/wxcid/service/impl/FriendServiceImpl.java
  68. 81 75
      fs-service/src/main/java/com/fs/wxcid/service/impl/LoginServiceImpl.java
  69. 45 40
      fs-service/src/main/java/com/fs/wxcid/service/impl/MessageCallbackServiceImpl.java
  70. 17 138
      fs-service/src/main/java/com/fs/wxcid/service/impl/MessageServiceImpl.java
  71. 8 0
      fs-service/src/main/java/com/fs/wxwork/utils/WxWorkHttpUtil.java

+ 0 - 9
fs-service/src/main/java/com/fs/wxcid/dto/admin/GenAuthKey1Request.java

@@ -1,9 +0,0 @@
-package com.fs.wxcid.dto.admin;
-
-import lombok.Data;
-
-@Data
-public class GenAuthKey1Request {
-    private Integer Count = 1;
-    private Integer Days = 30;
-}

+ 23 - 0
fs-service/src/main/java/com/fs/wxcid/dto/callback/CallbackConfigResponse.java

@@ -0,0 +1,23 @@
+package com.fs.wxcid.dto.callback;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+/**
+ * 消息回调配置信息
+ */
+@Data
+public class CallbackConfigResponse {
+
+    /**
+     * 回调 URL 地址
+     */
+    @JSONField(name = "CallbackURL")
+    private String callbackUrl;
+
+    /**
+     * 是否启用回调
+     */
+    @JSONField(name = "Enabled")
+    private boolean enabled;
+}

+ 0 - 66
fs-service/src/main/java/com/fs/wxcid/dto/callback/CallbackMessage.java

@@ -1,66 +0,0 @@
-package com.fs.wxcid.dto.callback;
-
-import lombok.Data;
-
-/**
- * 回调中的具体消息内容
- */
-@Data
-public class CallbackMessage {
-
-    /** 消息 ID(整型) */
-    private Long msg_id;
-
-    /** 发送者 wxid(嵌套结构) */
-    private StringWrapper from_user_name;
-
-    /** 接收者 wxid(通常是当前账号) */
-    private StringWrapper to_user_name;
-
-    /** 消息类型:
-     *  1 = 文本,
-     *  3 = 图片,
-     *  34 = 语音,
-     *  43 = 视频,
-     *  47 = 表情/动画,
-     *  49 = App消息(链接、文件等),
-     *  51 = 系统通知(如 lastMessage)等 */
-    private Integer msg_type;
-
-    /** 消息内容(文本或 XML) */
-    private StringWrapper content;
-
-    /** 消息状态(通常为 3) */
-    private Integer status;
-
-    /** 图片状态(通常为 1) */
-    private Integer img_status;
-
-    /** 图片缓冲区(长度为 0 表示无图) */
-    private ImgBuf img_buf;
-
-    /** 消息创建时间戳(秒) */
-    private Long create_time;
-
-    /** 消息来源 XML(包含签名、扩展信息等) */
-    private String msg_source;
-
-    /** 推送通知内容(如 "昵称 : 消息文本") */
-    private String push_content;
-
-    /** 新版消息 ID(64位整数字符串) */
-    private String new_msg_id;
-
-
-    public String getFromWxId() {
-        return from_user_name != null ? from_user_name.getStr() : null;
-    }
-
-    public String getToWxId() {
-        return to_user_name != null ? to_user_name.getStr() : null;
-    }
-
-    public String getContentText() {
-        return content != null ? content.getStr() : null;
-    }
-}

+ 0 - 11
fs-service/src/main/java/com/fs/wxcid/dto/callback/ImgBuf.java

@@ -1,11 +0,0 @@
-package com.fs.wxcid.dto.callback;
-
-import lombok.Data;
-
-/**
- * 图片缓冲区信息
- */
-@Data
-public class ImgBuf {
-    private Integer len; // 长度,通常为 0
-}

+ 0 - 19
fs-service/src/main/java/com/fs/wxcid/dto/callback/MessageCallbackRequest.java

@@ -1,19 +0,0 @@
-package com.fs.wxcid.dto.callback;
-
-import lombok.Data;
-
-/**
- * 微信消息回调顶层请求对象
- */
-@Data
-public class MessageCallbackRequest {
-
-    /** 账号唯一标识(与发送时的 key 一致) */
-    private String key;
-
-    /** 回调类型,目前为 "message" */
-    private String type;
-
-    /** 具体消息内容 */
-    private CallbackMessage message;
-}

+ 0 - 17
fs-service/src/main/java/com/fs/wxcid/dto/callback/StringWrapper.java

@@ -1,17 +0,0 @@
-package com.fs.wxcid.dto.callback;
-
-import lombok.Data;
-
-/**
- * 包装字符串的结构,用于 from_user_name / content 等字段
- * 对应 JSON: { "str": "实际值" }
- */
-@Data
-public class StringWrapper {
-    private String str;
-
-    @Override
-    public String toString() {
-        return str != null ? str : "";
-    }
-}

+ 53 - 0
fs-service/src/main/java/com/fs/wxcid/dto/common/ApiResponseCommon.java

@@ -0,0 +1,53 @@
+package com.fs.wxcid.dto.common;
+
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+/**
+ * 通用 API 响应封装类
+ * <p>
+ * 用于统一接收后端返回的 JSON 响应结构,支持泛型指定 Data 部分的具体类型。
+ * </p>
+ *
+ * @param <T> Data 字段对应的具体业务数据类型
+ */
+@Data
+public class ApiResponseCommon<T> {
+
+    /**
+     * 响应状态码(如 200 表示成功)
+     */
+    @JSONField(name = "Code")
+    private int code;
+
+    /**
+     * 业务数据主体,具体结构由泛型 T 决定
+     */
+    @JSONField(name = "Data")
+    private T data;
+
+    /**
+     * 附加文本信息(通常用于错误提示或说明)
+     */
+    @JSONField(name = "Text")
+    private String text;
+
+    /**
+     * 是否成功(注意:部分接口即使 Code=200,Success 仍可能为 false,需结合业务判断)
+     */
+    @JSONField(name = "Success")
+    private boolean success;
+
+    /**
+     * 额外字段 Data62(用途不明,保留以兼容原始协议)
+     */
+    @JSONField(name = "Data62")
+    private String data62;
+
+    /**
+     * 票据信息(如会话票据、临时凭证等)
+     */
+    @JSONField(name = "Ticket")
+    private String ticket;
+}

+ 0 - 35
fs-service/src/main/java/com/fs/wxcid/dto/friend/AgreeAddRequest.java

@@ -1,35 +0,0 @@
-package com.fs.wxcid.dto.friend;
-
-import lombok.Data;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-/**
- * 同意好友请求 或 验证添加好友 的请求参数
- * 对应接口:/friend/AgreeAdd 和 /friend/VerifyUser
- */
-@Data
-public class AgreeAddRequest {
-    /** 群聊用户名(当通过群聊添加时使用) */
-    @JsonProperty("ChatRoomUserName")
-    private String ChatRoomUserName;
-
-    /** 操作码,通常为 2 表示同意 */
-    @JsonProperty("OpCode")
-    private Integer OpCode;
-
-    /** 添加场景,例如 3 表示通过二维码 */
-    @JsonProperty("Scene")
-    private Integer Scene;
-
-    /** 微信内部加密参数 V3(来自好友请求) */
-    @JsonProperty("V3")
-    private String V3;
-
-    /** 微信内部加密参数 V4(来自好友请求) */
-    @JsonProperty("V4")
-    private String V4;
-
-    /** 验证附言(可选) */
-    @JsonProperty("VerifyContent")
-    private String VerifyContent;
-}

+ 23 - 0
fs-service/src/main/java/com/fs/wxcid/dto/friend/BaseResponse.java

@@ -0,0 +1,23 @@
+package com.fs.wxcid.dto.friend;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+/**
+ * 微信协议中常见的基础响应结构
+ */
+@Data
+public class BaseResponse {
+
+    /**
+     * 返回码(0 表示成功)
+     */
+    @JSONField(name = "ret")
+    private int ret;
+
+    /**
+     * 错误消息对象
+     */
+    @JSONField(name = "errMsg")
+    private ErrMsg errMsg;
+}

+ 43 - 0
fs-service/src/main/java/com/fs/wxcid/dto/friend/ContactList.java

@@ -0,0 +1,43 @@
+package com.fs.wxcid.dto.friend;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 联系人列表核心数据结构
+ */
+@Data
+public class ContactList {
+
+    /**
+     * 基础响应信息(包含操作结果状态)
+     */
+    @JSONField(name = "baseResponse")
+    private BaseResponse baseResponse;
+
+    /**
+     * 当前微信联系人序列号(用于增量同步)
+     */
+    @JSONField(name = "currentWxcontactSeq")
+    private long currentWxcontactSeq;
+
+    /**
+     * 当前群聊联系人序列号(0 表示无更新)
+     */
+    @JSONField(name = "currentChatRoomContactSeq")
+    private long currentChatRoomContactSeq;
+
+    /**
+     * 续传标志(0 表示已全部返回,非 0 可能表示还有更多数据)
+     */
+    @JSONField(name = "continueFlag")
+    private int continueFlag;
+
+    /**
+     * 联系人用户名列表(包括好友、公众号、系统账号等)
+     */
+    @JSONField(name = "contactUsernameList")
+    private List<String> contactUsernameList;
+}

+ 29 - 0
fs-service/src/main/java/com/fs/wxcid/dto/friend/ContactListResponse.java

@@ -0,0 +1,29 @@
+package com.fs.wxcid.dto.friend;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+/**
+ * 联系人列表接口的 Data 部分响应结构
+ */
+@Data
+public class ContactListResponse {
+
+    /**
+     * 联系人列表详细信息
+     */
+    @JSONField(name = "ContactList")
+    private ContactList contactList;
+
+    /**
+     * 错误信息(空字符串表示无错误)
+     */
+    @JSONField(name = "errMsg")
+    private String errMsg;
+
+    /**
+     * 返回码(0 表示成功)
+     */
+    @JSONField(name = "retCode")
+    private int retCode;
+}

+ 0 - 15
fs-service/src/main/java/com/fs/wxcid/dto/friend/DelContactRequest.java

@@ -1,15 +0,0 @@
-package com.fs.wxcid.dto.friend;
-
-import lombok.Data;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-/**
- * 删除好友请求参数
- * 对应接口:/friend/DelContact
- */
-@Data
-public class DelContactRequest {
-    /** 要删除的好友用户名(wxid 或其他唯一标识) */
-    @JsonProperty("DelUserName")
-    private String DelUserName;
-}

+ 17 - 0
fs-service/src/main/java/com/fs/wxcid/dto/friend/ErrMsg.java

@@ -0,0 +1,17 @@
+package com.fs.wxcid.dto.friend;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+/**
+ * 错误消息内容(通常 str 为空表示无错误)
+ */
+@Data
+public class ErrMsg {
+
+    /**
+     * 具体错误描述字符串
+     */
+    @JSONField(name = "str")
+    private String str;
+}

+ 0 - 21
fs-service/src/main/java/com/fs/wxcid/dto/friend/GetContactDetailsListRequest.java

@@ -1,21 +0,0 @@
-package com.fs.wxcid.dto.friend;
-
-import lombok.Data;
-import java.util.List;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-/**
- * 获取联系人详情列表的请求参数
- * 支持同时查询多个用户和群聊
- * 对应接口:/friend/GetContactDetailsList
- */
-@Data
-public class GetContactDetailsListRequest {
-    /** 要查询的群聊 wxid 列表 */
-    @JsonProperty("RoomWxIDList")
-    private List<String> RoomWxIDList;
-
-    /** 要查询的用户 wxid 列表 */
-    @JsonProperty("UserNames")
-    private List<String> UserNames;
-}

+ 0 - 15
fs-service/src/main/java/com/fs/wxcid/dto/friend/GetFriendRelationRequest.java

@@ -1,15 +0,0 @@
-package com.fs.wxcid.dto.friend;
-
-import lombok.Data;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-/**
- * 查询与指定用户的好友关系状态
- * 对应接口:/friend/GetFriendRelation
- */
-@Data
-public class GetFriendRelationRequest {
-    /** 目标用户的用户名(wxid) */
-    @JsonProperty("UserName")
-    private String UserName;
-}

+ 0 - 27
fs-service/src/main/java/com/fs/wxcid/dto/friend/SearchContactRequest.java

@@ -1,27 +0,0 @@
-package com.fs.wxcid.dto.friend;
-
-import lombok.Data;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-/**
- * 搜索联系人请求参数
- * 对应接口:/friend/SearchContact
- */
-@Data
-public class SearchContactRequest {
-    /** 来源场景(如 0 表示通用搜索) */
-    @JsonProperty("FromScene")
-    private Integer FromScene;
-
-    /** 操作码(通常为 0) */
-    @JsonProperty("OpCode")
-    private Integer OpCode;
-
-    /** 搜索场景(如 0 表示按昵称/微信号搜索) */
-    @JsonProperty("SearchScene")
-    private Integer SearchScene;
-
-    /** 要搜索的用户名、昵称或微信号 */
-    @JsonProperty("UserName")
-    private String UserName;
-}

+ 0 - 24
fs-service/src/main/java/com/fs/wxcid/dto/friend/UploadMContactRequest.java

@@ -1,24 +0,0 @@
-package com.fs.wxcid.dto.friend;
-
-import lombok.Data;
-import java.util.List;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-/**
- * 上传手机通讯录以匹配微信好友
- * 对应接口:/friend/UploadMContact
- */
-@Data
-public class UploadMContactRequest {
-    /** 当前手机号(可选) */
-    @JsonProperty("Mobile")
-    private String Mobile;
-
-    /** 手机通讯录中的号码列表 */
-    @JsonProperty("MobileList")
-    private List<String> MobileList;
-
-    /** 操作码(通常为 0) */
-    @JsonProperty("Opcode") // 注意:此处是 Opcode(大写 O),非 OpCode
-    private Integer Opcode;
-}

+ 0 - 7
fs-service/src/main/java/com/fs/wxcid/dto/friend/VerifyUserRequest.java

@@ -1,7 +0,0 @@
-package com.fs.wxcid.dto.friend;
-
-/**
- * 验证/添加好友请求,结构与 AgreeAddRequest 完全一致
- * 可复用或单独定义以增强语义
- */
-public class VerifyUserRequest extends AgreeAddRequest {}

+ 23 - 0
fs-service/src/main/java/com/fs/wxcid/dto/login/BaseResp.java

@@ -0,0 +1,23 @@
+package com.fs.wxcid.dto.login;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+/**
+ * 微信协议通用基础响应结构(简化版)
+ */
+@Data
+public class BaseResp {
+
+    /**
+     * 返回码(0 表示成功)
+     */
+    @JSONField(name = "ret")
+    private int ret;
+
+    /**
+     * 错误消息对象(通常为空对象 {})
+     */
+    @JSONField(name = "errMsg")
+    private Object errMsg; // 注意:此处是空对象 {},用 Object 或 Map<String, Object> 均可
+}

+ 0 - 21
fs-service/src/main/java/com/fs/wxcid/dto/login/DeviceInfo.java

@@ -1,21 +0,0 @@
-package com.fs.wxcid.dto.login;
-import lombok.Data;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-/**
- * 设备信息,用于模拟 Android 设备登录
- */
-@Data
-public class DeviceInfo {
-    @JsonProperty("AndroidId")
-    private String androidId;         // Android 设备 ID
-
-    @JsonProperty("ImeI")
-    private String imei;              // IMEI 号(可伪造)
-
-    @JsonProperty("Manufacturer")
-    private String manufacturer;      // 厂商,如 "HUAWEI"
-
-    @JsonProperty("Model")
-    private String model;             // 型号,如 "P40"
-}

+ 25 - 0
fs-service/src/main/java/com/fs/wxcid/dto/login/LoginJournal.java

@@ -0,0 +1,25 @@
+package com.fs.wxcid.dto.login;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 登录日志记录
+ */
+@Data
+public class LoginJournal {
+
+    /**
+     * 日志条数
+     */
+    @JSONField(name = "count")
+    private int count;
+
+    /**
+     * 日志列表(当前为空数组 [])
+     */
+    @JSONField(name = "logs")
+    private List<Object> logs; // 若未来有结构,可替换为具体类
+}

+ 35 - 0
fs-service/src/main/java/com/fs/wxcid/dto/login/LoginQrCodeResponseData.java

@@ -0,0 +1,35 @@
+package com.fs.wxcid.dto.login;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+/**
+ * 登录二维码接口的 Data 部分响应结构
+ */
+@Data
+public class LoginQrCodeResponseData {
+
+    /**
+     * 提示文本(建议用此内容生成二维码)
+     */
+    @JSONField(name = "Txt")
+    private String txt;
+
+    /**
+     * 基础响应信息
+     */
+    @JSONField(name = "baseResp")
+    private BaseResp baseResp;
+
+    /**
+     * 二维码图片的完整 URL(可直接用于展示或下载)
+     */
+    @JSONField(name = "QrCodeUrl")
+    private String qrCodeUrl;
+
+    /**
+     * 本次登录会话的授权 Key
+     */
+    @JSONField(name = "Key")
+    private String key;
+}

+ 0 - 32
fs-service/src/main/java/com/fs/wxcid/dto/login/LoginRequest.java

@@ -1,32 +0,0 @@
-package com.fs.wxcid.dto.login;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-/**
- * A16 数据登录 或 62账号密码登录 的通用请求参数
- * <p>两者结构完全一致,可复用</p>
- */
-@Data
-public class LoginRequest {
-
-    @JsonProperty("DeviceInfo")
-    private DeviceInfo deviceInfo;    // 模拟设备信息
-
-    @JsonProperty("LoginData")
-    private String loginData;         // 62数据 或 A16数据(Base64 编码)
-
-    @JsonProperty("Password")
-    private String password;          // 微信密码(部分登录方式需要)
-
-    @JsonProperty("Proxy")
-    private String proxy;             // 代理地址,格式:socks5://user:pass@ip:port
-
-    @JsonProperty("Ticket")
-    private String ticket;            // 登录票据(如扫码后的 ticket)
-
-    @JsonProperty("Type")
-    private Integer type;             // 登录类型,0 表示普通登录
-
-    @JsonProperty("UserName")
-    private String userName;          // 微信号 或 手机号
-}

+ 73 - 0
fs-service/src/main/java/com/fs/wxcid/dto/login/LoginStatusData.java

@@ -0,0 +1,73 @@
+package com.fs.wxcid.dto.login;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 获取登录状态的响应数据(/login/GetLoginStatus 的 data 部分)
+ */
+@Data
+public class LoginStatusData {
+
+    /**
+     * 目标服务器 IP(可能为空)
+     */
+    @JSONField(name = "targetIp")
+    private String targetIp;
+
+    /**
+     * 登录时间,格式:yyyy-MM-dd HH:mm:ss
+     */
+    @JSONField(name = "loginTime")
+    private String loginTime;
+
+    /**
+     * 登录状态码:1 表示已登录
+     */
+    @JSONField(name = "loginState")
+    private int loginState;
+
+    /**
+     * 代理地址(如 socks5://...)
+     */
+    @JSONField(name = "proxyUrl")
+    private String proxyUrl;
+
+    /**
+     * 到期时间(可能为空)
+     */
+    @JSONField(name = "expiryTime")
+    private String expiryTime;
+
+    /**
+     * 登录日志信息
+     */
+    @JSONField(name = "loginJournal")
+    private LoginJournal loginJournal;
+
+    /**
+     * 本次在线时长(如 "0天0时0分")
+     */
+    @JSONField(name = "onlineTime")
+    private String onlineTime;
+
+    /**
+     * 总计在线时长(如 "0天0时3分")
+     */
+    @JSONField(name = "totalOnline")
+    private String totalOnline;
+
+    /**
+     * 登录状态描述信息(如 "账号在线状态良好!")
+     */
+    @JSONField(name = "loginErrMsg")
+    private String loginErrMsg;
+
+    /**
+     * 累计在线天数
+     */
+    @JSONField(name = "onlineDays")
+    private int onlineDays;
+}

+ 113 - 0
fs-service/src/main/java/com/fs/wxcid/dto/login/LoginStatusResponseData.java

@@ -0,0 +1,113 @@
+package com.fs.wxcid.dto.login;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+/**
+ * 检查登录状态接口的 Data 部分响应结构
+ */
+@Data
+public class LoginStatusResponseData {
+
+    /**
+     * 会话有效时间(秒)
+     */
+    @JSONField(name = "effective_time")
+    private int effectiveTime;
+
+    /**
+     * 返回码(0 表示成功)
+     */
+    @JSONField(name = "ret")
+    private int ret;
+
+    /**
+     * 状态消息(如“登录成功”)
+     */
+    @JSONField(name = "msg")
+    private String msg;
+
+    /**
+     * 未知字段(保留以兼容协议)
+     */
+    @JSONField(name = "unknow")
+    private long unknow;
+
+    /**
+     * 票据(通常为空)
+     */
+    @JSONField(name = "ticket")
+    private String ticket;
+
+    /**
+     * 推送登录 URL 的过期时间(毫秒)
+     */
+    @JSONField(name = "push_login_url_expired_time")
+    private long pushLoginUrlExpiredTime;
+
+    /**
+     * 是否有其他设备已在服务器登录
+     */
+    @JSONField(name = "othersInServerLogin")
+    private boolean othersInServerLogin;
+
+    /**
+     * 用户的微信 ID(wxid_xxx)
+     */
+    @JSONField(name = "wxid")
+    private String wxid;
+
+    /**
+     * 目标服务器 IP(通常为空)
+     */
+    @JSONField(name = "tarGetServerIp")
+    private String tarGetServerIp;
+
+    /**
+     * 登录会话的 UUID(用于标识本次扫码)
+     */
+    @JSONField(name = "uuid")
+    private String uuid;
+
+    /**
+     * 备用 UUID 字段(通常为空)
+     */
+    @JSONField(name = "uuId")
+    private String uuId;
+
+    /**
+     * 新设备登录密码(用于自动化登录)
+     */
+    @JSONField(name = "wxnewpass")
+    private String wxnewpass;
+
+    /**
+     * 用户昵称
+     */
+    @JSONField(name = "nick_name")
+    private String nickName;
+
+    /**
+     * 用户 data62 信息(通常为空)
+     */
+    @JSONField(name = "data62")
+    private String data62;
+
+    /**
+     * 登录状态码(2 表示已登录)
+     */
+    @JSONField(name = "state")
+    private int state;
+
+    /**
+     * 登录设备类型(如 "android")
+     */
+    @JSONField(name = "device")
+    private String device;
+
+    /**
+     * 用户头像 URL
+     */
+    @JSONField(name = "head_img_url")
+    private String headImgUrl;
+}

+ 0 - 21
fs-service/src/main/java/com/fs/wxcid/dto/login/SlideVerifyRequest.java

@@ -1,21 +0,0 @@
-package com.fs.wxcid.dto.login;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-/**
- * 滑块验证
- * */
-@Data
-public class SlideVerifyRequest {
-    @JsonProperty("data62")
-    private String data62;            // 62 数据
-
-    @JsonProperty("randstr")
-    private String randstr;           // 随机字符串(来自滑块验证)
-
-    @JsonProperty("slideticket")
-    private String slideTicket;       // 滑块验证票据
-
-    @JsonProperty("ticket")
-    private String ticket;            // 主登录票据
-}

+ 0 - 20
fs-service/src/main/java/com/fs/wxcid/dto/login/VerifyCodeRequest.java

@@ -1,20 +0,0 @@
-package com.fs.wxcid.dto.login;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Data;
-
-/**
- * iPad 登录时输入验证码的请求
- */
-@Data
-public class VerifyCodeRequest {
-
-    @JsonProperty("code")
-    private String code;              // 用户输入的 6 位数字验证码
-
-    @JsonProperty("data62")
-    private String data62;            // 62 数据(用于恢复会话)
-
-    @JsonProperty("ticket")
-    private String ticket;            // 登录票据
-}

+ 0 - 16
fs-service/src/main/java/com/fs/wxcid/dto/message/AddMessageMgrRequest.java

@@ -1,16 +0,0 @@
-package com.fs.wxcid.dto.message;
-
-import lombok.Data;
-import java.util.List;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-/**
- * 添加消息到发送管理器(用于批量或延迟发送)
- */
-@Data
-public class AddMessageMgrRequest {
-
-    /** 消息项列表 */
-    @JsonProperty("MsgItem")
-    private List<MsgItem> msgItemList;
-}

+ 0 - 16
fs-service/src/main/java/com/fs/wxcid/dto/message/AppMessageItem.java

@@ -1,16 +0,0 @@
-package com.fs.wxcid.dto.message;
-
-import lombok.Data;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-@Data
-public class AppMessageItem {
-    @JsonProperty("ContentType")
-    private Integer ContentType;
-
-    @JsonProperty("ContentXML")
-    private String ContentXML;
-
-    @JsonProperty("ToUserName")
-    private String ToUserName;
-}

+ 23 - 0
fs-service/src/main/java/com/fs/wxcid/dto/message/BaseResponse.java

@@ -0,0 +1,23 @@
+package com.fs.wxcid.dto.message;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+/**
+ * 微信协议中通用的基础响应结构
+ */
+@Data
+public class BaseResponse {
+
+    /**
+     * 返回码:0 表示成功,非 0 表示失败
+     */
+    @JSONField(name = "ret")
+    private int ret;
+
+    /**
+     * 错误信息对象(通常为空对象 {},保留兼容性)
+     */
+    @JSONField(name = "errMsg")
+    private Object errMsg;
+}

+ 0 - 17
fs-service/src/main/java/com/fs/wxcid/dto/message/CdnUploadVideoRequest.java

@@ -1,17 +0,0 @@
-package com.fs.wxcid.dto.message;
-
-import lombok.Data;
-import java.util.List;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-@Data
-public class CdnUploadVideoRequest {
-    @JsonProperty("ThumbData")
-    private List<Integer> ThumbData; // 实际应为 byte[],但 Swagger 写 [0],先用 List<Integer>
-
-    @JsonProperty("ToUserName")
-    private String ToUserName;
-
-    @JsonProperty("VideoData")
-    private List<Integer> VideoData;
-}

+ 59 - 0
fs-service/src/main/java/com/fs/wxcid/dto/message/ChatSendRet.java

@@ -0,0 +1,59 @@
+package com.fs.wxcid.dto.message;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+/**
+ * 单条消息的发送结果详情(来自微信服务器)
+ */
+@Data
+public class ChatSendRet {
+
+    /**
+     * 发送结果码:0 表示成功
+     */
+    @JSONField(name = "ret")
+    private int ret;
+
+    /**
+     * 消息创建时间(Unix 时间戳,秒)
+     */
+    @JSONField(name = "createTime")
+    private long createTime;
+
+    /**
+     * 客户端生成的消息 ID(用于去重或追踪)
+     */
+    @JSONField(name = "clientMsgId")
+    private long clientMsgId;
+
+    /**
+     * 微信服务器分配的新消息 ID(64位整数)
+     */
+    @JSONField(name = "newMsgId")
+    private long newMsgId;
+
+    /**
+     * 接收者用户名(包装结构,实际值在 str 字段中)
+     */
+    @JSONField(name = "toUserName")
+    private UserNameWrapper toUserName;
+
+    /**
+     * 消息 ID(旧版字段,通常为 0)
+     */
+    @JSONField(name = "msgId")
+    private long msgId;
+
+    /**
+     * 服务器处理时间(Unix 时间戳,秒)
+     */
+    @JSONField(name = "serverTime")
+    private long serverTime;
+
+    /**
+     * 消息类型:1 表示文本消息
+     */
+    @JSONField(name = "type")
+    private int type;
+}

+ 0 - 16
fs-service/src/main/java/com/fs/wxcid/dto/message/DownloadEmojiGifRequest.java

@@ -1,16 +0,0 @@
-package com.fs.wxcid.dto.message;
-
-import lombok.Data;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-/**
- * 下载表情 GIF 动图
- * <p>需提供表情的 XML 描述内容</p>
- */
-@Data
-public class DownloadEmojiGifRequest {
-
-    /** 表情的 XML 内容(来自消息体) */
-    @JsonProperty("xml_content")
-    private String xmlContent;
-}

+ 0 - 23
fs-service/src/main/java/com/fs/wxcid/dto/message/EmojiItem.java

@@ -1,23 +0,0 @@
-package com.fs.wxcid.dto.message;
-
-import lombok.Data;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-/**
- * 表情信息项(用于发送或转发)
- */
-@Data
-public class EmojiItem {
-
-    /** 表情 MD5 值(唯一标识) */
-    @JsonProperty("EmojiMd5")
-    private String emojiMd5;
-
-    /** 表情文件大小(字节) */
-    @JsonProperty("EmojiSize")
-    private Long emojiSize;
-
-    /** 接收者 wxid */
-    @JsonProperty("ToUserName")
-    private String toUserName;
-}

+ 0 - 15
fs-service/src/main/java/com/fs/wxcid/dto/message/ForwardEmojiRequest.java

@@ -1,15 +0,0 @@
-package com.fs.wxcid.dto.message;
-
-import lombok.Data;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-/**
- * 转发表情(支持动图)
- */
-@Data
-public class ForwardEmojiRequest {
-
-    /** 表情列表 */
-    @JsonProperty("EmojiList")
-    private java.util.List<EmojiItem> emojiList;
-}

+ 0 - 25
fs-service/src/main/java/com/fs/wxcid/dto/message/ForwardImageItem.java

@@ -1,25 +0,0 @@
-package com.fs.wxcid.dto.message;
-
-import lombok.Data;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-/**
- * 转发图片项
- */
-@Data
-public class ForwardImageItem {
-    @JsonProperty("AesKey")
-    private String aesKey;
-
-    @JsonProperty("CdnMidImgSize")
-    private Long cdnMidImgSize;
-
-    @JsonProperty("CdnMidImgUrl")
-    private String cdnMidImgUrl;
-
-    @JsonProperty("CdnThumbImgSize")
-    private Long cdnThumbImgSize;
-
-    @JsonProperty("ToUserName")
-    private String toUserName;
-}

+ 0 - 16
fs-service/src/main/java/com/fs/wxcid/dto/message/ForwardImageMessageRequest.java

@@ -1,16 +0,0 @@
-package com.fs.wxcid.dto.message;
-
-import lombok.Data;
-import java.util.List;
-import com.fasterxml.jackson.annotation.JsonProperty;
-/**
- * 转发图片消息请求(结构与视频转发相同)
- */
-@Data
-public class ForwardImageMessageRequest {
-    @JsonProperty("ForwardImageList")
-    private List<ForwardImageItem> ForwardImageList;
-
-    @JsonProperty("ForwardVideoList")
-    private List<ForwardVideoItem> ForwardVideoList;
-}

+ 0 - 27
fs-service/src/main/java/com/fs/wxcid/dto/message/ForwardVideoItem.java

@@ -1,27 +0,0 @@
-package com.fs.wxcid.dto.message;
-
-import lombok.Data;
-import com.fasterxml.jackson.annotation.JsonProperty;
-/**
- * 转发视频项
- */
-@Data
-public class ForwardVideoItem {
-    @JsonProperty("AesKey")
-    private String AesKey;
-
-    @JsonProperty("CdnThumbLength")
-    private Integer CdnThumbLength;
-
-    @JsonProperty("CdnVideoUrl")
-    private String CdnVideoUrl;
-
-    @JsonProperty("Length")
-    private Integer Length;
-
-    @JsonProperty("PlayLength")
-    private Integer PlayLength;
-
-    @JsonProperty("ToUserName")
-    private String ToUserName;
-}

+ 0 - 5
fs-service/src/main/java/com/fs/wxcid/dto/message/ForwardVideoMessageRequest.java

@@ -1,5 +0,0 @@
-package com.fs.wxcid.dto.message;
-/**
- * 转发视频消息请求(结构与视频转发相同)
- */
-public class ForwardVideoMessageRequest extends ForwardImageMessageRequest {}

+ 0 - 34
fs-service/src/main/java/com/fs/wxcid/dto/message/GetMsgBigImgRequest.java

@@ -1,34 +0,0 @@
-package com.fs.wxcid.dto.message;
-
-import lombok.Data;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-/**
- * 获取高清图片(分片下载)
- */
-@Data
-public class GetMsgBigImgRequest {
-    // 压缩类型,通常
-    @JsonProperty("CompressType")
-    private Integer compressType;
-
-    // 消息发送者
-    @JsonProperty("FromUserName")
-    private String fromUserName;
-
-    // 消息 ID
-    @JsonProperty("MsgId")
-    private Long msgId;
-
-    // 分片信息
-    @JsonProperty("Section")
-    private Section section;
-
-    // 当前账号 wxid
-    @JsonProperty("ToUserName")
-    private String toUserName;
-
-    // 文件总长度
-    @JsonProperty("TotalLen")
-    private Long totalLen;
-}

+ 0 - 3
fs-service/src/main/java/com/fs/wxcid/dto/message/GetMsgVideoRequest.java

@@ -1,3 +0,0 @@
-package com.fs.wxcid.dto.message;
-
-public class GetMsgVideoRequest extends GetMsgBigImgRequest {}

+ 0 - 19
fs-service/src/main/java/com/fs/wxcid/dto/message/GetMsgVoiceRequest.java

@@ -1,19 +0,0 @@
-package com.fs.wxcid.dto.message;
-
-import lombok.Data;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-@Data
-public class GetMsgVoiceRequest {
-    @JsonProperty("Bufid")
-    private String Bufid;
-
-    @JsonProperty("Length")
-    private Integer Length;
-
-    @JsonProperty("NewMsgId")
-    private String NewMsgId;
-
-    @JsonProperty("ToUserName")
-    private String ToUserName;
-}

+ 0 - 14
fs-service/src/main/java/com/fs/wxcid/dto/message/GroupMassMsgImageRequest.java

@@ -1,14 +0,0 @@
-package com.fs.wxcid.dto.message;
-
-import lombok.Data;
-import java.util.List;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-@Data
-public class GroupMassMsgImageRequest {
-    @JsonProperty("ImageBase64")
-    private String ImageBase64;
-
-    @JsonProperty("ToUserName")
-    private List<String> ToUserName;
-}

+ 0 - 14
fs-service/src/main/java/com/fs/wxcid/dto/message/GroupMassMsgTextRequest.java

@@ -1,14 +0,0 @@
-package com.fs.wxcid.dto.message;
-
-import lombok.Data;
-import java.util.List;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-@Data
-public class GroupMassMsgTextRequest {
-    @JsonProperty("Content")
-    private String Content;
-
-    @JsonProperty("ToUserName")
-    private List<String> ToUserName;
-}

+ 0 - 10
fs-service/src/main/java/com/fs/wxcid/dto/message/HttpSyncMsgRequest.java

@@ -1,10 +0,0 @@
-package com.fs.wxcid.dto.message;
-
-import lombok.Data;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-@Data
-public class HttpSyncMsgRequest {
-    @JsonProperty("Count")
-    private Integer Count;
-}

+ 0 - 3
fs-service/src/main/java/com/fs/wxcid/dto/message/RevokeMsgNewRequest.java

@@ -1,3 +0,0 @@
-package com.fs.wxcid.dto.message;
-
-public class RevokeMsgNewRequest extends RevokeMsgRequest {}

+ 0 - 25
fs-service/src/main/java/com/fs/wxcid/dto/message/RevokeMsgRequest.java

@@ -1,25 +0,0 @@
-package com.fs.wxcid.dto.message;
-
-import lombok.Data;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-@Data
-public class RevokeMsgRequest {
-    @JsonProperty("ClientImgIdStr")
-    private String ClientImgIdStr;
-
-    @JsonProperty("ClientMsgId")
-    private Long ClientMsgId;
-
-    @JsonProperty("CreateTime")
-    private Long CreateTime;
-
-    @JsonProperty("IsImage")
-    private Boolean IsImage;
-
-    @JsonProperty("NewMsgId")
-    private String NewMsgId;
-
-    @JsonProperty("ToUserName")
-    private String ToUserName;
-}

+ 0 - 18
fs-service/src/main/java/com/fs/wxcid/dto/message/Section.java

@@ -1,18 +0,0 @@
-package com.fs.wxcid.dto.message;
-
-import lombok.Data;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-/**
- * 文件分片信息(用于高清图/视频下载)
- */
-@Data
-public class Section {
-    // 本次请求的数据长度
-    @JsonProperty("DataLen")
-    private Long dataLen;
-
-    // 起始偏移位置
-    @JsonProperty("StartPos")
-    private Long startPos;
-}

+ 0 - 11
fs-service/src/main/java/com/fs/wxcid/dto/message/SendAppMessageRequest.java

@@ -1,11 +0,0 @@
-package com.fs.wxcid.dto.message;
-
-import lombok.Data;
-import java.util.List;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-@Data
-public class SendAppMessageRequest {
-    @JsonProperty("AppList")
-    private List<AppMessageItem> AppList;
-}

+ 0 - 11
fs-service/src/main/java/com/fs/wxcid/dto/message/SendEmojiMessageRequest.java

@@ -1,11 +0,0 @@
-package com.fs.wxcid.dto.message;
-
-import lombok.Data;
-import java.util.List;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-@Data
-public class SendEmojiMessageRequest {
-    @JsonProperty("EmojiList")
-    private List<EmojiItem> EmojiList;
-}

+ 0 - 3
fs-service/src/main/java/com/fs/wxcid/dto/message/SendImageMessageRequest.java

@@ -1,3 +0,0 @@
-package com.fs.wxcid.dto.message;
-
-public class SendImageMessageRequest extends SendTextMessageRequest {}

+ 0 - 3
fs-service/src/main/java/com/fs/wxcid/dto/message/SendImageNewMessageRequest.java

@@ -1,3 +0,0 @@
-package com.fs.wxcid.dto.message;
-
-public class SendImageNewMessageRequest extends SendTextMessageRequest {}

+ 35 - 0
fs-service/src/main/java/com/fs/wxcid/dto/message/SendMessageResult.java

@@ -0,0 +1,35 @@
+package com.fs.wxcid.dto.message;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+/**
+ * 发送消息的单条结果(data 数组中的每个元素)
+ */
+@Data
+public class SendMessageResult {
+
+    /**
+     * 接收方的微信 ID(如 wxid_xxx)
+     */
+    @JSONField(name = "toUSerName")
+    private String toUserName;
+
+    /**
+     * 消息是否发送成功
+     */
+    @JSONField(name = "isSendSuccess")
+    private boolean isSendSuccess;
+
+    /**
+     * 微信底层返回的详细响应信息
+     */
+    @JSONField(name = "resp")
+    private SendResponse resp;
+
+    /**
+     * 实际发送的文本内容
+     */
+    @JSONField(name = "textContent")
+    private String textContent;
+}

+ 31 - 0
fs-service/src/main/java/com/fs/wxcid/dto/message/SendResponse.java

@@ -0,0 +1,31 @@
+package com.fs.wxcid.dto.message;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 微信服务端返回的原始消息发送响应体
+ */
+@Data
+public class SendResponse {
+
+    /**
+     * 基础响应信息(包含 ret 错误码)
+     */
+    @JSONField(name = "base_response")
+    private BaseResponse baseResponse;
+
+    /**
+     * 成功发送的消息数量
+     */
+    @JSONField(name = "count")
+    private int count;
+
+    /**
+     * 每条消息的具体发送结果列表
+     */
+    @JSONField(name = "chat_send_ret_list")
+    private List<ChatSendRet> chatSendRetList;
+}

+ 0 - 19
fs-service/src/main/java/com/fs/wxcid/dto/message/SendVoiceRequest.java

@@ -1,19 +0,0 @@
-package com.fs.wxcid.dto.message;
-
-import lombok.Data;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-@Data
-public class SendVoiceRequest {
-    @JsonProperty("ToUserName")
-    private String ToUserName;
-
-    @JsonProperty("VoiceData")
-    private String VoiceData; // Base64 or binary string
-
-    @JsonProperty("VoiceFormat")
-    private Integer VoiceFormat;
-
-    @JsonProperty("VoiceSecond,") // 注意:Swagger 有逗号 typo!
-    private Integer VoiceSecond;
-}

+ 0 - 22
fs-service/src/main/java/com/fs/wxcid/dto/message/ShareCardMessageRequest.java

@@ -1,22 +0,0 @@
-package com.fs.wxcid.dto.message;
-
-import lombok.Data;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-@Data
-public class ShareCardMessageRequest {
-    @JsonProperty("CardAlias")
-    private String CardAlias;
-
-    @JsonProperty("CardFlag")
-    private Integer CardFlag;
-
-    @JsonProperty("CardNickName")
-    private String CardNickName;
-
-    @JsonProperty("CardWxId")
-    private String CardWxId;
-
-    @JsonProperty("ToUserName")
-    private String ToUserName;
-}

+ 20 - 0
fs-service/src/main/java/com/fs/wxcid/dto/message/UserNameWrapper.java

@@ -0,0 +1,20 @@
+package com.fs.wxcid.dto.message;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+/**
+ * 用户名包装类(用于解析 {"str": "wxid_xxx"} 这类结构)
+ * <p>
+ * 微信部分接口将字符串封装在对象中,避免直接暴露原始值。
+ * </p>
+ */
+@Data
+public class UserNameWrapper {
+
+    /**
+     * 实际的用户名字符串(如 wxid_xxx)
+     */
+    @JSONField(name = "str")
+    private String str;
+}

+ 0 - 10
fs-service/src/main/java/com/fs/wxcid/dto/user/DelayAuthKeyRequest.java

@@ -1,10 +0,0 @@
-package com.fs.wxcid.dto.user;
-
-import lombok.Data;
-
-@Data
-public class DelayAuthKeyRequest {
-    private Integer Days;
-    private String ExpiryDate; // 可为空
-    private String Key;
-}

+ 0 - 9
fs-service/src/main/java/com/fs/wxcid/dto/user/DeleteAuthKeyRequest.java

@@ -1,9 +0,0 @@
-package com.fs.wxcid.dto.user;
-
-import lombok.Data;
-
-@Data
-public class DeleteAuthKeyRequest {
-    private String Key;
-    private Integer Opt; // 0 或其他
-}

+ 0 - 9
fs-service/src/main/java/com/fs/wxcid/dto/user/DisableAuthKeyRequest.java

@@ -1,9 +0,0 @@
-package com.fs.wxcid.dto.user;
-
-import lombok.Data;
-
-@Data
-public class DisableAuthKeyRequest {
-    private Integer IsBanned; // 0=不禁用, 1=禁用?
-    private String Key;
-}

+ 4 - 29
fs-service/src/main/java/com/fs/wxcid/service/AdminLicenseService.java

@@ -1,39 +1,14 @@
 package com.fs.wxcid.service;
 
 
-import com.fs.wxcid.dto.common.ApiResponse;
-import com.fs.wxcid.dto.admin.GenAuthKey1Request;
 import com.fs.wxcid.dto.admin.GenAuthKey3Request;
-import com.fs.wxcid.dto.user.DelayAuthKeyRequest;
-import com.fs.wxcid.dto.user.DeleteAuthKeyRequest;
-import com.fs.wxcid.dto.user.DisableAuthKeyRequest;
+import com.fs.wxcid.dto.common.ApiResponseCommon;
 
-public interface AdminLicenseService {
-
-    // 授权码延期
-    ApiResponse delayAuthKey(String key, DelayAuthKeyRequest request);
-
-    // 删除授权码
-    ApiResponse deleteAuthKey(String key, DeleteAuthKeyRequest request);
-
-    // 禁用授权码
-    ApiResponse disableAuthKey(String key, DisableAuthKeyRequest request);
+import java.util.List;
 
-    // 生成授权码(新设备)- POST 版本
-    ApiResponse genAuthKey1(String key, GenAuthKey1Request request);
-
-    // 生成授权码(新设备)- GET 版本(无参)
-    ApiResponse genAuthKey2(String key);
+public interface AdminLicenseService {
 
     // 生成授权码(按类型:日/周/月...)
-    ApiResponse genAuthKey3(String key, GenAuthKey3Request request);
-
-    // 查询所有激活状态的卡密
-    ApiResponse getActiveLicenseKeys(String key);
-
-    // 获取代理映射列表
-    ApiResponse getProxyMappingList(String key);
+    ApiResponseCommon<List<String>> genAuthKey3(String key, GenAuthKey3Request request);
 
-    // 同步卡密激活状态(HTTP 轮询)
-    ApiResponse httpSyncLicenseKey(String key);
 }

+ 3 - 128
fs-service/src/main/java/com/fs/wxcid/service/FriendService.java

@@ -3,6 +3,7 @@
 package com.fs.wxcid.service;
 
 import com.fs.wxcid.dto.common.ApiResponse;
+import com.fs.wxcid.dto.common.ApiResponseCommon;
 import com.fs.wxcid.dto.friend.*;
 
 /**
@@ -15,45 +16,6 @@ import com.fs.wxcid.dto.friend.*;
  */
 public interface FriendService {
 
-    /**
-     * 同意好友请求
-     * <p>
-     * 对应接口:POST /friend/AgreeAdd
-     * 通常用于处理来自他人的加好友申请,需提供 V3/V4 等加密参数。
-     * </p>
-     *
-     * @param authKey    账号唯一标识(query 参数)
-     * @param request 同意请求参数(包含 V3、V4、Scene 等)
-     * @return 统一响应结果
-     */
-    ApiResponse agreeAdd(String authKey, AgreeAddRequest request);
-
-    /**
-     * 删除好友
-     * <p>
-     * 对应接口:POST /friend/DelContact
-     * 从联系人列表中移除指定用户。
-     * </p>
-     *
-     * @param authKey    账号唯一标识
-     * @param request 删除请求参数(含 DelUserName)
-     * @return 统一响应结果
-     */
-    ApiResponse delContact(String authKey, DelContactRequest request);
-
-    /**
-     * 批量获取联系人详细信息
-     * <p>
-     * 对应接口:POST /friend/GetContactDetailsList
-     * 可同时查询多个用户或群聊的详细资料。
-     * </p>
-     *
-     * @param authKey    账号唯一标识
-     * @param request 查询参数(支持 UserNames 和 RoomWxIDList)
-     * @return 统一响应结果
-     */
-    ApiResponse getContactDetailsList(String authKey, GetContactDetailsListRequest request);
-
     /**
      * 分页获取全部联系人(包括好友和群聊)
      * <p>
@@ -65,94 +27,7 @@ public interface FriendService {
      * @param request 分页参数(CurrentWxcontactSeq / CurrentChatRoomContactSeq)
      * @return 统一响应结果
      */
-    ApiResponse getContactList(String authKey, GetContactListRequest request);
-
-    /**
-     * 查询与指定用户的好友关系状态
-     * <p>
-     * 对应接口:POST /friend/GetFriendRelation
-     * 可判断是否为单向/双向好友、是否被拉黑等。
-     * </p>
-     *
-     * @param authKey    账号唯一标识
-     * @param request 目标用户名(UserName)
-     * @return 统一响应结果(含关系状态码)
-     */
-    ApiResponse getFriendRelation(String authKey, GetFriendRelationRequest request);
-
-    /**
-     * 获取已关注的公众号列表
-     * <p>
-     * 对应接口:GET /friend/GetGHList
-     * 返回当前账号关注的所有公众号信息。
-     * </p>
-     *
-     * @param authKey 账号唯一标识
-     * @return 统一响应结果
-     */
-    ApiResponse getGHList(String authKey);
+    // 反序列化为泛型响应对象
+    ApiResponseCommon<ContactListResponse> getContactList(String authKey, GetContactListRequest request);
 
-    /**
-     * 获取手机通讯录中匹配的微信好友
-     * <p>
-     * 对应接口:GET /friend/GetMFriend
-     * 需提前上传通讯录(UploadMContact),否则可能返回空。
-     * </p>
-     *
-     * @param authKey 账号唯一标识
-     * @return 统一响应结果
-     */
-    ApiResponse getMFriend(String authKey);
-
-    /**
-     * 获取已保存的群聊列表
-     * <p>
-     * 对应接口:GET /friend/GroupList
-     * 返回当前账号参与并保存的所有群聊。
-     * </p>
-     *
-     * @param authKey 账号唯一标识
-     * @return 统一响应结果
-     */
-    ApiResponse getGroupList(String authKey);
-
-    /**
-     * 搜索联系人
-     * <p>
-     * 对应接口:POST /friend/SearchContact
-     * 支持按昵称、微信号、手机号等模糊搜索。
-     * </p>
-     *
-     * @param authKey    账号唯一标识
-     * @param request 搜索参数(UserName + 场景配置)
-     * @return 统一响应结果
-     */
-    ApiResponse searchContact(String authKey, SearchContactRequest request);
-
-    /**
-     * 上传手机通讯录用于匹配微信好友
-     * <p>
-     * 对应接口:POST /friend/UploadMContact
-     * 上传后可调用 GetMFriend 获取匹配结果。
-     * </p>
-     *
-     * @param authKey    账号唯一标识
-     * @param request 通讯录号码列表(MobileList)
-     * @return 统一响应结果
-     */
-    ApiResponse uploadMContact(String authKey, UploadMContactRequest request);
-
-    /**
-     * 发起好友验证或添加请求
-     * <p>
-     * 对应接口:POST /friend/VerifyUser
-     * 用于主动添加他人,需提供对方的 V3/V4(通常来自扫码或推荐)。
-     * 若无 V3/V4,部分场景可能无法添加。
-     * </p>
-     *
-     * @param authKey    账号唯一标识
-     * @param request 添加请求参数(含 V3、V4、Scene、验证语等)
-     * @return 统一响应结果
-     */
-    ApiResponse verifyUser(String authKey, VerifyUserRequest request);
 }

+ 7 - 21
fs-service/src/main/java/com/fs/wxcid/service/LoginService.java

@@ -1,39 +1,25 @@
 package com.fs.wxcid.service;
 
 import com.fs.wxcid.dto.common.ApiResponse;
-import com.fs.wxcid.dto.login.LoginRequest;
-import com.fs.wxcid.dto.login.QrCodeRequest;
-import com.fs.wxcid.dto.login.SlideVerifyRequest;
-import com.fs.wxcid.dto.login.VerifyCodeRequest;
+import com.fs.wxcid.dto.common.ApiResponseCommon;
+import com.fs.wxcid.dto.login.*;
+
 /**
  * 微信登录服务接口
  * <p>封装所有 /login/* 接口,支持多种登录方式</p>
  */
 public interface LoginService {
 
-    // —————— 账号密码 / 62 / A16 登录 ——————
-    ApiResponse a16Login(String authKey, LoginRequest request);
-    ApiResponse deviceLogin(String authKey, LoginRequest request);
-
     // —————— 二维码登录(iPad / Mac / 车载) ——————
-    ApiResponse getLoginQrCodeNew(String authKey, QrCodeRequest request);// iPad
-    ApiResponse getLoginQrCodeNewDirect(String authKey, QrCodeRequest request); // 直登
-    ApiResponse macLogin(String authKey, QrCodeRequest request);// Mac
-    ApiResponse carLogin(String authKey, QrCodeRequest request);// iPad
+    ApiResponseCommon<LoginQrCodeResponseData> getLoginQrCodeNewDirect(String authKey, QrCodeRequest request); // 直登
 
     // ------------------ 状态检测 ------------------
-    ApiResponse checkCanSetAlias(String authKey);// 检测是否可设昵称(判断登录环境)
-    ApiResponse checkLoginStatus(String authKey);// 检测扫码是否完成
-    ApiResponse getLoginStatus(String authKey);// 获取当前在线状态
 
-    // —————— 数据管理 ——————
-    ApiResponse get62Data(String authKey);            // 提取 62 数据(用于免密登录)
+    ApiResponseCommon<LoginStatusResponseData> checkLoginStatus(String authKey);// 检测扫码是否完成
+    ApiResponseCommon<LoginStatusData> getLoginStatus(String authKey);// 获取当前在线状态
 
-    // —————— 验证码与滑块 ——————
-    ApiResponse verifyCode(String authKey, VerifyCodeRequest request);
-    ApiResponse verifyCodeSlide(String authKey, SlideVerifyRequest request);
 
     // —————— 控制 ——————
     ApiResponse wakeUpLogin(String authKey, QrCodeRequest request); // 唤醒扫码登录
-    ApiResponse logOut(String authKey);                // 退出登录
+    ApiResponseCommon<Void> logOut(String authKey);                // 退出登录
 }

+ 6 - 5
fs-service/src/main/java/com/fs/wxcid/service/MessageCallbackService.java

@@ -1,8 +1,9 @@
 package com.fs.wxcid.service;
 
-import com.fs.wxcid.dto.callback.ReturnMessage;
-import com.fs.wxcid.dto.common.ApiResponse;
 import com.fs.wxcid.dto.callback.CallbackConfigRequest;
+import com.fs.wxcid.dto.callback.CallbackConfigResponse;
+import com.fs.wxcid.dto.callback.ReturnMessage;
+import com.fs.wxcid.dto.common.ApiResponseCommon;
 
 import java.util.Map;
 
@@ -24,7 +25,7 @@ public interface MessageCallbackService {
      * @param config 回调配置(URL + 启用状态)
      * @return 统一响应结果
      */
-    ApiResponse setCallback(String authKey, CallbackConfigRequest config);
+    ApiResponseCommon<Void> setCallback(String authKey, CallbackConfigRequest config);
 
     /**
      * 获取当前账号的消息回调配置
@@ -33,7 +34,7 @@ public interface MessageCallbackService {
      * @param authKey 账号唯一标识
      * @return 包含 CallbackURL 和 Enabled 状态的响应
      */
-    ApiResponse getCallback(String authKey);
+    ApiResponseCommon<CallbackConfigResponse> getCallback(String authKey);
 
     /**
      * 删除(清空)消息回调配置
@@ -43,5 +44,5 @@ public interface MessageCallbackService {
      * @param authKey 账号唯一标识
      * @return 操作结果
      */
-    ApiResponse deleteCallback(String authKey);
+    ApiResponseCommon<Void> deleteCallback(String authKey);
 }

+ 4 - 23
fs-service/src/main/java/com/fs/wxcid/service/MessageService.java

@@ -2,31 +2,12 @@ package com.fs.wxcid.service;
 
 
 import com.fs.wxcid.dto.common.ApiResponse;
-import com.fs.wxcid.dto.message.GetMsgBigImgRequest;
+import com.fs.wxcid.dto.common.ApiResponseCommon;
 import com.fs.wxcid.dto.message.*;
 
+import java.util.List;
+
 public interface MessageService {
 
-    ApiResponse addMessageMgr(String authKey, AddMessageMgrRequest request);
-    ApiResponse cdnUploadVideo(String authKey, CdnUploadVideoRequest request);
-    ApiResponse downloadEmojiGif(String authKey, DownloadEmojiGifRequest request);
-    ApiResponse forwardEmoji(String authKey, ForwardEmojiRequest request);
-    ApiResponse forwardImageMessage(String authKey, ForwardImageMessageRequest request);
-    ApiResponse forwardVideoMessage(String authKey, ForwardVideoMessageRequest request);
-    ApiResponse getMsgBigImg(String authKey, GetMsgBigImgRequest request);
-    ApiResponse getMsgVideo(String authKey, GetMsgVideoRequest request);
-    ApiResponse getMsgVoice(String authKey, GetMsgVoiceRequest request);
-    ApiResponse groupMassMsgImage(String authKey, GroupMassMsgImageRequest request);
-    ApiResponse groupMassMsgText(String authKey, GroupMassMsgTextRequest request);
-    ApiResponse httpSyncMsg(String authKey, HttpSyncMsgRequest request);
-    ApiResponse newSyncHistoryMessage(String authKey); // 无 body
-    ApiResponse revokeMsg(String authKey, RevokeMsgRequest request);
-    ApiResponse revokeMsgNew(String authKey, RevokeMsgNewRequest request);
-    ApiResponse sendAppMessage(String authKey, SendAppMessageRequest request);
-    ApiResponse sendEmojiMessage(String authKey, SendEmojiMessageRequest request);
-    ApiResponse sendImageMessage(String authKey, SendImageMessageRequest request);
-    ApiResponse sendImageNewMessage(String authKey, SendImageNewMessageRequest request);
-    ApiResponse sendTextMessage(String authKey, SendTextMessageRequest request);
-    ApiResponse sendVoice(String authKey, SendVoiceRequest request);
-    ApiResponse shareCardMessage(String authKey, ShareCardMessageRequest request);
+    ApiResponseCommon<List<SendMessageResult>> sendTextMessage(String authKey, SendTextMessageRequest request);
 }

+ 15 - 81
fs-service/src/main/java/com/fs/wxcid/service/impl/AdminLicenseServiceImpl.java

@@ -1,96 +1,30 @@
 package com.fs.wxcid.service.impl;
 
-import com.fs.wxcid.dto.common.ApiResponse;
-import com.fs.wxcid.dto.admin.GenAuthKey1Request;
+import com.alibaba.fastjson.TypeReference;
 import com.fs.wxcid.dto.admin.GenAuthKey3Request;
-import com.fs.wxcid.dto.user.DelayAuthKeyRequest;
-import com.fs.wxcid.dto.user.DeleteAuthKeyRequest;
-import com.fs.wxcid.dto.user.DisableAuthKeyRequest;
+import com.fs.wxcid.dto.common.ApiResponseCommon;
 import com.fs.wxcid.service.AdminLicenseService;
 import com.fs.wxwork.utils.WxWorkHttpUtil;
-import com.alibaba.fastjson.TypeReference;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
-import java.util.HashMap;
-import java.util.Map;
-
+import java.util.List;
+@Slf4j
 @Service
 public class AdminLicenseServiceImpl implements AdminLicenseService {
 
     private static final String BASE_URL = "http://114.117.215.244:7006";
 
-
-    @Override
-    public ApiResponse delayAuthKey(String key, DelayAuthKeyRequest request) {
-        return post("/admin/DelayAuthKey", key, request);
-    }
-
-    @Override
-    public ApiResponse deleteAuthKey(String key, DeleteAuthKeyRequest request) {
-        return post("/admin/DeleteAuthKey", key, request);
-    }
-
-    @Override
-    public ApiResponse disableAuthKey(String key, DisableAuthKeyRequest request) {
-        return post("/admin/DisableAuthKey", key, request);
-    }
-
-    @Override
-    public ApiResponse genAuthKey1(String key, GenAuthKey1Request request) {
-        return get("/admin/GenAuthKey1", key);
-    }
-
     @Override
-    public ApiResponse genAuthKey2(String key) {
-        return get("/admin/GenAuthKey2", key);
-    }
-
-    @Override
-    public ApiResponse genAuthKey3(String key, GenAuthKey3Request request) {
-        return post("/admin/GenAuthKey3", key, request);
-    }
-
-    @Override
-    public ApiResponse getActiveLicenseKeys(String key) {
-        return get("/admin/GetActiveLicenseKeys", key);
-    }
-
-    @Override
-    public ApiResponse getProxyMappingList(String key) {
-        return get("/admin/GetProxyMappingList", key);
-    }
-
-    @Override
-    public ApiResponse httpSyncLicenseKey(String key) {
-        return get("/admin/HttpSyncLicenseKey", key);
-    }
-
-    // ------------------ 工具方法 ------------------
-    /**
-     * 通用 POST 请求方法
-     *
-     * @param path   接口路径,如 "/friend/AgreeAdd"
-     * @param key    账号唯一标识(query 参数)
-     * @param request 请求体对象
-     * @return 统一响应结果
-     */
-    private ApiResponse post(String path, String key, Object request) {
-        String url = BASE_URL + path + "?key=" + key;
-        return WxWorkHttpUtil.postWithType(url, request, new TypeReference<ApiResponse>() {});
-    }
-
-    /**
-     * 通用 GET 请求方法(无请求体)
-     *
-     * @param path 接口路径
-     * @param key  账号唯一标识
-     * @return 统一响应结果
-     */
-    private ApiResponse get(String path, String key) {
-        String url = BASE_URL + path;
-        Map<String, Object> params = new HashMap<>();
-        params.put("key", key);
-        String resp = WxWorkHttpUtil.get(url, params);
-        return com.alibaba.fastjson.JSON.parseObject(resp, ApiResponse.class);
+    public ApiResponseCommon<List<String>> genAuthKey3(String key, GenAuthKey3Request request) {
+        String url = BASE_URL + "/admin/GenAuthKey3" + "?key=" + key;
+        ApiResponseCommon<List<String>> listApiResponseCommon = WxWorkHttpUtil.postWithType(
+                url,
+                request,
+                new TypeReference<ApiResponseCommon<List<String>>>() {
+                }
+        );
+        log.info("获取授权码结果列表: {}", listApiResponseCommon.getData());
+        return listApiResponseCommon;
     }
 }

+ 22 - 82
fs-service/src/main/java/com/fs/wxcid/service/impl/FriendServiceImpl.java

@@ -1,19 +1,20 @@
 package com.fs.wxcid.service.impl;
 
-import com.fs.wxcid.dto.common.ApiResponse;
+import com.alibaba.fastjson.TypeReference;
+import com.fs.common.exception.CustomException;
+import com.fs.wxcid.dto.common.ApiResponseCommon;
 import com.fs.wxcid.dto.friend.*;
 import com.fs.wxcid.service.FriendService;
 import com.fs.wxwork.utils.WxWorkHttpUtil;
-import com.alibaba.fastjson.TypeReference;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
-import java.util.HashMap;
-import java.util.Map;
 
 /**
  * 好友管理服务实现类
  * 调用微信私有 API 的 /friend 模块
  */
+@Slf4j
 @Service
 public class FriendServiceImpl implements FriendService {
 
@@ -21,87 +22,26 @@ public class FriendServiceImpl implements FriendService {
     private static final String BASE_URL = "http://114.117.215.244:7006";
 
 
-    @Override
-    public ApiResponse agreeAdd(String authKey, AgreeAddRequest request) {
-        return post("/friend/AgreeAdd", authKey, request);
-    }
 
-    @Override
-    public ApiResponse delContact(String authKey, DelContactRequest request) {
-        return post("/friend/DelContact", authKey, request);
-    }
-
-    @Override
-    public ApiResponse getContactDetailsList(String authKey, GetContactDetailsListRequest request) {
-        return post("/friend/GetContactDetailsList", authKey, request);
-    }
 
     @Override
-    public ApiResponse getContactList(String authKey, GetContactListRequest request) {
-        return post("/friend/GetContactList", authKey, request);
-    }
-
-    @Override
-    public ApiResponse getFriendRelation(String authKey, GetFriendRelationRequest request) {
-        return post("/friend/GetFriendRelation", authKey, request);
-    }
-
-    @Override
-    public ApiResponse getGHList(String authKey) {
-        return get("/friend/GetGHList", authKey);
-    }
-
-    @Override
-    public ApiResponse getMFriend(String authKey) {
-        return get("/friend/GetMFriend", authKey);
-    }
-
-    @Override
-    public ApiResponse getGroupList(String authKey) {
-        return get("/friend/GroupList", authKey);
-    }
-
-    @Override
-    public ApiResponse searchContact(String authKey, SearchContactRequest request) {
-        return post("/friend/SearchContact", authKey, request);
-    }
-
-    @Override
-    public ApiResponse uploadMContact(String authKey, UploadMContactRequest request) {
-        return post("/friend/UploadMContact", authKey, request);
-    }
-
-    @Override
-    public ApiResponse verifyUser(String authKey, VerifyUserRequest request) {
-        return post("/friend/VerifyUser", authKey, request);
-    }
-
-    // ------------------ 工具方法 ------------------
-    /**
-     * 通用 POST 请求方法
-     *
-     * @param path   接口路径,如 "/friend/AgreeAdd"
-     * @param authKey    账号唯一标识(query 参数)
-     * @param request 请求体对象
-     * @return 统一响应结果
-     */
-    private ApiResponse post(String path, String authKey, Object request) {
-        String url = BASE_URL + path + "?key=" + authKey;
-        return WxWorkHttpUtil.postWithType(url, request, new TypeReference<ApiResponse>() {});
-    }
+    public ApiResponseCommon<ContactListResponse> getContactList(String authKey, GetContactListRequest request) {
+        log.info("开始获取联系人列表");
+        String url = BASE_URL + "/friend/GetContactList?key=" + authKey;
+        ApiResponseCommon<ContactListResponse> response = WxWorkHttpUtil.postWithType(
+                url,
+                request,
+                new TypeReference<ApiResponseCommon<ContactListResponse>>() {}
+        );
+        if (response.getCode() != 200 || response.getData() == null) {
+            throw new CustomException("获取联系人失败: " + response.getText());
+        }
 
-    /**
-     * 通用 GET 请求方法(无请求体)
-     *
-     * @param path 接口路径
-     * @param authKey  账号唯一标识
-     * @return 统一响应结果
-     */
-    private ApiResponse get(String path, String authKey) {
-        String url = BASE_URL + path;
-        Map<String, Object> params = new HashMap<>();
-        params.put("authKey", authKey);
-        String resp = WxWorkHttpUtil.get(url, params);
-        return com.alibaba.fastjson.JSON.parseObject(resp, ApiResponse.class);
+        // 安全打印日志(避免 NPE)
+        ContactListResponse data = response.getData();
+        if (data.getContactList() != null) {
+            log.info("联系人id合集: {}", data.getContactList().getContactUsernameList());
+        }
+        return response;
     }
 }

+ 81 - 75
fs-service/src/main/java/com/fs/wxcid/service/impl/LoginServiceImpl.java

@@ -1,86 +1,107 @@
 package com.fs.wxcid.service.impl;
 
+import com.alibaba.fastjson.TypeReference;
+import com.fs.common.exception.CustomException;
 import com.fs.wxcid.dto.common.ApiResponse;
-import com.fs.wxcid.dto.login.LoginRequest;
-import com.fs.wxcid.dto.login.QrCodeRequest;
-import com.fs.wxcid.dto.login.SlideVerifyRequest;
-import com.fs.wxcid.dto.login.VerifyCodeRequest;
+import com.fs.wxcid.dto.common.ApiResponseCommon;
+import com.fs.wxcid.dto.login.*;
 import com.fs.wxcid.service.LoginService;
 import com.fs.wxwork.utils.WxWorkHttpUtil;
-import com.alibaba.fastjson.TypeReference;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
-import java.util.HashMap;
-import java.util.Map;
-
+@Slf4j
 @Service
 public class LoginServiceImpl implements LoginService {
 
     private static final String BASE_URL = "http://114.117.215.244:7006";
 
-    // ------------------ 账号密码登录 ------------------
-
-    public ApiResponse a16Login(String authKey, LoginRequest request) {
-        return post("/login/A16Login", authKey, request);
-    }
-
-    public ApiResponse deviceLogin(String authKey, LoginRequest request) {
-        return post("/login/DeviceLogin", authKey, request);
-    }
-
-    // ------------------ 二维码登录 ------------------
 
-    public ApiResponse getLoginQrCodeNew(String authKey, QrCodeRequest request) {
-        return post("/login/GetLoginQrCodeNew", authKey, request);
-    }
-
-    public ApiResponse getLoginQrCodeNewDirect(String authKey, QrCodeRequest request) {
-        return post("/login/GetLoginQrCodeNewDirect", authKey, request);
-    }
-
-    public ApiResponse macLogin(String authKey, QrCodeRequest request) {
-        return post("/login/MacLogin", authKey, request);
-    }
-
-    public ApiResponse carLogin(String authKey, QrCodeRequest request) {
-        return post("/login/CarLogin", authKey, request);
+    @Override
+    public ApiResponseCommon<LoginQrCodeResponseData> getLoginQrCodeNewDirect(String authKey, QrCodeRequest request) {
+        String url = BASE_URL + "/login/GetLoginQrCodeNewDirect?key=" + authKey;
+        ApiResponseCommon<LoginQrCodeResponseData> loginQrCodeResponseDataApiResponseCommon = WxWorkHttpUtil.postWithType(
+                url,
+                request,
+                new TypeReference<ApiResponseCommon<LoginQrCodeResponseData>>() {
+                }
+        );
+        log.info("二维码照片url: {}", loginQrCodeResponseDataApiResponseCommon.getData().getQrCodeUrl());
+        return loginQrCodeResponseDataApiResponseCommon;
     }
 
+    @Override
     public ApiResponse wakeUpLogin(String authKey, QrCodeRequest request) {
         return post("/login/WakeUpLogin", authKey, request);
     }
 
     // ------------------ 状态检测 ------------------
 
-    public ApiResponse checkCanSetAlias(String authKey) {
-        return get("/login/CheckCanSetAlias", authKey);
-    }
-
-    public ApiResponse checkLoginStatus(String authKey) {
-        return get("/login/CheckLoginStatus", authKey);
+    @Override
+    public ApiResponseCommon<LoginStatusResponseData> checkLoginStatus(String authKey) {
+        String url = BASE_URL + "/login/CheckLoginStatus?key=" + authKey;
+        ApiResponseCommon<LoginStatusResponseData> response = WxWorkHttpUtil.getWithType(
+                url,
+                new TypeReference<ApiResponseCommon<LoginStatusResponseData>>() {}
+        );
+
+        // 只认 text == "账号已登录"
+        if ("账号已登录".equals(response.getText())) {
+            if (response.getData() == null) {
+                throw new CustomException("登录状态异常:text 显示已登录,但 data 为空");
+            }
+            return response;
+        } else {
+            // 抛出具体的错误原因
+            throw new CustomException("检查登录状态失败: " + (response.getText() != null ? response.getText() : "未知错误"));
+        }
+    }
+    @Override
+    public ApiResponseCommon<LoginStatusData> getLoginStatus(String authKey) {
+        String url = BASE_URL + "/login/GetLoginStatus?key=" + authKey;
+        ApiResponseCommon<LoginStatusData> response = WxWorkHttpUtil.getWithType(
+                url,
+                new TypeReference<ApiResponseCommon<LoginStatusData>>() {}
+        );
+
+        //核心判断:只有 code=200 且 data 不为 null 才算成功
+        if (response.getCode() != 200 || response.getData() == null) {
+            String errorMsg = response.getText() != null
+                    ? response.getText()
+                    : "获取登录状态失败,未知错误";
+            throw new CustomException("账号未登录或状态异常: " + errorMsg);
+        }
+
+        return response;
+    }
+
+
+    @Override
+    public ApiResponseCommon<Void> logOut(String authKey) {
+        String url = BASE_URL + "/login/LogOut?key=" + authKey;
+        ApiResponseCommon<Void> response = WxWorkHttpUtil.getWithType(
+                url,
+                new TypeReference<ApiResponseCommon<Void>>() {}
+        );
+
+        String text = response.getText();
+        int code = response.getCode();
+
+        //真正的成功退出
+        if (code == 200 && "退出成功!".equals(text)) {
+            return response;
+        }
+        //已经退出过了(幂等,视为成功)
+        else if (code == 300 && "你已退出登录".equals(text)) {
+            return response; // 也可记录日志:log.debug("重复登出,忽略");
+        }
+        //其他情况一律视为失败
+        else {
+            String errorMsg = text != null ? text : "退出登录失败,未知错误";
+            throw new CustomException("退出登录失败: " + errorMsg);
+        }
     }
 
-    public ApiResponse getLoginStatus(String authKey) {
-        return get("/login/GetLoginStatus", authKey);
-    }
-
-    public ApiResponse get62Data(String authKey) {
-        return get("/login/Get62Data", authKey);
-    }
-
-    public ApiResponse logOut(String authKey) {
-        return get("/login/LogOut", authKey);
-    }
-
-    // ------------------ 验证 ------------------
-
-    public ApiResponse verifyCode(String authKey, VerifyCodeRequest request) {
-        return post("/login/VerifyCode", authKey, request);
-    }
-
-    public ApiResponse verifyCodeSlide(String authKey, SlideVerifyRequest request) {
-        return post("/login/VerifyCodeSlide", authKey, request);
-    }
 
     // ------------------ 工具方法 ------------------
     /**
@@ -95,19 +116,4 @@ public class LoginServiceImpl implements LoginService {
         String url = BASE_URL + path + "?key=" + authKey;
         return WxWorkHttpUtil.postWithType(url, request, new TypeReference<ApiResponse>() {});
     }
-
-    /**
-     * 通用 GET 请求方法(无请求体)
-     *
-     * @param path 接口路径
-     * @param authKey  账号唯一标识
-     * @return 统一响应结果
-     */
-    private ApiResponse get(String path, String authKey) {
-        String url = BASE_URL + path;
-        Map<String, Object> params = new HashMap<>();
-        params.put("authKey", authKey);
-        String resp = WxWorkHttpUtil.get(url, params);
-        return com.alibaba.fastjson.JSON.parseObject(resp, ApiResponse.class);
-    }
 }

+ 45 - 40
fs-service/src/main/java/com/fs/wxcid/service/impl/MessageCallbackServiceImpl.java

@@ -1,16 +1,17 @@
 package com.fs.wxcid.service.impl;
 
 
-import com.fs.wxcid.dto.callback.ReturnMessage;
-import com.fs.wxcid.dto.common.ApiResponse;
+import com.alibaba.fastjson.TypeReference;
+import com.fs.common.exception.CustomException;
 import com.fs.wxcid.dto.callback.CallbackConfigRequest;
+import com.fs.wxcid.dto.callback.CallbackConfigResponse;
+import com.fs.wxcid.dto.callback.ReturnMessage;
+import com.fs.wxcid.dto.common.ApiResponseCommon;
 import com.fs.wxcid.service.MessageCallbackService;
 import com.fs.wxwork.utils.WxWorkHttpUtil;
-import com.alibaba.fastjson.TypeReference;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
-import java.util.HashMap;
 import java.util.Map;
 @Slf4j
 @Service
@@ -20,8 +21,8 @@ public class MessageCallbackServiceImpl implements MessageCallbackService {
 
     @Override
     public ReturnMessage returnMessage(Map<String, Object> callback) {
-        // 安全地获取 authKey
-        String authKey = (String) callback.get("authKey");
+        // 安全地获取 key
+        String key = (String) callback.get("key");
 
         // 获取 message 子对象(也是一个 Map)
         Map<String, Object> message = (Map<String, Object>) callback.get("message");
@@ -45,51 +46,55 @@ public class MessageCallbackServiceImpl implements MessageCallbackService {
     /**
      * 设置消息回调
      */
-    public ApiResponse setCallback(String authKey, CallbackConfigRequest config) {
-        return post("/message/SetCallback", authKey, config);
+    @Override
+    public ApiResponseCommon<Void> setCallback(String key, CallbackConfigRequest config) {
+        String url = BASE_URL + "/message/SetCallback?key=" + key;
+        ApiResponseCommon<Void> response = WxWorkHttpUtil.postWithType(
+                url,
+                config,
+                new TypeReference<ApiResponseCommon<Void>>() {}
+        );
+
+        if (response.getCode() != 200) {
+            throw new CustomException("设置回调失败: " + (response.getText() != null ? response.getText() : "未知错误"));
+        }
+
+        return response;
     }
 
     /**
      * 获取消息回调配置
      */
-    public ApiResponse getCallback(String authKey) {
-        return get("/message/GetCallback", authKey);
+    @Override
+    public ApiResponseCommon<CallbackConfigResponse> getCallback(String key) {
+        String url = BASE_URL + "/message/GetCallback?key=" + key;
+        ApiResponseCommon<CallbackConfigResponse> response = WxWorkHttpUtil.getWithType(
+                url,
+                new TypeReference<ApiResponseCommon<CallbackConfigResponse>>() {}
+        );
+
+        if (response.getCode() != 200 || response.getData() == null) {
+            throw new CustomException("获取回调配置失败: " + (response.getText() != null ? response.getText() : "未知错误"));
+        }
+
+        return response;
     }
 
     /**
      * 删除消息回调配置
      */
-    public ApiResponse deleteCallback(String authKey) {
-        return get("/message/DeleteCallback", authKey);
-    }
-
+    @Override
+    public ApiResponseCommon<Void> deleteCallback(String key) {
+        String url = BASE_URL + "/message/DeleteCallback?key=" + key;
+        ApiResponseCommon<Void> response = WxWorkHttpUtil.getWithType(
+                url,
+                new TypeReference<ApiResponseCommon<Void>>() {}
+        );
 
-    // ------------------ 工具方法 ------------------
-    /**
-     * 通用 POST 请求方法
-     *
-     * @param path   接口路径,如 "/friend/AgreeAdd"
-     * @param authKey    账号唯一标识(query 参数)
-     * @param request 请求体对象
-     * @return 统一响应结果
-     */
-    private ApiResponse post(String path, String authKey, Object request) {
-        String url = BASE_URL + path + "?key=" + authKey;
-        return WxWorkHttpUtil.postWithType(url, request, new TypeReference<ApiResponse>() {});
-    }
+        if (response.getCode() != 200) {
+            throw new CustomException("删除回调配置失败: " + (response.getText() != null ? response.getText() : "未知错误"));
+        }
 
-    /**
-     * 通用 GET 请求方法(无请求体)
-     *
-     * @param path 接口路径
-     * @param authKey  账号唯一标识
-     * @return 统一响应结果
-     */
-    private ApiResponse get(String path, String authKey) {
-        String url = BASE_URL + path;
-        Map<String, Object> params = new HashMap<>();
-        params.put("authKey", authKey);
-        String resp = WxWorkHttpUtil.get(url, params);
-        return com.alibaba.fastjson.JSON.parseObject(resp, ApiResponse.class);
+        return response;
     }
 }

+ 17 - 138
fs-service/src/main/java/com/fs/wxcid/service/impl/MessageServiceImpl.java

@@ -1,15 +1,14 @@
 package com.fs.wxcid.service.impl;
 
-import com.fs.wxcid.dto.common.ApiResponse;
-import com.fs.wxcid.dto.message.GetMsgBigImgRequest;
+import com.alibaba.fastjson.TypeReference;
+import com.fs.common.exception.CustomException;
+import com.fs.wxcid.dto.common.ApiResponseCommon;
 import com.fs.wxcid.dto.message.*;
 import com.fs.wxcid.service.MessageService;
 import com.fs.wxwork.utils.WxWorkHttpUtil;
-import com.alibaba.fastjson.TypeReference;
 import org.springframework.stereotype.Service;
 
-import java.util.HashMap;
-import java.util.Map;
+import java.util.List;
 
 @Service
 public class MessageServiceImpl implements MessageService {
@@ -17,142 +16,22 @@ public class MessageServiceImpl implements MessageService {
     private static final String BASE_URL = "http://114.117.215.244:7006";
 
 
-    @Override
-    public ApiResponse addMessageMgr(String authKey, AddMessageMgrRequest request) {
-        return post("/message/AddMessageMgr", authKey, request);
-    }
-
-    @Override
-    public ApiResponse cdnUploadVideo(String authKey, CdnUploadVideoRequest request) {
-        return post("/message/CdnUploadVideo", authKey, request);
-    }
-
-    @Override
-    public ApiResponse downloadEmojiGif(String authKey, DownloadEmojiGifRequest request) {
-        return post("/message/DownloadEmojiGif", authKey, request);
-    }
-
-    @Override
-    public ApiResponse forwardEmoji(String authKey, ForwardEmojiRequest request) {
-        return post("/message/ForwardEmoji", authKey, request);
-    }
-
-    @Override
-    public ApiResponse forwardImageMessage(String authKey, ForwardImageMessageRequest request) {
-        return post("/message/ForwardImageMessage", authKey, request);
-    }
-
-    @Override
-    public ApiResponse forwardVideoMessage(String authKey, ForwardVideoMessageRequest request) {
-        return post("/message/ForwardVideoMessage", authKey, request);
-    }
-
-    @Override
-    public ApiResponse getMsgBigImg(String authKey, GetMsgBigImgRequest request) {
-        return post("/message/GetMsgBigImg", authKey, request);
-    }
-
-    @Override
-    public ApiResponse getMsgVideo(String authKey, GetMsgVideoRequest request) {
-        return post("/message/GetMsgVideo", authKey, request);
-    }
-
-    @Override
-    public ApiResponse getMsgVoice(String authKey, GetMsgVoiceRequest request) {
-        return post("/message/GetMsgVoice", authKey, request);
-    }
-
-    @Override
-    public ApiResponse groupMassMsgImage(String authKey, GroupMassMsgImageRequest request) {
-        return post("/message/GroupMassMsgImage", authKey, request);
-    }
-
-    @Override
-    public ApiResponse groupMassMsgText(String authKey, GroupMassMsgTextRequest request) {
-        return post("/message/GroupMassMsgText", authKey, request);
-    }
-
-    @Override
-    public ApiResponse httpSyncMsg(String authKey, HttpSyncMsgRequest request) {
-        return post("/message/HttpSyncMsg", authKey, request);
-    }
 
     @Override
-    public ApiResponse newSyncHistoryMessage(String authKey) {
-        return post("/message/NewSyncHistoryMessage", authKey, new Object()); // 无 body,传空对象或自定义
-    }
-
-    @Override
-    public ApiResponse revokeMsg(String authKey, RevokeMsgRequest request) {
-        return post("/message/RevokeMsg", authKey, request);
-    }
-
-    @Override
-    public ApiResponse revokeMsgNew(String authKey, RevokeMsgNewRequest request) {
-        return post("/message/RevokeMsgNew", authKey, request);
-    }
-
-    @Override
-    public ApiResponse sendAppMessage(String authKey, SendAppMessageRequest request) {
-        return post("/message/SendAppMessage", authKey, request);
-    }
-
-    @Override
-    public ApiResponse sendEmojiMessage(String authKey, SendEmojiMessageRequest request) {
-        return post("/message/SendEmojiMessage", authKey, request);
-    }
+    public ApiResponseCommon<List<SendMessageResult>> sendTextMessage(String authKey, SendTextMessageRequest request) {
+        String url = BASE_URL + "/message/SendTextMessage?key=" + authKey;
+        ApiResponseCommon<List<SendMessageResult>> response = WxWorkHttpUtil.postWithType(
+                url,
+                request,
+                new TypeReference<ApiResponseCommon<List<SendMessageResult>>>() {}
+        );
 
-    @Override
-    public ApiResponse sendImageMessage(String authKey, SendImageMessageRequest request) {
-        return post("/message/SendImageMessage", authKey, request);
-    }
-
-    @Override
-    public ApiResponse sendImageNewMessage(String authKey, SendImageNewMessageRequest request) {
-        return post("/message/SendImageNewMessage", authKey, request);
-    }
-
-    @Override
-    public ApiResponse sendTextMessage(String authKey, SendTextMessageRequest request) {
-        return post("/message/SendTextMessage", authKey, request);
-    }
-
-    @Override
-    public ApiResponse sendVoice(String authKey, SendVoiceRequest request) {
-        return post("/message/SendVoice", authKey, request);
-    }
-
-    @Override
-    public ApiResponse shareCardMessage(String authKey, ShareCardMessageRequest request) {
-        return post("/message/ShareCardMessage", authKey, request);
-    }
-
-    // ------------------ 工具方法 ------------------
-    /**
-     * 通用 POST 请求方法
-     *
-     * @param path   接口路径,如 "/friend/AgreeAdd"
-     * @param authKey    账号唯一标识(query 参数)
-     * @param request 请求体对象
-     * @return 统一响应结果
-     */
-    private ApiResponse post(String path, String authKey, Object request) {
-        String url = BASE_URL + path + "?key=" + authKey;
-        return WxWorkHttpUtil.postWithType(url, request, new TypeReference<ApiResponse>() {});
-    }
+        //统一异常判断:只要 code 不是 200,就抛异常
+        if (response.getCode() != 200 || response.getData() == null) {
+            String errorMsg = response.getText() != null ? response.getText() : "发送消息失败,未知错误";
+            throw new CustomException("发送文本消息失败: " + errorMsg);
+        }
 
-    /**
-     * 通用 GET 请求方法(无请求体)
-     *
-     * @param path 接口路径
-     * @param authKey  账号唯一标识
-     * @return 统一响应结果
-     */
-    private ApiResponse get(String path, String authKey) {
-        String url = BASE_URL + path;
-        Map<String, Object> params = new HashMap<>();
-        params.put("authKey", authKey);
-        String resp = WxWorkHttpUtil.get(url, params);
-        return com.alibaba.fastjson.JSON.parseObject(resp, ApiResponse.class);
+        return response;
     }
 }

+ 8 - 0
fs-service/src/main/java/com/fs/wxwork/utils/WxWorkHttpUtil.java

@@ -298,4 +298,12 @@ public class WxWorkHttpUtil {
             logger.info("响应体: {}", logBody);
         }
     }
+
+    /**
+     * 发送GET请求并自动反序列化为指定泛型类型
+     */
+    public static <T> T getWithType(String url, TypeReference<T> typeReference) {
+        String responseBody = get(url); // 复用带日志的 get 方法
+        return JSON.parseObject(responseBody, typeReference);
+    }
 }