feat(0): [wcf-bmc]-1.更新拍一拍接口入参

2.客户端内置方法名与PY版本保持一致
3.适配指定参数查询接口
This commit is contained in:
chandler 2025-05-04 14:10:01 +08:00
parent f6bb8c1b86
commit 4fb586d305
13 changed files with 1053 additions and 291 deletions

View File

@ -32,37 +32,45 @@ ___
### 功能列表
| 接口名 | 地址 |
|----------------|------------------------|
| 查询登录状态 | /loginStatus |
| 获取登录微信内部识别号UID | /loginWeChatUid |
| 获取登录微信信息 | /loginWeChatInfo |
| 获取消息类型列表 | /list/msgType |
| 获取联系人列表 | /list/contacts |
| 获取数据库表名称列表 | /list/dbTableName |
| 获取指定数据库中的表列表 | /list/dbTable |
| 执行数据库查询SQL | /exec/dbQuerySql |
| 发送消息汇总入口 | /send/msgMaster |
| 发送文本消息 | /send/textMsg |
| 发送富文本消息 | /send/richTextMsg |
| 发送XML消息 | /send/xmlMsg |
| 发送图片消息 | /send/imageMsg |
| 发送表情消息 | /send/emojiMsg |
| 发送文件消息 | /send/fileMsg |
| 拍一拍群友 | /patOnePat |
| 撤回消息 | /revokeMsg |
| 通过好友申请 | /passFriendApply |
| 添加群成员为微信好友 | /addFriend/groupMember |
| 查询群成员 | /groupMember/list |
| 邀请群成员 | /groupMember/invite |
| 删除群成员 | /groupMember/delete |
| 查询朋友圈 | /friendCircle |
| 接收转账 | /receiveTransfer |
| 接口名 | 地址 |
|--------------|------------------------|
| 查询登录状态 | /loginStatus |
| 获取登录微信 | /loginWeChatUid |
| 获取登录微信信息 | /loginWeChatInfo |
| 获取消息类型列表 | /list/msgType |
| 获取联系人列表 | /list/contacts |
| 获取数据库表名称列表 | /list/dbTableName |
| 获取指定数据库中的表列表 | /list/dbTable |
| 执行数据库查询SQL | /exec/dbQuerySql |
| 发送消息汇总入口 | /send/msgMaster |
| 发送文本消息 | /send/textMsg |
| 发送富文本消息 | /send/richTextMsg |
| 发送XML消息 | /send/xmlMsg |
| 发送图片消息 | /send/imageMsg |
| 发送表情消息 | /send/emojiMsg |
| 发送文件消息 | /send/fileMsg |
| 拍一拍群友 | /patOnePat |
| 撤回消息 | /revokeMsg |
| 通过好友申请 | /passFriendApply |
| 添加群成员为微信好友 | /addFriend/groupMember |
| 查询群成员 | /groupMember/list |
| 邀请群成员 | /groupMember/invite |
| 删除群成员 | /groupMember/delete |
| 查询朋友圈 | /friendCircle |
| 接收转账 | /receiveTransfer |
### 已知bug
v39.5.2版本目前会出现注入失败的情况待排查修复可先使用v39.5.1只须替换dll版本即可
### 2025-05-04
- 1.更新拍一拍接口入参
- 2.客户端内置方法名与PY版本保持一致
- 3.适配指定参数查询接口
<br/>
### 2025-05-03
- 1.更新dll为v39.5.2
@ -87,32 +95,32 @@ ___
### 功能列表
| 接口名 | 地址 | 是否支持 | 备注 |
|----------------|------------------------|------|--------|
| 查询登录状态 | /loginStatus | ✔️ | 已测试 |
| 获取登录微信内部识别号UID | /loginWeChatUid | ✔️ | 已测试 |
| 获取登录微信信息 | /loginWeChatInfo | ✔️ | 已测试 |
| 获取消息类型列表 | /list/msgType | ✔️ | 已测试 |
| 获取联系人列表 | /list/contacts | ✔️ | 已测试 |
| 获取数据库表名称列表 | /list/dbTableName | ✔️ | 已测试 |
| 获取指定数据库中的表列表 | /list/dbTable | ✔️ | 已测试 |
| 执行数据库查询SQL | /exec/dbQuerySql | ✔️ | 已测试 |
| 发送消息汇总入口 | /send/msgMaster | ❌ | 预留 |
| 发送文本消息 | /send/textMsg | ✔️ | 已测试 |
| 发送富文本消息 | /send/richTextMsg | ❌ | 已知BUG |
| 发送XML消息 | /send/xmlMsg | ❌ | 该版本不支持 |
| 发送图片消息 | /send/imageMsg | ✔️ | 已测试 |
| 发送表情消息 | /send/emojiMsg | ✔️ | 已测试 |
| 发送文件消息 | /send/fileMsg | ✔️ | 已测试 |
| 拍一拍群友 | /patOnePat | ✔️ | 已测试 |
| 撤回消息 | /revokeMsg | ❌ | 该版本不支持 |
| 通过好友申请 | /passFriendApply | ❌ | 该版本不支持 |
| 添加群成员为微信好友 | /addFriend/groupMember | ❔ | 待测试 |
| 查询群成员 | /groupMember/list | ✔️ | 已测试 |
| 邀请群成员 | /groupMember/invite | ❔ | 待测试 |
| 删除群成员 | /groupMember/delete | ❔ | 待测试 |
| 查询朋友圈 | /friendCircle | ❔ | 待测试 |
| 接收转账 | /receiveTransfer | ❌ | 该版本不支持 |
| 接口名 | 地址 | 是否支持 | 备注 |
|--------------|------------------------|------|--------|
| 查询登录状态 | /loginStatus | ✔️ | 已测试 |
| 获取登录微信 | /loginWeChatUid | ✔️ | 已测试 |
| 获取登录微信信息 | /loginWeChatInfo | ✔️ | 已测试 |
| 获取消息类型列表 | /list/msgType | ✔️ | 已测试 |
| 获取联系人列表 | /list/contacts | ✔️ | 已测试 |
| 获取数据库表名称列表 | /list/dbTableName | ✔️ | 已测试 |
| 获取指定数据库中的表列表 | /list/dbTable | ✔️ | 已测试 |
| 执行数据库查询SQL | /exec/dbQuerySql | ✔️ | 已测试 |
| 发送消息汇总入口 | /send/msgMaster | ❌ | 预留 |
| 发送文本消息 | /send/textMsg | ✔️ | 已测试 |
| 发送富文本消息 | /send/richTextMsg | ❌ | 该版本不支持 |
| 发送XML消息 | /send/xmlMsg | ❌ | 该版本不支持 |
| 发送图片消息 | /send/imageMsg | ✔️ | 已测试 |
| 发送表情消息 | /send/emojiMsg | ✔️ | 已测试 |
| 发送文件消息 | /send/fileMsg | ✔️ | 已测试 |
| 拍一拍群友 | /patOnePat | ✔️ | 已测试 |
| 撤回消息 | /revokeMsg | ❌ | 该版本不支持 |
| 通过好友申请 | /passFriendApply | ❌ | 该版本不支持 |
| 添加群成员为微信好友 | /addFriend/groupMember | ❔ | 待测试 |
| 查询群成员 | /groupMember/list | ✔️ | 已测试 |
| 邀请群成员 | /groupMember/invite | ❔ | 待测试 |
| 删除群成员 | /groupMember/delete | ❔ | 待测试 |
| 查询朋友圈 | /friendCircle | ❔ | 待测试 |
| 接收转账 | /receiveTransfer | ❌ | 该版本不支持 |
### 提示

View File

@ -72,7 +72,7 @@ public class WeChatDllController {
return TResponse.ok(ResponseCodeEnum.SUCCESS, status);
}
@ApiOperation(value = "获取登录微信内部识别UID", notes = "queryLoginWeChatUid")
@ApiOperation(value = "获取登录微信", notes = "queryLoginWeChatUid")
@PostMapping(value = "/loginWeChatUid")
public TResponse<Object> queryLoginWeChatUid() {
String weChatUid = weChatDllService.queryLoginWeChatUid();
@ -186,6 +186,7 @@ public class WeChatDllController {
@ApiOperation(value = "撤回消息", notes = "revokeMsg")
@PostMapping(value = "/revokeMsg")
public TResponse<Object> revokeMsg(@Validated @RequestBody WxPpWcfRevokeMsgReq request) {
weChatDllService.revokeMsg(request);
return TResponse.ok(ResponseCodeEnum.SUCCESS);
}
@ -246,7 +247,7 @@ public class WeChatDllController {
@ApiOperation(value = "查询朋友圈", notes = "queryFriendCircle")
@PostMapping(value = "/friendCircle")
public TResponse<Object> queryFriendCircle() {
weChatDllService.queryFriendCircle();
weChatDllService.queryFriendCircle(0);
return TResponse.ok(ResponseCodeEnum.SUCCESS);
}

View File

@ -17,23 +17,22 @@ import lombok.Data;
public class WxPpWcfPassFriendApplyReq {
/**
* 申请人
* 加密用户名
* v3 xml.attrib["encryptusername"]
* 加密用户名 (好友申请消息里 v3 开头的字符串)
*/
@NotBlank(message = "申请人不能为空")
@ApiModelProperty(value = "申请人")
private String applicant;
@NotBlank(message = "加密用户名不能为空")
@ApiModelProperty(value = "加密用户名")
private String encryptUsername;
/**
* 审核人
* ticket
* v4 xml.attrib["ticket"]
* Ticket (好友申请消息里 v4 开头的字符串)
* 一般指自己别人申请添加自己审核是否通过
*/
@NotBlank(message = "审核人不能为空")
@ApiModelProperty(value = "审核人")
private String reviewer;
@NotBlank(message = "ticket不能为空")
@ApiModelProperty(value = "ticket")
private String ticket;
/**
* 场景

View File

@ -19,7 +19,7 @@ public class WxPpWcfRevokeMsgReq {
/**
* 消息编号
*/
@ApiModelProperty(value = "场景")
@ApiModelProperty(value = "消息编号")
private String msgId;
}

View File

@ -16,14 +16,6 @@ import lombok.Data;
@ApiModel(value = "wxPpWcfSendEmojiMsgReq", description = "个微WCF发送表情消息请求入参")
public class WxPpWcfSendEmojiMsgReq {
/**
* 资源路径-本地表情路径
* 需要确保图片路径正确建议使用绝对路径使用双斜杠\\
*/
@NotBlank(message = "资源路径不能为空")
@ApiModelProperty(value = "资源路径-本地表情路径")
private String resourcePath;
/**
* 消息接收人
* 消息接收人私聊为 wxidwxid_xxxxxxxxxxxxxx
@ -33,4 +25,12 @@ public class WxPpWcfSendEmojiMsgReq {
@ApiModelProperty(value = "消息接收人")
private String recipient;
/**
* 资源路径-本地表情路径
* 需要确保图片路径正确建议使用绝对路径使用双斜杠\\
*/
@NotBlank(message = "资源路径不能为空")
@ApiModelProperty(value = "资源路径-本地表情路径")
private String resourcePath;
}

View File

@ -16,13 +16,6 @@ import lombok.Data;
@ApiModel(value = "wxPpWcfSendFileMsgReq", description = "个微WCF发送文件消息请求入参")
public class WxPpWcfSendFileMsgReq {
/**
* 资源路径-本地文件路径
*/
@NotBlank(message = "资源路径不能为空")
@ApiModelProperty(value = "资源路径-本地文件路径")
private String resourcePath;
/**
* 消息接收人
* 消息接收人私聊为 wxidwxid_xxxxxxxxxxxxxx
@ -32,4 +25,11 @@ public class WxPpWcfSendFileMsgReq {
@ApiModelProperty(value = "消息接收人")
private String recipient;
/**
* 资源路径-本地文件路径
*/
@NotBlank(message = "资源路径不能为空")
@ApiModelProperty(value = "资源路径-本地文件路径")
private String resourcePath;
}

View File

@ -16,6 +16,15 @@ import lombok.Data;
@ApiModel(value = "wxPpWcfSendImageMsgReq", description = "个微WCF发送图片消息请求入参")
public class WxPpWcfSendImageMsgReq {
/**
* 消息接收人
* 消息接收人私聊为 wxidwxid_xxxxxxxxxxxxxx
* 群聊为 roomidxxxxxxxxxx@chatroom
*/
@NotBlank(message = "消息接收人不能为空")
@ApiModelProperty(value = "消息接收人")
private String recipient;
/**
* 资源路径-本地图片地址
* 需要确保图片路径正确建议使用绝对路径使用双斜杠\\
@ -26,13 +35,4 @@ public class WxPpWcfSendImageMsgReq {
@ApiModelProperty(value = "资源路径-本地图片地址")
private String resourcePath;
/**
* 消息接收人
* 消息接收人私聊为 wxidwxid_xxxxxxxxxxxxxx
* 群聊为 roomidxxxxxxxxxx@chatroom
*/
@NotBlank(message = "消息接收人不能为空")
@ApiModelProperty(value = "消息接收人")
private String recipient;
}

View File

@ -18,15 +18,6 @@ import lombok.Data;
@ApiModel(value = "wxPpWcfSendTextMsgReq", description = "个微WCF发送文本消息请求入参")
public class WxPpWcfSendTextMsgReq {
/**
* 消息文本
* 消息内容如果是 @ 消息则需要有跟 @ 的人数量相同的 @
* 换行使用 `\\\\n` 单杠
*/
@NotBlank(message = "消息文本不能为空")
@ApiModelProperty(value = "消息文本")
private String msgText;
/**
* 消息接收人
* 消息接收人私聊为 wxidwxid_xxxxxxxxxxxxxx
@ -36,6 +27,15 @@ public class WxPpWcfSendTextMsgReq {
@ApiModelProperty(value = "消息接收人")
private String recipient;
/**
* 消息文本
* 消息内容如果是 @ 消息则需要有跟 @ 的人数量相同的 @
* 换行使用 `\\\\n` 单杠
*/
@NotBlank(message = "消息文本不能为空")
@ApiModelProperty(value = "消息文本")
private String msgText;
/**
* 要艾特的用户
* 群聊时要 @ 的人私聊时为空字符串多个用逗号分隔

View File

@ -21,7 +21,7 @@ public class WxPpWcfDatabaseTableResp {
private String tableName;
/**
* SQL
* 该数据库下的所有表名及对应建表语句
*/
@ApiModelProperty(value = "SQL")
private String sql;

View File

@ -4,6 +4,7 @@ import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ArrayBlockingQueue;
@ -16,9 +17,9 @@ import com.alibaba.fastjson2.JSONObject;
import com.google.protobuf.ByteString;
import com.sun.jna.Native;
import com.wechat.ferry.entity.dto.WxPpMsgDTO;
import com.wechat.ferry.entity.proto.Wcf;
import com.wechat.ferry.entity.proto.Wcf.DbQuery;
import com.wechat.ferry.entity.proto.Wcf.DbRow;
import com.wechat.ferry.entity.proto.Wcf.DecPath;
import com.wechat.ferry.entity.proto.Wcf.Functions;
import com.wechat.ferry.entity.proto.Wcf.Request;
import com.wechat.ferry.entity.proto.Wcf.Response;
@ -60,7 +61,7 @@ public class WeChatSocketClient {
private Socket msgSocket = null;
/**
* 是否消息
* 是否已启动接收消息
*/
private boolean isReceivingMsg = false;
@ -171,6 +172,21 @@ public class WeChatSocketClient {
}
/**
* 获取登录二维码已经登录则返回空字符串
*
* @return 是否登录结果
*/
public Response getQrcode() {
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_REFRESH_QRCODE_VALUE).build();
Response rsp = sendCmd(req);
if (rsp != null) {
return rsp;
}
return null;
}
/**
* 是否已经登录
* 当前微信客户端是否登录微信号
*
* @return 是否登录结果
@ -185,9 +201,309 @@ public class WeChatSocketClient {
}
/**
* 获取sql执行结果
* 获取登录账户的wxid
*
* @return 自己的微信号
*/
public String getSelfWxId() {
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_GET_SELF_WXID_VALUE).build();
Response rsp = sendCmd(req);
if (rsp != null) {
return rsp.getStr();
}
return "";
}
/**
* 获取所有消息类型
*
* @return 消息类型集合
*/
public Map<Integer, String> getMsgTypes() {
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_GET_MSG_TYPES_VALUE).build();
Response rsp = sendCmd(req);
if (rsp != null) {
return rsp.getTypes().getTypesMap();
}
return Wcf.MsgTypes.newBuilder().build().getTypesMap();
}
/**
* 获取完整通讯录
* "fmessage": "朋友推荐消息",
* "medianote": "语音记事本",
* "floatbottle": "漂流瓶",
* "filehelper": "文件传输助手",
* "newsapp": "新闻",
*
* @return 联系人列表
*/
public List<Wcf.RpcContact> getContacts() {
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_GET_CONTACTS_VALUE).build();
Response rsp = sendCmd(req);
if (rsp != null) {
return rsp.getContacts().getContactsList();
}
return Wcf.RpcContacts.newBuilder().build().getContactsList();
}
/**
* 获取所有数据库
*
* @return
*/
public List<String> getDbNames() {
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_GET_DB_NAMES_VALUE).build();
Response rsp = sendCmd(req);
if (rsp != null) {
return rsp.getDbs().getNamesList();
}
return Wcf.DbNames.newBuilder().build().getNamesList();
}
/**
* 获取 db 中所有表
*
* @param db 数据库名
* @return 该数据库下的所有表名及对应建表语句
*/
public Map<String, String> getDbTables(String db) {
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_GET_DB_TABLES_VALUE).setStr(db).build();
Response rsp = sendCmd(req);
Map<String, String> tables = new LinkedHashMap<>();
if (rsp != null) {
for (Wcf.DbTable tbl : rsp.getTables().getTablesList()) {
tables.put(tbl.getName(), tbl.getSql());
}
}
return tables;
}
/**
* 获取登录账号个人信息
*
* @return 个人信息
*/
public Wcf.UserInfo getUserInfo() {
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_GET_USER_INFO_VALUE).build();
Response rsp = sendCmd(req);
if (rsp != null) {
return rsp.getUi();
}
return null;
}
/**
* 获取语音消息并转成 MP3
*
* @param id 语音消息 id
* @param dir MP3 保存目录目录不存在会出错
* @param timeout MP3 超时时间
* @return 成功返回存储路径空字符串为失败原因见日志
*/
public String getAudioMsg(Integer id, String dir, Integer timeout) {
Wcf.AudioMsg audioMsg = Wcf.AudioMsg.newBuilder().setId(id).setDir(dir).build();
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_GET_AUDIO_MSG_VALUE).setAm(audioMsg).build();
Response rsp = sendCmd(req);
if (rsp != null) {
return rsp.getStr();
}
return null;
}
/**
* 发送文本消息
*
* @param msg: 消息内容如果是 @ 消息则需要有跟 @ 的人数量相同的 @
* @param receiver: 消息接收人私聊为 wxidwxid_xxxxxxxxxxxxxx群聊为
* roomidxxxxxxxxxx@chatroom
* @param aters: 群聊时要 @ 的人私聊时为空字符串多个用逗号分隔@所有人
* notify@all必须是群主或者管理员才有权限
* @return int 0 为成功其他失败
* @author Changhua
* @example sendText(" Hello @ 某人1 @ 某人2 ", " xxxxxxxx @ chatroom ",
* "wxid_xxxxxxxxxxxxx1,wxid_xxxxxxxxxxxxx2");
**/
public int sendText(String msg, String receiver, String aters) {
Wcf.TextMsg textMsg = Wcf.TextMsg.newBuilder().setMsg(msg).setReceiver(receiver).setAters(aters).build();
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_SEND_TXT_VALUE).setTxt(textMsg).build();
log.debug("sendText: {}", bytesToHex(req.toByteArray()));
Response rsp = sendCmd(req);
int ret = -1;
if (rsp != null) {
ret = rsp.getStatus();
}
return ret;
}
/**
* 发送图片消息
*
* @param path 图片地址,`C:/Projs/WeChatRobot/TEQuant.jpeg`
* `https://raw.githubusercontent.com/lich0821/WeChatFerry/master/assets/TEQuant.jpg`
* @param receiver 消息接收人wxid 或者 roomid
* @return 发送结果状态码 0 为成功其他失败
*/
public int sendImage(String path, String receiver) {
Wcf.PathMsg pathMsg = Wcf.PathMsg.newBuilder().setPath(path).setReceiver(receiver).build();
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_SEND_IMG_VALUE).setFile(pathMsg).build();
log.debug("sendImage: {}", bytesToHex(req.toByteArray()));
Response rsp = sendCmd(req);
int ret = -1;
if (rsp != null) {
ret = rsp.getStatus();
}
return ret;
}
/**
* 发送文件消息
*
* @param path 本地文件路径`C:/Projs/WeChatRobot/README.MD`
* `https://raw.githubusercontent.com/lich0821/WeChatFerry/master/README.MD`
* @param receiver 消息接收人wxid 或者 roomid
* @return 发送结果状态码 0 为成功其他失败
*/
public int sendFile(String path, String receiver) {
Wcf.PathMsg pathMsg = Wcf.PathMsg.newBuilder().setPath(path).setReceiver(receiver).build();
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_SEND_FILE_VALUE).setFile(pathMsg).build();
log.debug("sendFile: {}", bytesToHex(req.toByteArray()));
Response rsp = sendCmd(req);
int ret = -1;
if (rsp != null) {
ret = rsp.getStatus();
}
return ret;
}
/**
* 发送Xml消息
*
* @param receiver 消息接收人wxid 或者 roomid
* @param xml xml内容
* @param path 封面图片路径
* @param type xml 类型0x21 为小程序
* @return 发送结果状态码 0 为成功其他失败
*/
public int sendXml(String receiver, String xml, String path, int type) {
Wcf.XmlMsg xmlMsg = Wcf.XmlMsg.newBuilder().setContent(xml).setReceiver(receiver).setPath(path).setType(type).build();
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_SEND_XML_VALUE).setXml(xmlMsg).build();
log.debug("sendXml: {}", bytesToHex(req.toByteArray()));
Response rsp = sendCmd(req);
int ret = -1;
if (rsp != null) {
ret = rsp.getStatus();
}
return ret;
}
/**
* 发送表情消息
*
* @param path 本地表情路径`C:/Projs/WeChatRobot/emo.gif`
* @param receiver 消息接收人wxid 或者 roomid
* @return 发送结果状态码 0 为成功其他失败
*/
public int sendEmotion(String path, String receiver) {
Wcf.PathMsg pathMsg = Wcf.PathMsg.newBuilder().setPath(path).setReceiver(receiver).build();
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_SEND_EMOTION_VALUE).setFile(pathMsg).build();
log.debug("sendEmotion: {}", bytesToHex(req.toByteArray()));
Response rsp = sendCmd(req);
int ret = -1;
if (rsp != null) {
ret = rsp.getStatus();
}
return ret;
}
/**
* 发送富文本消息
*
* @param name 左下显示的名字
* @param account 填公众号 id 可以显示对应的头像gh_ 开头的
* @param title 标题最多两行
* @param digest 摘要三行
* @param url 点击后跳转的链接
* @param thumbUrl 缩略图的链接
* @param receiver 接收人, wxid 或者 roomid
* @return 发送结果状态码 0 为成功其他失败
*
* @example 卡片样式
* |-------------------------------------|
* |title, 最长两行
* |(长标题, 标题短的话这行没有)
* |digest, 最多三行会占位 |--------|
* |digest, 最多三行会占位 |thumbUrl|
* |digest, 最多三行会占位 |--------|
* |(account logo) name
* |-------------------------------------|
*/
public int sendRichText(String name, String account, String title, String digest, String url, String thumbUrl, String receiver) {
Wcf.RichText richTextMsg = Wcf.RichText.newBuilder().setName(name).setAccount(account).setTitle(title).setDigest(digest).setUrl(url)
.setThumburl(thumbUrl).setReceiver(receiver).build();
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_SEND_RICH_TXT_VALUE).setRt(richTextMsg).build();
log.debug("sendRichText: {}", bytesToHex(req.toByteArray()));
Response rsp = sendCmd(req);
int ret = -1;
if (rsp != null) {
ret = rsp.getStatus();
}
return ret;
}
/**
* 拍一拍群友
*
* @param roomid id
* @param wxid 要拍的群友的 wxid
* @return 发送结果状态码 0 为成功其他失败
*/
public int sendPatMsg(String roomid, String wxid) {
Wcf.PatMsg patMsg = Wcf.PatMsg.newBuilder().setRoomid(roomid).setWxid(wxid).build();
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_SEND_PAT_MSG_VALUE).setPm(patMsg).build();
log.debug("sendPatMsg: {}", bytesToHex(req.toByteArray()));
Response rsp = sendCmd(req);
int ret = -1;
if (rsp != null) {
// 接口中 1 为成功其他失败
ret = rsp.getStatus();
if (ret == 1) {
// 转为通用值
ret = 0;
}
}
return ret;
}
/**
* 转发消息可以转发文本图片表情甚至各种 XML
* 语音也行不过效果嘛自己验证吧
*
* @param id 待转发消息的 id
* @param receiver 消息接收者wxid 或者 roomid
* @return 结果状态码 0 为成功其他失败
*/
public int forwardMsg(Integer id, String receiver) {
Wcf.ForwardMsg forwardMsg = Wcf.ForwardMsg.newBuilder().setId(id).setReceiver(receiver).build();
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_FORWARD_MSG_VALUE).setFm(forwardMsg).build();
log.debug("forwardMsg: {}", bytesToHex(req.toByteArray()));
Response rsp = sendCmd(req);
int ret = -1;
if (rsp != null) {
// 接口中 1 为成功其他失败
ret = rsp.getStatus();
if (ret == 1) {
// 转为通用值
ret = 0;
}
}
return ret;
}
/**
* 获取sql执行结果
*
* @param db 数据库名,要查询的数据库
* @param sql 执行的sql语句
* @return 数据记录列表
*/
@ -202,23 +518,241 @@ public class WeChatSocketClient {
}
/**
* 解密图片
* 通过好友申请
*
* @param srcPath 加密的图片路径
* @param dstPath 解密的图片路径
* @return 是否成功
* @param v3 加密用户名 (好友申请消息里 v3 开头的字符串) xml.attrib["encryptusername"]
* @param v4 Ticket (好友申请消息里 v4 开头的字符串) xml.attrib["ticket"]
* @param scene 申请方式 (好友申请消息里的 scene); 为了兼容旧接口默认为扫码添加 (30)
* @return 结果状态码 0 为成功其他失败
*/
public boolean decryptImage(String srcPath, String dstPath) {
public int acceptNewFriend(String v3, String v4, Integer scene) {
if (ObjectUtils.isEmpty(scene)) {
scene = 30;
}
int ret = -1;
DecPath build = DecPath.newBuilder().setSrc(srcPath).setDst(dstPath).build();
Wcf.Verification verification = Wcf.Verification.newBuilder().setV3(v3).setV4(v4).setScene(scene).build();
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_ACCEPT_FRIEND_VALUE).setV(verification).build();
Response rsp = sendCmd(req);
if (rsp != null) {
// 接口中 1 为成功其他失败
ret = rsp.getStatus();
if (ret == 1) {
// 转为通用值
ret = 0;
}
}
return ret;
}
/**
* 接收转账
*
* @param wxid 转账消息里的发送人 wxid
* @param transferid 转账消息里的 transferid
* @param transactionid 转账消息里的 transactionid
* @return 结果状态码 0 为成功其他失败
*/
public int receiveTransfer(String wxid, String transferid, String transactionid) {
int ret = -1;
Wcf.Transfer transfer = Wcf.Transfer.newBuilder().setWxid(wxid).setTfid(transferid).setTaid(transactionid).build();
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_RECV_TRANSFER_VALUE).setTf(transfer).build();
Response rsp = sendCmd(req);
if (rsp != null) {
// 接口中 1 为成功其他失败
ret = rsp.getStatus();
if (ret == 1) {
// 转为通用值
ret = 0;
}
}
return ret;
}
/**
* 刷新朋友圈
*
* @param id 开始 id0 为最新页
* @return 结果状态码 0 为成功其他失败
*/
public int refreshPyq(Integer id) {
int ret = -1;
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_REFRESH_PYQ_VALUE).setUi64(id).build();
Response rsp = sendCmd(req);
if (rsp != null) {
// 接口中 1 为成功其他失败
ret = rsp.getStatus();
if (ret == 1) {
// 转为通用值
ret = 0;
}
}
return ret;
}
/**
* 下载附件图片视频文件这方法别直接调用下载图片使用 `download_image`
*
* @param id 消息中 id
* @param thumb 消息中的 thumb
* @param extra 消息中的 extra
* @return 结果状态码 0 为成功其他失败
*/
public int downloadAttach(Integer id, String thumb, String extra) {
int ret = -1;
Wcf.AttachMsg attachMsg = Wcf.AttachMsg.newBuilder().setId(id).setThumb(thumb).setExtra(extra).build();
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_DOWNLOAD_ATTACH_VALUE).setAtt(attachMsg).build();
Response rsp = sendCmd(req);
if (rsp != null) {
// 接口中 1 为成功其他失败
ret = rsp.getStatus();
if (ret == 1) {
// 转为通用值
ret = 0;
}
}
return ret;
}
/**
* 通过 wxid 查询微信号昵称等信息
*
* @param wxid 联系人 wxid
* @return 结果信息
*/
public Wcf.RpcContact getInfoByWxId(String wxid) {
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_GET_CONTACT_INFO_VALUE).setStr(wxid).build();
Response rsp = sendCmd(req);
if (rsp != null && !ObjectUtils.isEmpty(rsp.getContacts())) {
return rsp.getContacts().getContacts(0);
}
return null;
}
/**
* 撤回消息
*
* @param id 待撤回消息的 id
* @return 结果状态码 0 为成功其他失败
*/
public int revokeMsg(Integer id) {
int ret = -1;
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_REVOKE_MSG_VALUE).setUi64(id).build();
Response rsp = sendCmd(req);
if (rsp != null) {
// 接口中 1 为成功其他失败
ret = rsp.getStatus();
if (ret == 1) {
// 转为通用值
ret = 0;
}
}
return ret;
}
/**
* 解密图片这方法别直接调用下载图片使用 `download_image`
*
* @param src 加密的图片路径
* @param dir 保存图片的目录
* @return 解密图片的保存路径
*/
public String decryptImage(String src, String dir) {
Wcf.DecPath build = Wcf.DecPath.newBuilder().setSrc(src).setDst(dir).build();
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_DECRYPT_IMAGE_VALUE).setDec(build).build();
Response rsp = sendCmd(req);
if (rsp != null) {
ret = rsp.getStatus();
return rsp.getStr();
}
return ret == 1;
return "";
}
/**
* 获取 OCR 结果鸡肋需要图片能自动下载通过下载接口下载的图片无法识别
*
* @param extra 待识别的图片路径消息里的 extra
* @return OCR 结果
*/
public Wcf.OcrMsg getOcrResult(String extra, Integer timeout) {
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_EXEC_OCR_VALUE).setStr(extra).build();
Response rsp = sendCmd(req);
if (rsp != null) {
return rsp.getOcr();
}
return null;
}
/**
* 添加群成员
*
* @param roomid 待加群的 id
* @param wxids 要加到群里的 wxid多个用逗号分隔
* @return 结果状态码 0 为成功其他失败
*/
public int addChatroomMembers(String roomid, String wxids) {
int ret = -1;
Wcf.MemberMgmt memberMgmt = Wcf.MemberMgmt.newBuilder().setRoomid(roomid).setWxids(wxids).build();
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_ADD_ROOM_MEMBERS_VALUE).setM(memberMgmt).build();
Response rsp = sendCmd(req);
if (rsp != null) {
// 接口中 1 为成功其他失败
ret = rsp.getStatus();
if (ret == 1) {
// 转为通用值
ret = 0;
}
}
return ret;
}
/**
* 删除群成员
*
* @param roomid 群的 id
* @param wxids 要删除成员的 wxid多个用逗号分隔
* @return 结果状态码 0 为成功其他失败
*/
public int delChatroomMembers(String roomid, String wxids) {
int ret = -1;
Wcf.MemberMgmt memberMgmt = Wcf.MemberMgmt.newBuilder().setRoomid(roomid).setWxids(wxids).build();
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_DEL_ROOM_MEMBERS_VALUE).setM(memberMgmt).build();
Response rsp = sendCmd(req);
if (rsp != null) {
// 接口中 1 为成功其他失败
ret = rsp.getStatus();
if (ret == 1) {
// 转为通用值
ret = 0;
}
}
return ret;
}
/**
* 邀请群成员
*
* @param roomid 群的 id
* @param wxids 要邀请成员的 wxid, 多个用逗号`,`分隔
* @return 结果状态码 0 为成功其他失败
*/
public int inviteChatroomMembers(String roomid, String wxids) {
int ret = -1;
Wcf.MemberMgmt memberMgmt = Wcf.MemberMgmt.newBuilder().setRoomid(roomid).setWxids(wxids).build();
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_INV_ROOM_MEMBERS_VALUE).setM(memberMgmt).build();
Response rsp = sendCmd(req);
if (rsp != null) {
// 接口中 1 为成功其他失败
ret = rsp.getStatus();
if (ret == 1) {
// 转为通用值
ret = 0;
}
}
return ret;
}
/**
* 是否已启动接收消息功能
*/
public boolean getIsReceivingMsg() {
return isReceivingMsg;
}
@ -249,11 +783,13 @@ public class WeChatSocketClient {
return false;
}
/**
* 允许接收消息
*/
public void enableRecvMsg(int qSize) {
if (isReceivingMsg) {
return;
}
Request req = Request.newBuilder().setFuncValue(Functions.FUNC_ENABLE_RECV_TXT_VALUE).build();
Response rsp = sendCmd(req);
if (rsp == null) {
@ -269,6 +805,9 @@ public class WeChatSocketClient {
thread.start();
}
/**
* 停止接收消息
*/
public int diableRecvMsg() {
if (!isReceivingMsg) {
return 1;
@ -281,7 +820,6 @@ public class WeChatSocketClient {
if (ret == 0) {
isReceivingMsg = false;
}
}
return ret;
}

View File

@ -44,14 +44,14 @@ public interface WeChatDllService {
* 当前微信客户端是否登录微信号
*
* @return true-已登录 false-未登录
*
*
* @author chandler
* @date 2024-10-01 21:20
*/
Boolean loginStatus();
/**
* 获取登录微信内部识别UID
* 获取登录微信
* 获得微信客户端登录的微信ID
*
* @return 微信内部识别号UID
@ -112,17 +112,40 @@ public interface WeChatDllService {
*/
List<WxPpWcfDatabaseTableResp> queryDbTableList(WxPpWcfDatabaseTableReq request);
/**
* 获取指定数据库中的所有表
*
* @param databaseName 数据库名称
* @return 数据库记录
*
* @author chandler
* @date 2025-05-04 13:25
*/
List<WxPpWcfDatabaseTableResp> queryDbTableList(String databaseName);
/**
* 执行数据库查询SQL
*
*
* @param request 请求入参
* @return 数据库记录
*
*
* @author chandler
* @date 2024-10-02 17:52
*/
List<WxPpWcfDatabaseRowResp> execDbQuerySql(WxPpWcfDatabaseSqlReq request);
/**
* 执行数据库查询SQL
*
* @param databaseName 数据库名称
* @param sqlText SQL语句
* @return 数据库记录
*
* @author chandler
* @date 2025-05-04 13:26
*/
List<WxPpWcfDatabaseRowResp> execDbQuerySql(String databaseName, String sqlText);
/**
* 发送文本消息 @
*
@ -136,6 +159,20 @@ public interface WeChatDllService {
*/
WxPpWcfSendTextMsgResp sendTextMsg(WxPpWcfSendTextMsgReq request);
/**
* 发送文本消息 @
*
* @param recipient 消息接收人
* @param msgText 消息文本
* @param atUsers 要艾特的用户
* @param isAtAll 是否艾特全体,默认为false
* @return 消息发送返回
*
* @author chandler
* @date 2025-05-04 13:27
*/
WxPpWcfSendTextMsgResp sendTextMsg(String recipient, String msgText, List<String> atUsers, Boolean isAtAll);
/**
* 发送富文本消息
*
@ -147,6 +184,24 @@ public interface WeChatDllService {
*/
WxPpWcfSendRichTextMsgResp sendRichTextMsg(WxPpWcfSendRichTextMsgReq request);
/**
* 发送富文本消息
*
* @param recipient 消息接收人
* @param name 左下显示的名字
* @param account 资源路径-封面图片路径
* @param title 标题最多两行
* @param digest 摘要三行
* @param jumpUrl 点击后跳转的链接
* @param thumbnailUrl 缩略图的链接
* @return 消息发送返回
*
* @author chandler
* @date 2025-05-04 13:28
*/
WxPpWcfSendRichTextMsgResp sendRichTextMsg(String recipient, String name, String account, String title, String digest, String jumpUrl,
String thumbnailUrl);
/**
* 发送XML消息
*
@ -158,6 +213,20 @@ public interface WeChatDllService {
*/
WxPpWcfSendXmlMsgResp sendXmlMsg(WxPpWcfSendXmlMsgReq request);
/**
* 发送XML消息
*
* @param recipient 消息接收人
* @param xmlContent XML报文内容
* @param resourcePath 资源路径-封面图片路径
* @param xmlType XML类型21 为小程序
* @return 消息发送返回
*
* @author chandler
* @date 2025-05-04 13:32
*/
WxPpWcfSendXmlMsgResp sendXmlMsg(String recipient, String xmlContent, String resourcePath, String xmlType);
/**
* 发送图片消息
*
@ -169,6 +238,18 @@ public interface WeChatDllService {
*/
WxPpWcfSendImageMsgResp sendImageMsg(WxPpWcfSendImageMsgReq request);
/**
* 发送图片消息
*
* @param recipient 消息接收人
* @param resourcePath 资源路径-本地图片地址
* @return 消息发送返回
*
* @author chandler
* @date 2025-05-04 13:34
*/
WxPpWcfSendImageMsgResp sendImageMsg(String recipient, String resourcePath);
/**
* 发送表情消息
*
@ -180,6 +261,17 @@ public interface WeChatDllService {
*/
WxPpWcfSendEmojiMsgResp sendEmojiMsg(WxPpWcfSendEmojiMsgReq request);
/**
* 发送表情消息
*
* @param recipient 消息接收人
* @param resourcePath 资源路径-本地图片地址
*
* @author chandler
* @date 2025-05-04 13:36
*/
WxPpWcfSendEmojiMsgResp sendEmojiMsg(String recipient, String resourcePath);
/**
* 发送文件消息
*
@ -191,6 +283,17 @@ public interface WeChatDllService {
*/
WxPpWcfSendFileMsgResp sendFileMsg(WxPpWcfSendFileMsgReq request);
/**
* 发送文件消息
*
* @param recipient 消息接收人
* @param resourcePath 资源路径-本地图片地址
*
* @author chandler
* @date 2025-05-04 13:37
*/
WxPpWcfSendFileMsgResp sendFileMsg(String recipient, String resourcePath);
/**
* 拍一拍
*
@ -202,9 +305,21 @@ public interface WeChatDllService {
*/
WxPpWcfSendPatOnePatMsgResp patOnePat(WxPpWcfPatOnePatMsgReq request);
/**
* 拍一拍
*
* @param recipient 消息接收人
* @param patUser 要拍的人的wxid
*
* @author chandler
* @date 2025-05-04 13:39
*/
WxPpWcfSendPatOnePatMsgResp patOnePat(String recipient, String patUser);
/**
* 撤回消息
*
* @param request 请求入参
* @return 结果状态
*
* @author chandler
@ -212,6 +327,17 @@ public interface WeChatDllService {
*/
String revokeMsg(WxPpWcfRevokeMsgReq request);
/**
* 撤回消息
*
* @param msgId 消息编号
* @return 结果状态
*
* @author chandler
* @date 2025-05-04 13:40
*/
String revokeMsg(String msgId);
/**
* 通过好友申请
*
@ -223,6 +349,19 @@ public interface WeChatDllService {
*/
String passFriendApply(WxPpWcfPassFriendApplyReq request);
/**
* 通过好友申请
*
* @param encryptUsername 加密用户名
* @param ticket ticket
* @param scene 场景
* @return 结果状态
*
* @author chandler
* @date 2025-05-04 13:41
*/
String passFriendApply(String encryptUsername, String ticket, String scene);
/**
* 添加群成员为微信好友
*
@ -234,6 +373,18 @@ public interface WeChatDllService {
*/
String addFriendGroupMember(WxPpWcfAddFriendGroupMemberReq request);
/**
* 添加群成员为微信好友
*
* @param groupNo 群编号
* @param groupMembers 待添加的群成员列表
* @return 结果状态
*
* @author chandler
* @date 2025-05-04 13:42
*/
String addFriendGroupMember(String groupNo, List<String> groupMembers);
/**
* 查询群成员列表
*
@ -245,6 +396,17 @@ public interface WeChatDllService {
*/
List<WxPpWcfGroupMemberResp> queryGroupMemberList(WxPpWcfGroupMemberReq request);
/**
* 查询群成员列表
*
* @param groupNo 群编号
* @return 数据库记录
*
* @author chandler
* @date 2025-05-04 13:43
*/
List<WxPpWcfGroupMemberResp> queryGroupMemberList(String groupNo);
/**
* 邀请群成员
*
@ -256,6 +418,18 @@ public interface WeChatDllService {
*/
String inviteGroupMember(WxPpWcfInviteGroupMemberReq request);
/**
* 邀请群成员
*
* @param groupNo 群编号
* @param groupMembers 待添加的群成员列表
* @return 结果状态
*
* @author chandler
* @date 2025-05-04 13:45
*/
String inviteGroupMember(String groupNo, List<String> groupMembers);
/**
* 删除群成员
*
@ -267,6 +441,18 @@ public interface WeChatDllService {
*/
String deleteGroupMember(WxPpWcfDeleteGroupMemberReq request);
/**
* 删除群成员
*
* @param groupNo 群编号
* @param groupMembers 待添加的群成员列表
* @return 结果状态
*
* @author chandler
* @date 2025-05-04 13:46
*/
String deleteGroupMember(String groupNo, List<String> groupMembers);
/**
* 查询朋友圈
*
@ -275,7 +461,7 @@ public interface WeChatDllService {
* @author chandler
* @date 2024-12-25 11:11
*/
String queryFriendCircle();
String queryFriendCircle(Integer id);
/**
* 接收转账
@ -288,4 +474,17 @@ public interface WeChatDllService {
*/
String receiveTransfer(WxPpWcfReceiveTransferReq request);
/**
* 接收转账
*
* @param weChatUid 转账人
* @param transferId 转账编号
* @param transactionId 交易编号
* @return 结果状态
*
* @author chandler
* @date 2025-05-04 13:50
*/
String receiveTransfer(String weChatUid, String transferId, String transactionId);
}

View File

@ -81,61 +81,43 @@ public class WeChatDllServiceImpl implements WeChatDllService {
@Override
public Boolean loginStatus() {
long startTime = System.currentTimeMillis();
// 公共校验
checkClientStatus();
Boolean status = wechatSocketClient.isLogin();
long endTime = System.currentTimeMillis();
log.info("[查询]-[登录状态]-耗时:{}msstatus:{}", (endTime - startTime), status);
return status;
return wechatSocketClient.isLogin();
}
@Override
public String queryLoginWeChatUid() {
long startTime = System.currentTimeMillis();
// 公共校验
checkClientStatus();
String weChatUid = "";
Wcf.Request req = Wcf.Request.newBuilder().setFuncValue(Wcf.Functions.FUNC_GET_SELF_WXID_VALUE).build();
Wcf.Response rsp = wechatSocketClient.sendCmd(req);
if (!ObjectUtils.isEmpty(rsp)) {
weChatUid = rsp.getStr();
}
long endTime = System.currentTimeMillis();
log.info("[查询]-[登录微信UID]-耗时:{}ms weChatUid:{}", (endTime - startTime), weChatUid);
return weChatUid;
// FUNC_GET_SELF_WXID_VALUE
return wechatSocketClient.getSelfWxId();
}
@Override
public WxPpWcfLoginInfoResp queryLoginWeChatInfo() {
long startTime = System.currentTimeMillis();
// 公共校验
checkClientStatus();
WxPpWcfLoginInfoResp resp = new WxPpWcfLoginInfoResp();
Wcf.Request req = Wcf.Request.newBuilder().setFuncValue(Wcf.Functions.FUNC_GET_USER_INFO_VALUE).build();
Wcf.Response rsp = wechatSocketClient.sendCmd(req);
if (!ObjectUtils.isEmpty(rsp) && !ObjectUtils.isEmpty(rsp.getUi())) {
Wcf.UserInfo userInfo = rsp.getUi();
// FUNC_GET_USER_INFO_VALUE
Wcf.UserInfo userInfo = wechatSocketClient.getUserInfo();
if (!ObjectUtils.isEmpty(userInfo)) {
resp.setWeChatUid(userInfo.getWxid());
resp.setWeChatNickname(userInfo.getName());
resp.setPhone(userInfo.getMobile());
resp.setHomePath(userInfo.getHome());
}
long endTime = System.currentTimeMillis();
log.info("[查询]-[获取登录微信信息]-耗时:{}ms登录信息:{}", (endTime - startTime), resp);
return resp;
}
@Override
public List<WxPpWcfMsgTypeResp> queryMsgTypeList() {
long startTime = System.currentTimeMillis();
// 公共校验
checkClientStatus();
List<WxPpWcfMsgTypeResp> list = new ArrayList<>();
Wcf.Request req = Wcf.Request.newBuilder().setFuncValue(Wcf.Functions.FUNC_GET_MSG_TYPES_VALUE).build();
Wcf.Response rsp = wechatSocketClient.sendCmd(req);
if (!ObjectUtils.isEmpty(rsp)) {
Map<Integer, String> msgTypeMap = rsp.getTypes().getTypesMap();
// FUNC_GET_MSG_TYPES_VALUE
Map<Integer, String> msgTypeMap = wechatSocketClient.getMsgTypes();
if (!msgTypeMap.isEmpty()) {
WxPpWcfMsgTypeResp resp;
for (Map.Entry<Integer, String> entry : msgTypeMap.entrySet()) {
resp = new WxPpWcfMsgTypeResp();
@ -144,21 +126,17 @@ public class WeChatDllServiceImpl implements WeChatDllService {
list.add(resp);
}
}
long endTime = System.currentTimeMillis();
log.info("[查询]-[所有消息类型]-共查到:{}条,耗时:{}ms", list.size(), (endTime - startTime));
return list;
}
@Override
public List<WxPpWcfContactsResp> queryContactsList() {
long startTime = System.currentTimeMillis();
// 公共校验
checkClientStatus();
List<WxPpWcfContactsResp> list = new ArrayList<>();
Wcf.Request req = Wcf.Request.newBuilder().setFuncValue(Wcf.Functions.FUNC_GET_CONTACTS_VALUE).build();
Wcf.Response rsp = wechatSocketClient.sendCmd(req);
if (!ObjectUtils.isEmpty(rsp) && !ObjectUtils.isEmpty(rsp.getContacts()) && !CollectionUtils.isEmpty(rsp.getContacts().getContactsList())) {
List<Wcf.RpcContact> rpcContactList = rsp.getContacts().getContactsList();
// FUNC_GET_CONTACTS_VALUE
List<Wcf.RpcContact> rpcContactList = wechatSocketClient.getContacts();
if (!CollectionUtils.isEmpty(rpcContactList)) {
for (Wcf.RpcContact rpcContact : rpcContactList) {
WxPpWcfContactsResp vo = new WxPpWcfContactsResp();
vo.setWeChatUid(rpcContact.getWxid());
@ -193,53 +171,45 @@ public class WeChatDllServiceImpl implements WeChatDllService {
list.add(vo);
}
}
long endTime = System.currentTimeMillis();
log.info("[查询]-[联系人]-共查到:{}条,耗时:{}ms", list.size(), (endTime - startTime));
return list;
}
@Override
public List<String> queryDbTableNameList() {
long startTime = System.currentTimeMillis();
// 公共校验
checkClientStatus();
List<String> list = new ArrayList<>();
Wcf.Request req = Wcf.Request.newBuilder().setFuncValue(Wcf.Functions.FUNC_GET_DB_NAMES_VALUE).build();
Wcf.Response rsp = wechatSocketClient.sendCmd(req);
if (!ObjectUtils.isEmpty(rsp) && !ObjectUtils.isEmpty(rsp.getDbs()) && !CollectionUtils.isEmpty(rsp.getDbs().getNamesList())) {
list = rsp.getDbs().getNamesList();
}
long endTime = System.currentTimeMillis();
log.info("[查询]-[数据库名称列表]-共查到:{}条,耗时:{}ms", list.size(), (endTime - startTime));
return list;
// FUNC_GET_DB_NAMES_VALUE
return wechatSocketClient.getDbNames();
}
@Override
public List<WxPpWcfDatabaseTableResp> queryDbTableList(WxPpWcfDatabaseTableReq request) {
long startTime = System.currentTimeMillis();
// 公共校验
checkClientStatus();
log.info("[查询]-[数据库表列表]-request:{}", request);
List<WxPpWcfDatabaseTableResp> list = new ArrayList<>();
Wcf.Request req = Wcf.Request.newBuilder().setFuncValue(Wcf.Functions.FUNC_GET_DB_TABLES_VALUE).setStr(request.getDatabaseName()).build();
Wcf.Response rsp = wechatSocketClient.sendCmd(req);
if (!ObjectUtils.isEmpty(rsp) && !ObjectUtils.isEmpty(rsp.getTables()) && !CollectionUtils.isEmpty(rsp.getTables().getTablesList())) {
// FUNC_GET_DB_TABLES_VALUE
Map<String, String> tableMap = wechatSocketClient.getDbTables(request.getDatabaseName());
if (!tableMap.isEmpty()) {
WxPpWcfDatabaseTableResp resp;
for (Wcf.DbTable tbl : rsp.getTables().getTablesList()) {
for (Map.Entry<String, String> entry : tableMap.entrySet()) {
resp = new WxPpWcfDatabaseTableResp();
resp.setTableName(tbl.getName());
resp.setSql(tbl.getSql());
resp.setTableName(entry.getKey());
resp.setSql(entry.getValue());
list.add(resp);
}
}
long endTime = System.currentTimeMillis();
log.info("[查询]-[数据库表列表]-共查到:{}条,耗时:{}ms", list.size(), (endTime - startTime));
return list;
}
@Override
public List<WxPpWcfDatabaseTableResp> queryDbTableList(String databaseName) {
WxPpWcfDatabaseTableReq request = new WxPpWcfDatabaseTableReq();
request.setDatabaseName(databaseName);
return this.queryDbTableList(request);
}
@Override
public List<WxPpWcfDatabaseRowResp> execDbQuerySql(WxPpWcfDatabaseSqlReq request) {
long startTime = System.currentTimeMillis();
// 公共校验
checkClientStatus();
List<WxPpWcfDatabaseRowResp> list = new ArrayList<>();
@ -266,14 +236,19 @@ public class WeChatDllServiceImpl implements WeChatDllService {
list.add(rowVo);
}
}
long endTime = System.currentTimeMillis();
log.info("[查询]-[执行数据库查询SQL]-共查到:{}条,耗时:{}ms", list.size(), (endTime - startTime));
return list;
}
@Override
public List<WxPpWcfDatabaseRowResp> execDbQuerySql(String databaseName, String sqlText) {
WxPpWcfDatabaseSqlReq request = new WxPpWcfDatabaseSqlReq();
request.setDatabaseName(databaseName);
request.setSqlText(sqlText);
return this.execDbQuerySql(request);
}
@Override
public WxPpWcfSendTextMsgResp sendTextMsg(WxPpWcfSendTextMsgReq request) {
long startTime = System.currentTimeMillis();
// 公共校验
checkClientStatus();
log.info("[发送消息]-[文本消息]-入参打印:{}", request);
@ -287,44 +262,57 @@ public class WeChatDllServiceImpl implements WeChatDllService {
atUser = String.join(",", request.getAtUsers());
}
}
Wcf.TextMsg textMsg = Wcf.TextMsg.newBuilder().setMsg(request.getMsgText()).setReceiver(request.getRecipient()).setAters(atUser).build();
Wcf.Request req = Wcf.Request.newBuilder().setFuncValue(Wcf.Functions.FUNC_SEND_TXT_VALUE).setTxt(textMsg).build();
log.debug("sendText: {}", wechatSocketClient.bytesToHex(req.toByteArray()));
Wcf.Response rsp = wechatSocketClient.sendCmd(req);
// 0 为成功其他失败
int state = judgeWcfCmdState(rsp);
// FUNC_SEND_TXT_VALUE
int state = wechatSocketClient.sendText(request.getMsgText(), request.getRecipient(), atUser);
// 回调处理
String stringJson = JSON.toJSONString(request);
sendMsgCallback(stringJson, state);
long endTime = System.currentTimeMillis();
log.info("[发送消息]-[文本消息]-处理结束,耗时:{}ms", (endTime - startTime));
return null;
}
@Override
public WxPpWcfSendTextMsgResp sendTextMsg(String recipient, String msgText, List<String> atUsers, Boolean isAtAll) {
if (ObjectUtils.isEmpty(isAtAll)) {
isAtAll = false;
}
WxPpWcfSendTextMsgReq request = new WxPpWcfSendTextMsgReq();
request.setRecipient(recipient);
request.setMsgText(msgText);
request.setAtUsers(atUsers);
request.setIsAtAll(isAtAll);
return this.sendTextMsg(request);
}
@Override
public WxPpWcfSendRichTextMsgResp sendRichTextMsg(WxPpWcfSendRichTextMsgReq request) {
long startTime = System.currentTimeMillis();
// 公共校验
checkClientStatus();
log.info("[发送消息]-[富文本消息]-入参打印:{}", request);
Wcf.RichText richTextMsg = Wcf.RichText.newBuilder().setName(request.getName()).setAccount(request.getAccount()).setTitle(request.getTitle())
.setDigest(request.getDigest()).setUrl(request.getJumpUrl()).setThumburl(request.getThumbnailUrl()).setReceiver(request.getRecipient())
.build();
Wcf.Request req = Wcf.Request.newBuilder().setFuncValue(Wcf.Functions.FUNC_SEND_RICH_TXT_VALUE).setRt(richTextMsg).build();
log.debug("sendRichText: {}", wechatSocketClient.bytesToHex(req.toByteArray()));
Wcf.Response rsp = wechatSocketClient.sendCmd(req);
int state = judgeWcfCmdState(rsp);
// FUNC_SEND_RICH_TXT_VALUE
int state = wechatSocketClient.sendRichText(request.getName(), request.getAccount(), request.getTitle(), request.getDigest(),
request.getJumpUrl(), request.getThumbnailUrl(), request.getRecipient());
// 回调处理
String stringJson = JSON.toJSONString(request);
sendMsgCallback(stringJson, state);
long endTime = System.currentTimeMillis();
log.info("[发送消息]-[富文本消息]-处理结束,耗时:{}ms", (endTime - startTime));
return null;
}
@Override
public WxPpWcfSendRichTextMsgResp sendRichTextMsg(String recipient, String name, String account, String title, String digest, String jumpUrl,
String thumbnailUrl) {
WxPpWcfSendRichTextMsgReq request = new WxPpWcfSendRichTextMsgReq();
request.setRecipient(recipient);
request.setName(name);
request.setAccount(account);
request.setTitle(title);
request.setDigest(digest);
request.setJumpUrl(jumpUrl);
request.setThumbnailUrl(thumbnailUrl);
return this.sendRichTextMsg(request);
}
@Override
public WxPpWcfSendXmlMsgResp sendXmlMsg(WxPpWcfSendXmlMsgReq request) {
long startTime = System.currentTimeMillis();
// 公共校验
checkClientStatus();
log.info("[发送消息]-[XML消息]-入参打印:{}", request);
@ -335,132 +323,151 @@ public class WeChatDllServiceImpl implements WeChatDllService {
} else {
xmlType = Integer.parseInt(request.getXmlType());
}
Wcf.XmlMsg xmlMsg = Wcf.XmlMsg.newBuilder().setContent(request.getXmlContent()).setReceiver(request.getRecipient())
.setPath(request.getResourcePath()).setType(xmlType).build();
Wcf.Request req = Wcf.Request.newBuilder().setFuncValue(Wcf.Functions.FUNC_SEND_XML_VALUE).setXml(xmlMsg).build();
log.debug("sendXml: {}", wechatSocketClient.bytesToHex(req.toByteArray()));
Wcf.Response rsp = wechatSocketClient.sendCmd(req);
int state = judgeWcfCmdState(rsp);
// FUNC_SEND_XML_VALUE
int state = wechatSocketClient.sendXml(request.getRecipient(), request.getXmlContent(), request.getResourcePath(), xmlType);
// 回调处理
String stringJson = JSON.toJSONString(request);
sendMsgCallback(stringJson, state);
long endTime = System.currentTimeMillis();
log.info("[发送消息]-[XML消息]-处理结束,耗时:{}ms", (endTime - startTime));
return null;
}
@Override
public WxPpWcfSendXmlMsgResp sendXmlMsg(String recipient, String xmlContent, String resourcePath, String xmlType) {
WxPpWcfSendXmlMsgReq request = new WxPpWcfSendXmlMsgReq();
request.setRecipient(recipient);
request.setXmlContent(xmlContent);
request.setResourcePath(resourcePath);
request.setXmlType(xmlType);
return this.sendXmlMsg(request);
}
@Override
public WxPpWcfSendImageMsgResp sendImageMsg(WxPpWcfSendImageMsgReq request) {
long startTime = System.currentTimeMillis();
// 公共校验
checkClientStatus();
log.info("[发送消息]-[图片消息]-入参打印:{}", request);
WxPpWcfSendImageMsgResp resp = new WxPpWcfSendImageMsgResp();
Wcf.PathMsg pathMsg = Wcf.PathMsg.newBuilder().setPath(request.getResourcePath()).setReceiver(request.getRecipient()).build();
Wcf.Request req = Wcf.Request.newBuilder().setFuncValue(Wcf.Functions.FUNC_SEND_IMG_VALUE).setFile(pathMsg).build();
log.debug("sendImage: {}", wechatSocketClient.bytesToHex(req.toByteArray()));
Wcf.Response rsp = wechatSocketClient.sendCmd(req);
int state = judgeWcfCmdState(rsp);
// FUNC_SEND_IMG_VALUE
int state = wechatSocketClient.sendImage(request.getResourcePath(), request.getRecipient());
// 回调处理
String stringJson = JSON.toJSONString(request);
sendMsgCallback(stringJson, state);
long endTime = System.currentTimeMillis();
log.info("[发送消息]-[图片消息]-处理结束,耗时:{}ms", (endTime - startTime));
return null;
}
@Override
public WxPpWcfSendImageMsgResp sendImageMsg(String recipient, String resourcePath) {
WxPpWcfSendImageMsgReq request = new WxPpWcfSendImageMsgReq();
request.setRecipient(recipient);
request.setResourcePath(resourcePath);
return this.sendImageMsg(request);
}
@Override
public WxPpWcfSendEmojiMsgResp sendEmojiMsg(WxPpWcfSendEmojiMsgReq request) {
long startTime = System.currentTimeMillis();
// 公共校验
checkClientStatus();
log.info("[发送消息]-[表情消息]-入参打印:{}", request);
Wcf.PathMsg pathMsg = Wcf.PathMsg.newBuilder().setPath(request.getResourcePath()).setReceiver(request.getRecipient()).build();
Wcf.Request req = Wcf.Request.newBuilder().setFuncValue(Wcf.Functions.FUNC_SEND_EMOTION_VALUE).setFile(pathMsg).build();
log.debug("sendEmotion: {}", wechatSocketClient.bytesToHex(req.toByteArray()));
Wcf.Response rsp = wechatSocketClient.sendCmd(req);
int state = judgeWcfCmdState(rsp);
// FUNC_SEND_EMOTION_VALUE
int state = wechatSocketClient.sendEmotion(request.getResourcePath(), request.getRecipient());
// 回调处理
String stringJson = JSON.toJSONString(request);
sendMsgCallback(stringJson, state);
long endTime = System.currentTimeMillis();
log.info("[发送消息]-[表情消息]-处理结束,耗时:{}ms", (endTime - startTime));
return null;
}
@Override
public WxPpWcfSendEmojiMsgResp sendEmojiMsg(String recipient, String resourcePath) {
WxPpWcfSendEmojiMsgReq request = new WxPpWcfSendEmojiMsgReq();
request.setRecipient(recipient);
request.setResourcePath(resourcePath);
return this.sendEmojiMsg(request);
}
@Override
public WxPpWcfSendFileMsgResp sendFileMsg(WxPpWcfSendFileMsgReq request) {
long startTime = System.currentTimeMillis();
// 公共校验
checkClientStatus();
log.info("[发送消息]-[文件消息]-入参打印:{}", request);
Wcf.PathMsg pathMsg = Wcf.PathMsg.newBuilder().setPath(request.getResourcePath()).setReceiver(request.getRecipient()).build();
Wcf.Request req = Wcf.Request.newBuilder().setFuncValue(Wcf.Functions.FUNC_SEND_FILE_VALUE).setFile(pathMsg).build();
log.debug("sendFile: {}", wechatSocketClient.bytesToHex(req.toByteArray()));
Wcf.Response rsp = wechatSocketClient.sendCmd(req);
int state = judgeWcfCmdState(rsp);
// FUNC_SEND_FILE_VALUE
int state = wechatSocketClient.sendFile(request.getResourcePath(), request.getRecipient());
// 回调处理
String stringJson = JSON.toJSONString(request);
sendMsgCallback(stringJson, state);
long endTime = System.currentTimeMillis();
log.info("[发送消息]-[文件消息]-处理结束,耗时:{}ms", (endTime - startTime));
return null;
}
@Override
public WxPpWcfSendFileMsgResp sendFileMsg(String recipient, String resourcePath) {
WxPpWcfSendFileMsgReq request = new WxPpWcfSendFileMsgReq();
request.setRecipient(recipient);
request.setResourcePath(resourcePath);
return this.sendFileMsg(request);
}
@Override
public WxPpWcfSendPatOnePatMsgResp patOnePat(WxPpWcfPatOnePatMsgReq request) {
long startTime = System.currentTimeMillis();
// 公共校验
checkClientStatus();
log.info("[发送消息]-[拍一拍消息]-入参打印:{}", request);
Wcf.PatMsg patMsg = Wcf.PatMsg.newBuilder().setRoomid(request.getRecipient()).setWxid(request.getPatUser()).build();
Wcf.Request wcfReq = Wcf.Request.newBuilder().setFuncValue(Wcf.Functions.FUNC_SEND_PAT_MSG_VALUE).setPm(patMsg).build();
Wcf.Response rsp = wechatSocketClient.sendCmd(wcfReq);
int state = judgeWcfCmdState(rsp);
// FUNC_SEND_PAT_MSG_VALUE
int state = wechatSocketClient.sendPatMsg(request.getRecipient(), request.getPatUser());
// 回调处理
String stringJson = JSON.toJSONString(request);
sendMsgCallback(stringJson, state);
long endTime = System.currentTimeMillis();
log.info("[发送消息]-[拍一拍消息]-处理结束,耗时:{}ms", (endTime - startTime));
return null;
}
@Override
public WxPpWcfSendPatOnePatMsgResp patOnePat(String recipient, String patUser) {
WxPpWcfPatOnePatMsgReq request = new WxPpWcfPatOnePatMsgReq();
request.setRecipient(recipient);
request.setPatUser(patUser);
return this.patOnePat(request);
}
@Override
public String revokeMsg(WxPpWcfRevokeMsgReq request) {
long startTime = System.currentTimeMillis();
// 公共校验
checkClientStatus();
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);
Integer msgId = Integer.valueOf(request.getMsgId());
// FUNC_REVOKE_MSG_VALUE
int state = wechatSocketClient.revokeMsg(msgId);
// 回调处理
String stringJson = JSON.toJSONString(request);
sendMsgCallback(stringJson, state);
long endTime = System.currentTimeMillis();
log.info("[撤回消息]-[消息撤回]-处理结束,耗时:{}ms", (endTime - startTime));
return "";
}
@Override
public String revokeMsg(String msgId) {
WxPpWcfRevokeMsgReq request = new WxPpWcfRevokeMsgReq();
request.setMsgId(msgId);
return this.revokeMsg(request);
}
@Override
public String passFriendApply(WxPpWcfPassFriendApplyReq request) {
long startTime = System.currentTimeMillis();
// 公共校验
checkClientStatus();
log.info("[好友申请]-[通过好友申请]-入参打印:{}", request);
Wcf.Verification verification = Wcf.Verification.newBuilder().setV3(request.getApplicant()).setV4(request.getReviewer()).build();
Wcf.Request req = Wcf.Request.newBuilder().setFuncValue(Wcf.Functions.FUNC_ACCEPT_FRIEND_VALUE).setV(verification).build();
Wcf.Response rsp = wechatSocketClient.sendCmd(req);
int state = judgeWcfCmdState(rsp);
long endTime = System.currentTimeMillis();
log.info("[好友申请]-[通过好友申请]-处理结束,耗时:{}ms", (endTime - startTime));
// FUNC_ACCEPT_FRIEND_VALUE
int state = wechatSocketClient.acceptNewFriend(request.getEncryptUsername(), request.getTicket(), Integer.parseInt(request.getScene()));
return "";
}
@Override
public String passFriendApply(String encryptUsername, String ticket, String scene) {
WxPpWcfPassFriendApplyReq request = new WxPpWcfPassFriendApplyReq();
request.setEncryptUsername(encryptUsername);
request.setTicket(ticket);
request.setScene(scene);
return this.passFriendApply(request);
}
@Override
public String addFriendGroupMember(WxPpWcfAddFriendGroupMemberReq request) {
long startTime = System.currentTimeMillis();
// 公共校验
checkClientStatus();
log.info("[添加好友]-[添加群成员为好友]-入参打印:{}", request);
@ -469,18 +476,21 @@ public class WeChatDllServiceImpl implements WeChatDllService {
return "";
}
String groupMembersStr = String.join(",", request.getGroupMembers());
Wcf.MemberMgmt memberMgmt = Wcf.MemberMgmt.newBuilder().setRoomid(request.getGroupNo()).setWxids(groupMembersStr).build();
Wcf.Request req = Wcf.Request.newBuilder().setFuncValue(Wcf.Functions.FUNC_ADD_ROOM_MEMBERS_VALUE).setM(memberMgmt).build();
Wcf.Response rsp = wechatSocketClient.sendCmd(req);
int state = judgeWcfCmdState(rsp);
long endTime = System.currentTimeMillis();
log.info("[添加好友]-[添加群成员为好友]-处理结束,耗时:{}ms", (endTime - startTime));
// FUNC_ADD_ROOM_MEMBERS_VALUE
int state = wechatSocketClient.addChatroomMembers(request.getGroupNo(), groupMembersStr);
return "";
}
@Override
public String addFriendGroupMember(String groupNo, List<String> groupMembers) {
WxPpWcfAddFriendGroupMemberReq request = new WxPpWcfAddFriendGroupMemberReq();
request.setGroupNo(groupNo);
request.setGroupMembers(groupMembers);
return this.addFriendGroupMember(request);
}
@Override
public List<WxPpWcfGroupMemberResp> queryGroupMemberList(WxPpWcfGroupMemberReq request) {
long startTime = System.currentTimeMillis();
// 公共校验
checkClientStatus();
List<WxPpWcfGroupMemberResp> list = new ArrayList<>();
@ -550,14 +560,18 @@ public class WeChatDllServiceImpl implements WeChatDllService {
}
}
}
long endTime = System.currentTimeMillis();
log.info("[查询]-[查询群成员]-共查到:{}条,耗时:{}ms", list.size(), (endTime - startTime));
return list;
}
@Override
public List<WxPpWcfGroupMemberResp> queryGroupMemberList(String groupNo) {
WxPpWcfGroupMemberReq request = new WxPpWcfGroupMemberReq();
request.setGroupNo(groupNo);
return this.queryGroupMemberList(request);
}
@Override
public String inviteGroupMember(WxPpWcfInviteGroupMemberReq request) {
long startTime = System.currentTimeMillis();
// 公共校验
checkClientStatus();
log.info("[群成员]-[邀请群成员加入]-入参打印:{}", request);
@ -565,19 +579,22 @@ public class WeChatDllServiceImpl implements WeChatDllService {
log.error("[群成员]-[邀请群成员加入]-待邀请进群的人员为空,本次操作取消");
return "";
}
// FUNC_INV_ROOM_MEMBERS_VALUE
String groupMembersStr = String.join(",", request.getGroupMembers());
Wcf.MemberMgmt memberMgmt = Wcf.MemberMgmt.newBuilder().setRoomid(request.getGroupNo()).setWxids(groupMembersStr).build();
Wcf.Request req = Wcf.Request.newBuilder().setFuncValue(Wcf.Functions.FUNC_INV_ROOM_MEMBERS_VALUE).setM(memberMgmt).build();
Wcf.Response rsp = wechatSocketClient.sendCmd(req);
int state = judgeWcfCmdState(rsp);
long endTime = System.currentTimeMillis();
log.info("[群成员]-[邀请群成员加入]-处理结束,耗时:{}ms", (endTime - startTime));
int state = wechatSocketClient.inviteChatroomMembers(request.getGroupNo(), groupMembersStr);
return "";
}
@Override
public String inviteGroupMember(String groupNo, List<String> groupMembers) {
WxPpWcfInviteGroupMemberReq request = new WxPpWcfInviteGroupMemberReq();
request.setGroupNo(groupNo);
request.setGroupMembers(groupMembers);
return this.inviteGroupMember(request);
}
@Override
public String deleteGroupMember(WxPpWcfDeleteGroupMemberReq request) {
long startTime = System.currentTimeMillis();
// 公共校验
checkClientStatus();
log.info("[群成员]-[删除群成员]-入参打印:{}", request);
@ -585,47 +602,47 @@ public class WeChatDllServiceImpl implements WeChatDllService {
log.error("[群成员]-[删除群成员]-待删除的人员为空,本次操作取消");
return "";
}
// FUNC_DEL_ROOM_MEMBERS_VALUE
String groupMembersStr = String.join(",", request.getGroupMembers());
Wcf.MemberMgmt memberMgmt = Wcf.MemberMgmt.newBuilder().setRoomid(request.getGroupNo()).setWxids(groupMembersStr).build();
Wcf.Request req = Wcf.Request.newBuilder().setFuncValue(Wcf.Functions.FUNC_DEL_ROOM_MEMBERS_VALUE).setM(memberMgmt).build();
Wcf.Response rsp = wechatSocketClient.sendCmd(req);
int state = judgeWcfCmdState(rsp);
long endTime = System.currentTimeMillis();
log.info("[群成员]-[删除群成员]-处理结束,耗时:{}ms", (endTime - startTime));
int state = wechatSocketClient.delChatroomMembers(request.getGroupNo(), groupMembersStr);
return "";
}
@Override
public String queryFriendCircle() {
long startTime = System.currentTimeMillis();
public String deleteGroupMember(String groupNo, List<String> groupMembers) {
WxPpWcfDeleteGroupMemberReq request = new WxPpWcfDeleteGroupMemberReq();
request.setGroupNo(groupNo);
request.setGroupMembers(groupMembers);
return this.deleteGroupMember(request);
}
@Override
public String queryFriendCircle(Integer id) {
// 公共校验
checkClientStatus();
log.info("[查询]-[刷新朋友圈]-开始");
// id 开始 id0 为最新页 (string based uint64)
Wcf.Request req = Wcf.Request.newBuilder().setFuncValue(Wcf.Functions.FUNC_REFRESH_PYQ_VALUE).setUi64(0).build();
Wcf.Response rsp = wechatSocketClient.sendCmd(req);
int state = judgeWcfCmdState(rsp);
long endTime = System.currentTimeMillis();
log.info("[查询]-[刷新朋友圈]-处理结束,耗时:{}ms", (endTime - startTime));
// FUNC_REFRESH_PYQ_VALUE
int state = wechatSocketClient.refreshPyq(id);
return "";
}
@Override
public String receiveTransfer(WxPpWcfReceiveTransferReq request) {
long startTime = System.currentTimeMillis();
// 公共校验
checkClientStatus();
log.info("[转账]-[接收转账]-开始");
Wcf.Transfer transfer =
Wcf.Transfer.newBuilder().setWxid(request.getWeChatUid()).setTfid(request.getTransferId()).setTaid(request.getTransferId()).build();
Wcf.Request req = Wcf.Request.newBuilder().setFuncValue(Wcf.Functions.FUNC_RECV_TRANSFER_VALUE).setTf(transfer).build();
Wcf.Response rsp = wechatSocketClient.sendCmd(req);
int state = judgeWcfCmdState(rsp);
long endTime = System.currentTimeMillis();
log.info("[转账]-[接收转账]-处理结束,耗时:{}ms", (endTime - startTime));
// FUNC_RECV_TRANSFER_VALUE
int state = wechatSocketClient.receiveTransfer(request.getWeChatUid(), request.getTransferId(), request.getTransactionId());
return "";
}
@Override
public String receiveTransfer(String weChatUid, String transferId, String transactionId) {
WxPpWcfReceiveTransferReq request = new WxPpWcfReceiveTransferReq();
request.setWeChatUid(weChatUid);
request.setTransferId(transferId);
request.setTransactionId(transactionId);
return this.receiveTransfer(request);
}
/**
* 消息回调
*

View File

@ -23,7 +23,7 @@ logging:
wechat:
ferry:
# DLL文件位置
dll-path: E:\WeChatFerry\clients\java\wcf-bmc\dll\sdk.dll
dll-path: E:\workspace\project\me\wcf\WeChatFerry\cdl\WeChatFerry-cdl-master\clients\java\wcf-bmc\dll\sdk.dll
# socket端口
socket-port: 10086
# SDK是否调试模式