package com.kede.wechat.service.impl; import com.kede.common.dao.ChatMsgMapper; import com.kede.common.dao.ChatMsgOptimizeMapper; import com.kede.common.enums.WechatSmgTypeEnum; import com.kede.common.model.ChatMsg; import com.kede.common.model.ChatMsgOptimize; import com.kede.common.model.ChatMsgUser; import com.kede.common.utils.DateUtils; import com.kede.common.utils.HttpUtils; import com.kede.common.utils.RSAEncrypt; import com.kede.common.utils.StringUtils; import com.kede.core.mybatis.BaseMybatisDao; import com.kede.wechat.bo.ChatMsgUserBo; import com.kede.wechat.bo.InputChatMsg; import com.kede.wechat.bo.InputGetChatName; import com.kede.wechat.bo.InputgetUserMsg; import com.kede.wechat.service.ConversationContentService; import com.tencent.wework.Finance; import org.json.JSONArray; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import com.kede.common.dao.ChatMsgUserMapper; import javax.annotation.Resource; import java.io.File; import java.io.FileOutputStream; import java.io.UnsupportedEncodingException; import java.util.*; import java.util.stream.Collectors; import static sun.plugin2.os.windows.OSVERSIONINFOA.size; @Service("ConversationContentService") public class ConversationContentServiceImpl extends BaseMybatisDao implements ConversationContentService { static String hnPriKey ="-----BEGIN PRIVATE KEY-----\n" + "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCnh5N/kiyeNx/y\n" + "dDKe3FO8HWj8tuQQUCkCc8ol1Sqmcs9ey7S2189UDbZOPeY2xiiMD6AdFVUK5Y0P\n" + "gbX/XZFVizhwXseE+1IV1k0w3C++5Y4Zll7nZoJ05ANMbj+dlamAlNYOutmc0lZf\n" + "CGXM5oeu+U0XDWE1+uY7TRAGV3OcA7GBraXiothncbkNf0ZwfBEGVyLNHcNODgwz\n" + "ECc0KJuEF2V+UAt11HloT60atSmdiktwbJ6KOJ62TM/eU+F/5d3UJLdw0Xb8kEFn\n" + "PYK/1mD8PGKFA6F0wSajNLc6iPg5mgiOS5j02N2+nEN8m7vIdL7Hd0yrigf5kEdl\n" + "x9PC7OYpAgMBAAECggEAIUhSCVok+xnAgw6Kr/zdtdWx8eLz1DnYq+ANHQ8IdiEB\n" + "Cbg2osylJ/HBcjHh9qfPjmPcT2rZhlysdZQzcBRKt0/9WnW59bVoTWZR148m/Snl\n" + "3Td+i0JWUJqr/Rc6FDiTgDQRgsOkT/+JoT+t2dNCyYRFyHqkAXFjJAzfTiM5mJjg\n" + "h8q7bU/LXoc49kuaNYmt5rV1nACoIh7MmKZpmR4OKXDWrl52Xt5qCEonp3bAH/S3\n" + "HaTqsoqot7fF5aZWEuDWUeYQPzgVSsdw2k9Lq1c8aoE15IRfQCxtBOYpk8LEDJty\n" + "JIGHrzBEHP7cok4UdBWbfuI1YjqmjefQovQumKqfcQKBgQDlXDrFFvx+k9pUI2bo\n" + "KXcqroOcpdsssO5uJOG1PwuM02wIR0hP1d89fItFwLLuzjb+jeyN3qwFgoh21fkk\n" + "Z3HkxubMY4fpXk1mAsTPUZxll8YYgGE7tXk1Rk5xsBMzlFRW88N7Ww/rQMBOlpJA\n" + "6UfZGFYMezb1vXf7u3M4w/N22wKBgQC6/OF5DsCHAOui8CPXS2z2YTKuoOJmHKIe\n" + "vBeXy+ic+YRuTBXgA0Z1wL4xDW/LeCqoTmetbTuvGSyahMV4QSK0pxH9gk80sH4+\n" + "YEza3DLASxr4gSsr2fL6siuXN/OHyMClQb6JVa0yuPG1zLzShaIXYVAyz1m9rU1B\n" + "JpQfbEV8SwKBgGnBDvAVWzLZ5Y9qC2b8x4+Mi+7MorSGmEl9A/1YJnE2gteGVpdJ\n" + "G/fz1xvAcECgIMdalToM8/BOcbGpk4jvkZpVA9I2ClLWQoXIvQqCrMRDKPnfJ/Yq\n" + "BMtFsaHF9/SObhzxpK7aHAry/ji+QI1hgtlc2UBEB+FjDVGq6sO/xiCFAoGAV/3Y\n" + "PJdskhskx7AprY6Y3/gtWW/sGhEvWTc6Avy5oeTpJN45DQl9hrwExCCGk0EhEcKT\n" + "l1Dn3SYDj1MbedNs+YYFOT6w9yJ2xfObNwKX/1VYg8iFAEW3ybE+QhLaTvNxdFLT\n" + "zty6fDv7wolt8cNg24+3pbFdkZyT1izJV2Aj8rECgYBZQMObUgJ57n8FrXCdcdSa\n" + "MGsFYl8KUZa1zvzhoi3h7YtbVNNtSHcEK7VDyIheBt9pFCN7nuDX3jW2XYW2USEC\n" + "T7Pab2DAXPkRmXspWNID21G+AqqGSLD4pk9+ZmqevTfAtI+ajiu5NH1guH73rVOM\n" + "xGjQ5dCmWpUGt4fmO+zWIw==\n" + "-----END PRIVATE KEY-----"; static String pubKey ="-----BEGIN PUBLIC KEY-----\n" + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp4eTf5Isnjcf8nQyntxT\n" + "vB1o/LbkEFApAnPKJdUqpnLPXsu0ttfPVA22Tj3mNsYojA+gHRVVCuWND4G1/12R\n" + "VYs4cF7HhPtSFdZNMNwvvuWOGZZe52aCdOQDTG4/nZWpgJTWDrrZnNJWXwhlzOaH\n" + "rvlNFw1hNfrmO00QBldznAOxga2l4qLYZ3G5DX9GcHwRBlcizR3DTg4MMxAnNCib\n" + "hBdlflALddR5aE+tGrUpnYpLcGyeijietkzP3lPhf+Xd1CS3cNF2/JBBZz2Cv9Zg\n" + "/DxihQOhdMEmozS3Ooj4OZoIjkuY9NjdvpxDfJu7yHS+x3dMq4oH+ZBHZcfTwuzm\n" + "KQIDAQAB\n" + "-----END PUBLIC KEY-----"; Logger logger = LoggerFactory.getLogger(ConversationContentServiceImpl.class); @Value(value = "${conversationContent.corpid}") private String hnCorpId; @Value(value = "${conversationContent.secret}") private String hnSecret; @Value(value = "${conversationContent.app.secret}") private String hnAppSecret; @Value(value = "${conversationContent.nm.corpid}") private String nmCorpid; @Value(value = "${conversationContent.nm.secret}") private String nmSecret; @Value(value = "${conversationContent.nm.app.secret}") private String nmAppSecret; @Value(value = "${upload.path}") private String uploadPath; @Resource private RedisTemplate redisTemplate; @Resource private ChatMsgUserMapper chatMsgUserMapper; @Resource private ChatMsgMapper chatMsgMapper; @Resource private ChatMsgOptimizeMapper chatMsgOptimizeMapper; /** * 获取会话内容 * @param pageSeq * @param pageLimit * @param days 获取天数,比如-2, 那就是获取当前天数-2的日期,那么获取数据就是前天开始到当前日期的数据 * @return */ @Override public Map pushChatData(Integer pageSeq, Integer pageLimit,Integer days,Integer type) { String message = null; Map map = new HashMap<>(); List list = new ArrayList<>(); Integer total = 0; long sdk = Finance.NewSdk(); String corpId =null; String secret =null; String priKey =null; if (type==0){ corpId = hnCorpId; secret = hnSecret; priKey = hnPriKey; }else if (type==1){ corpId = nmCorpid; secret = nmSecret; priKey = nmAppSecret; } System.out.println(Finance.Init(sdk, corpId, secret)); long ret = 0; int seq = 0; int limit = 200; if (pageSeq != null || pageLimit!=null){ seq=pageSeq; limit = pageLimit; } long slice = Finance.NewSlice(); ret = Finance.GetChatData(sdk, seq, limit, null, null, 3, slice); if (ret != 0) { System.out.println("getchatdata ret " + ret); } String getchatdata = Finance.GetContentFromSlice(slice); JSONObject jo = new JSONObject(getchatdata); JSONArray chatdata = jo.getJSONArray("chatdata"); total=chatdata.length(); System.out.println("消息数:" + total); Date earlyToday = DateUtils.getEarlyToday(); Date date = DateUtils.getDateBefore(earlyToday, days); for (int i = 0; i < chatdata.length(); i++) { String item = chatdata.get(i).toString(); // item:{ // "publickey_ver":1, // "encrypt_chat_msg":"XSeHr+qM0YfX/q5WWvmnVEuL2E4U0RclkIbK9JnWQq7Y/0Ynir3srKh+9DH6BqRj/NYXKmUC65+0WRo // QboW3dC200XTqVNj+z0kljl11HdNmjuS3p7g0L+DYG5Bdz6Lo8FuHf/5WkOVi/R5VxOO6FvU+PediEOSCBN2dVHCeyIvExCk5mh // o+ME9QV/Q19HujmHpxzl3cu1XvBAZ7YvIpd2d/BCCI9JwmBc5bXr2FQ0r/PFkZadKGjw0cxqPyNIBkNc+ic0wHhWSZFTvY3qDW2 // FFAdkYW68w8PA5f+8gD9VUuxKzz/j3Fu/6547Ayyuo93lPtbud5lAWXyeLexyHujFmdr300MA44BoYZsuTqdVsHbtEGLw967kO1 // oHcImidD416ZuQh2VZiOYTJMtDZALdB1tXramb7kFj0AsKloFLKeg3ks3TYRKwEmM9wJ/y2hGDJzq5xncBFFShbLao5u", // "msgid":"1634016854685227651_1749628622146_external", // "encrypt_random_key":"kJ3XJM7CB7DGZqFxSfT8+EDWfr8vZmVVKzKLl5FM47Sd7iUSlgZF/a4dm5sTpCMW3uzk/m1LZV4odH // RyVO2+AaVJsidMoLV2LmmWiCAuXkzdK4yDbGItkvpZGrilgAlJjR8EhsUuqXOjvxkUemGvKMhrUqKdCaO4p3GYT/cxMRJDUmrP0v // TQqdgwznQOSubbBFDdMTSAfEtZnGp5tOQdCNFCbIqks4/Y8Isd/nd/Kq3QNsXjE+GdZkqVuOqRujOeCeqFRJF022i2KFuJQ+R+7X // 1es92NKBbaNT1AlRNfjtACH1KrPRLlEnmAS0EUIWWmn45/kOpH3T4ovOuNDnrafw==", // "seq":1} JSONObject data = new JSONObject(item); String encrypt_random_key = data.getString("encrypt_random_key"); String encrypt_chat_msg = data.getString("encrypt_chat_msg"); long msg = Finance.NewSlice(); try { message = RSAEncrypt.decryptRSA(encrypt_random_key, priKey); ret = Finance.DecryptData(sdk, message, encrypt_chat_msg, msg); if (ret != 0) { System.out.println("getchatdata ret " + ret); // return; } String str = String.valueOf(Finance.GetContentFromSlice(msg)); System.out.println("getwep="+str); com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(str); String msgtype = jsonObject.getString("msgtype"); InputChatMsg chatMsg = new InputChatMsg(jsonObject,type); System.out.println(chatMsg.getMsgtime()); if (chatMsg.getMsgtime().getTime()>date.getTime()){ //处理数据 ChatMsgOptimize chatMsgOptimize = chatMsgOptimizeMapper.selectById(chatMsg.getMsgid()); if (chatMsgOptimize==null){ chatMsgOptimize = new ChatMsgOptimize(); chatMsgOptimize.setMsgid(chatMsg.getMsgid()); chatMsgOptimize.setMsgtime(chatMsg.getMsgtime()); chatMsgOptimizeMapper.insert(chatMsgOptimize); pushSmgType(msgtype, jsonObject, sdk, chatMsg); list.add(chatMsg); } } } catch (Exception e) { e.printStackTrace(); } } Finance.FreeSlice(slice); map.put("list",list); map.put("total",total); return map; } private void pushSmgType(String msgtype, com.alibaba.fastjson.JSONObject jsonObject, long sdk, InputChatMsg chatMsg) { if (msgtype!=null) { if (msgtype.equals("text")) { //文档 com.alibaba.fastjson.JSONObject text = jsonObject.getJSONObject("text"); if (text != null) { String content1 = text.getString("content"); // chatMsg.setContent(pushCharset(content1)); chatMsg.setContent(content1); } } else if (msgtype.equals("link")) { //链接 com.alibaba.fastjson.JSONObject link = jsonObject.getJSONObject("link"); chatMsg.setMsgurl(link.getString("link_url")); chatMsg.setContent(pushCharset(link.getString("title"))); } else if (msgtype.equals("mixed")) { //混合 System.out.println("=+++++++++++++++++++++++++++++++++++++" + jsonObject); com.alibaba.fastjson.JSONObject mixed = jsonObject.getJSONObject("mixed"); com.alibaba.fastjson.JSONArray item = mixed.getJSONArray("item"); for (int j = 0; j < item.size(); j++) { com.alibaba.fastjson.JSONObject e = item.getJSONObject(j); String type = e.getString("type"); if (type.equals("text")) { com.alibaba.fastjson.JSONObject contentJson = e.getJSONObject("content"); String content = contentJson.getString("content"); chatMsg.setContent(content); } else { String url = ""; com.alibaba.fastjson.JSONObject content = e.getJSONObject("content"); String sdkfileid = content.getString("sdkfileid"); if (type.equals("file")) { String filename = content.getString("filename"); String osname = System.getProperties().getProperty("os.name"); if (osname.contains("Windows")) { // filename = new String(filename.getBytes("GBK"),"UTF-8"); String safeName = filename.replaceAll("[<>:\"/\\\\|?*,、]", "_"); url = "/wechat/" + safeName; } } else if (type.equals("image")) { url = "/wechat/" + System.currentTimeMillis() + ".jpg"; com.alibaba.fastjson.JSONObject image = jsonObject.getJSONObject("image"); } else { chatMsg.setContent(chatMsg.getContent() + "[附件=" + e + "]"); } downloadFile(sdk, sdkfileid, uploadPath + url); chatMsg.setMsgurl(url); } } } else if (msgtype.equals("sphfeed")) { chatMsg.setContent(jsonObject.getString("sphfeed")); } else if (msgtype.equals("file") || msgtype.equals("image") || msgtype.equals("video") || msgtype.equals("voice")) { String url = pushFileUrl(sdk, msgtype, jsonObject); chatMsg.setMsgurl(url); } else if (msgtype.equals("chatrecord")) { chatMsg.setContent(jsonObject.getString("chatrecord")); } else if (msgtype.equals("agree")) { chatMsg.setContent("[同意会话存储]"); } else if (msgtype.equals("disagree")) { chatMsg.setContent("[不同意会话存储]"); } else if (msgtype.equals("emotion")) { String url = pushFileUrl(sdk, msgtype, jsonObject); chatMsg.setMsgurl(url); } else { if (!jsonObject.getString("action").equals("switch") && !jsonObject.getString("action").equals("recall")) { chatMsg.setContent(jsonObject.toJSONString()); } } } } private String pushCharset(String content1) { String str ; try { String osname = System.getProperties().getProperty("os.name"); if (osname.contains("Windows")) { String result = new String(content1.getBytes("GBK"),"UTF-8"); str=result; }else{ str=content1; } } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } return str; } private String pushFileUrl(long sdk, String msgtype, com.alibaba.fastjson.JSONObject jsonObject) { String url = ""; String sdkfileid=null; if (msgtype.equals("file")){ com.alibaba.fastjson.JSONObject file = jsonObject.getJSONObject("file"); String filename = file.getString("filename"); sdkfileid = file.getString("sdkfileid"); String osname = System.getProperties().getProperty("os.name"); if (osname.contains("Windows")) { // filename = new String(filename.getBytes("GBK"),"UTF-8"); String safeName=filename.replaceAll("[<>:\"/\\\\|?*,、]", "_"); url = "/wechat/"+ "file/"+safeName; } }else if (msgtype.equals("image")){ url = "/wechat/"+"image/"+ System.currentTimeMillis()+".jpg"; com.alibaba.fastjson.JSONObject image = jsonObject.getJSONObject("image"); sdkfileid = image.getString("sdkfileid"); }else if (msgtype.equals("voice")){ url = "/wechat/"+"voice/" +System.currentTimeMillis()+".mp3"; com.alibaba.fastjson.JSONObject image = jsonObject.getJSONObject("voice"); sdkfileid = image.getString("sdkfileid"); }else if (msgtype.equals("video")){ url = url +"/wechat/"+"video/"+ System.currentTimeMillis()+".mp4"; com.alibaba.fastjson.JSONObject image = jsonObject.getJSONObject("video"); }else if (msgtype.equals("emotion")){ com.alibaba.fastjson.JSONObject emotion = jsonObject.getJSONObject("emotion"); Integer type=emotion.getInteger("type"); String suffix= ""; if (type==1){ suffix=".gif"; }else if (type==2){ suffix=".png"; } url = url +"/wechat/"+"emotion/"+ System.currentTimeMillis()+suffix; sdkfileid = emotion.getString("sdkfileid"); } // 下载文件 downloadFile(sdk, sdkfileid, uploadPath+url); return url; } private void downloadFile(long sdk, String sdkfileid, String url) { String indexbuf = ""; while(true){ //每次使用GetMediaData拉取存档前需要调用NewMediaData获取一个media_data,在使用完media_data中数据后,还需要调用FreeMediaData释放。 long media_data = Finance.NewMediaData(); int ret = Finance.GetMediaData(sdk, indexbuf, sdkfileid, null, null, 3, media_data); if(ret!=0){ System.out.println("getmediadata ret:" + ret); Finance.FreeMediaData(media_data); return; }else{ System.out.println("getmediadata ret:" + ret); } System.out.printf("getmediadata outindex len:%d, data_len:%d, is_finis:%d\n",Finance.GetIndexLen(media_data),Finance.GetDataLen(media_data), Finance.IsMediaDataFinish(media_data)); try { File file = new File(url); if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); // 自动创建缺失的父目录 } //大于512k的文件会分片拉取,此处需要使用追加写,避免后面的分片覆盖之前的数据。 FileOutputStream outputStream = new FileOutputStream(url, true); outputStream.write(Finance.GetData(media_data)); outputStream.close(); } catch (Exception e) { e.printStackTrace(); } if(Finance.IsMediaDataFinish(media_data) == 1) { //已经拉取完成最后一个分片 Finance.FreeMediaData(media_data); break; } else { //获取下次拉取需要使用的indexbuf indexbuf = Finance.GetOutIndexBuf(media_data); Finance.FreeMediaData(media_data); } } } @Override public String getAccessToken(Integer type) { String corpId =null; String secret =null; String accessToken = null; if (type==0){ corpId = hnCorpId; secret = hnSecret; //获取redis缓存数据 Map accessMap = (Map) redisTemplate.opsForValue().get("ACCESS_TOKEN"); if (accessMap == null){ logger.debug("getAccessToken无缓存从接口获取"); Map map = getAccessMap(corpId, secret); //新增redis缓存数据 redisTemplate.opsForValue().set("ACCESS_TOKEN",map); accessToken = map.get("accessToken"); }else { logger.debug("getAccessToken有缓存从缓存获取"); accessToken = accessMap.get("accessToken"); Long expireDate = Long.valueOf(accessMap.get("expireDate")); if (expireDate < System.currentTimeMillis()){ logger.debug("getAccessToken缓存已过期从接口获取"); Map map = getAccessMap(corpId, secret); accessToken = map.get("accessToken"); //新增redis缓存数据 redisTemplate.opsForValue().set("ACCESS_TOKEN",map); } } }else if (type==1){ corpId = nmCorpid; secret = nmSecret; //获取redis缓存数据 Map accessMap = (Map) redisTemplate.opsForValue().get("NM_ACCESS_TOKEN"); if (accessMap == null){ logger.debug("getAccessToken无缓存从接口获取"); Map map = getAccessMap(corpId, secret); //新增redis缓存数据 redisTemplate.opsForValue().set("NM_ACCESS_TOKEN",map); accessToken = map.get("accessToken"); }else { logger.debug("getAccessToken有缓存从缓存获取"); accessToken = accessMap.get("accessToken"); Long expireDate = Long.valueOf(accessMap.get("expireDate")); if (expireDate < System.currentTimeMillis()){ logger.debug("getAccessToken缓存已过期从接口获取"); Map map = getAccessMap(corpId, secret); accessToken = map.get("accessToken"); //新增redis缓存数据 redisTemplate.opsForValue().set("NM_ACCESS_TOKEN",map); } } } return accessToken; } // public String getAddressBookAccessToken(Integer type) { // String corpId =null; // String secret =null; // if (type==0){ // corpId = hnCorpId; // secret = hnSecret; // }else if (type==1){ // corpId = nmCorpid; // secret = nmSecret; // } // //获取redis缓存数据 // String accessToken = null; // Map accessMap = (Map) redisTemplate.opsForValue().get("ADDRESS_BOOK_ACCESS_TOKEN"); // if (accessMap == null){ // logger.debug("ADDRESS_BOOK无缓存从接口获取"); // Map map = getAccessMap(corpId, secret); // //新增redis缓存数据 // redisTemplate.opsForValue().set("ADDRESS_BOOK_ACCESS_TOKEN",map); // accessToken = map.get("accessToken"); // }else { // logger.debug("ADDRESS_BOOK有缓存从缓存获取"); // accessToken = accessMap.get("accessToken"); // Long expireDate = Long.valueOf(accessMap.get("expireDate")); // if (expireDate < System.currentTimeMillis()){ // logger.debug("ADDRESS_BOOK缓存已过期从接口获取"); // Map map = getAccessMap(corpId, secret); // accessToken = map.get("accessToken"); // //新增redis缓存数据 // redisTemplate.opsForValue().set("ADDRESS_BOOK_ACCESS_TOKEN",map); // } // } // return accessToken; // } @Override public String getAppAccessToken(Integer type) { String corpId =null; String appSecret =null; String accessToken=null; if (type==0){ corpId = hnCorpId; appSecret = hnAppSecret; //获取redis缓存数据 Map accessMap = (Map) redisTemplate.opsForValue().get("ADDRESS_BOOK_ACCESS_TOKEN"); if (accessMap == null){ logger.debug("APP_ACCESS_TOKEN无缓存从接口获取"); Map map = getAccessMap(corpId,appSecret); //新增redis缓存数据 redisTemplate.opsForValue().set("APP_ACCESS_TOKEN",map); accessToken = map.get("accessToken"); }else { logger.debug("APP_ACCESS_TOKEN有缓存从缓存获取"); accessToken = accessMap.get("accessToken"); Long expireDate = Long.valueOf(accessMap.get("expireDate")); if (expireDate < System.currentTimeMillis()){ logger.debug("APP_ACCESS_TOKEN缓存已过期从接口获取"); Map map = getAccessMap(corpId,appSecret); accessToken = map.get("accessToken"); //新增redis缓存数据 redisTemplate.opsForValue().set("APP_ACCESS_TOKEN",map); } } }else if (type==1){ corpId = nmCorpid; appSecret = nmAppSecret; //获取redis缓存数据 Map accessMap = (Map) redisTemplate.opsForValue().get("NM_ADDRESS_BOOK_ACCESS_TOKEN"); if (accessMap == null){ logger.debug("NM_APP_ACCESS_TOKEN无缓存从接口获取"); Map map = getAccessMap(corpId,appSecret); //新增redis缓存数据 redisTemplate.opsForValue().set("NM_APP_ACCESS_TOKEN",map); accessToken = map.get("accessToken"); }else { logger.debug("NM_APP_ACCESS_TOKEN有缓存从缓存获取"); accessToken = accessMap.get("accessToken"); Long expireDate = Long.valueOf(accessMap.get("expireDate")); if (expireDate < System.currentTimeMillis()){ logger.debug("NM_APP_ACCESS_TOKEN缓存已过期从接口获取"); Map map = getAccessMap(corpId,appSecret); accessToken = map.get("accessToken"); //新增redis缓存数据 redisTemplate.opsForValue().set("NM_APP_ACCESS_TOKEN",map); } } } return accessToken; } @Override public String getPermitUserList(Integer type) { String url=String.format("https://qyapi.weixin.qq.com/cgi-bin/msgaudit/get_permit_user_list?access_token=%s",getAccessToken(type)); com.alibaba.fastjson.JSONObject result = HttpUtils.httpGet(url); if (result.getInteger("errcode")==0){ List ids = result.getJSONArray("ids").toJavaList(String.class); ids.stream().forEach(System.out::println); }else { System.out.println(result.getString("errcode")); System.out.println("获取会话内容存档成员列表失败"); } pushGetChatName(result.toJSONString(),type); return null; } /** * 通过id获取名字,先查数据库,没有再按类型去调API查询 * @param userId * @return */ @Override public Map pushGetChatName(String userId, Integer type) { Map map = new HashMap<>(); Integer i = 0; ChatMsgUser chatMsgUser = chatMsgUserMapper.selectByUserId(userId); if (chatMsgUser != null){ map.put("name",chatMsgUser.getName()); map.put("code",i); return map; }else { String msgIdSub = userId.substring(0, 2); String url=null; Integer type2; if (msgIdSub.equals("wb")){ type2=0; // url=String.format("https://qyapi.weixin.qq.com/cgi-bin/msgaudit/get_robot_info??access_token=%s&robot_id=%s",getAppAccessToken(),userId); }else if (msgIdSub.equals("wo")||msgIdSub.equals("wm")){ // https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get url=String.format("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get?access_token=%s&external_userid=%s",getAppAccessToken(type),userId); type2=1; }else { url=String.format("https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=%s&userid=%s",getAccessToken(type),userId); type2=2; } Map maps = getUserName(url, type2); Object o = maps.get("name"); String userName = null; if(o!=null){ userName = o.toString(); } map.put ("code", maps.get("code")); chatMsgUser = new ChatMsgUser(); chatMsgUser.setUserId(userId); chatMsgUser.setType(type); chatMsgUser.setCreateTime(new Date()); if (StringUtils.isNotBlank(userName)){ chatMsgUser.setName(userName); map.put("name",userName); } chatMsgUserMapper.insert(chatMsgUser); if (StringUtils.isBlank(userName)){ String str = "未知(" + chatMsgUser.getId() + ")"; chatMsgUser.setName(str); map.put("name",str); chatMsgUserMapper.update(chatMsgUser); } return map; } } /** * errorGode 错误码 * 301059=非内部群,不提供数据 * 90501=该群不是客户群 * @param chatMsg * @return */ @Override public String pushGetRoomName(ChatMsg chatMsg, Integer type) { String roomname=null; // https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/get?access_token=ACCESS_TOKEN String roomid = chatMsg.getRoomid(); ChatMsgUser chatMsgUser = chatMsgUserMapper.selectByUserId(roomid); if (chatMsgUser != null){ return chatMsgUser.getName(); }else { //查询编号中有没有external String msgIdSub = chatMsg.getMsgid(); int i = msgIdSub.indexOf("external"); if (i>0){ String url=String.format("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/get?access_token=%s",getAppAccessToken(type)); Map map = new HashMap(); map.put("chat_id",roomid); map.put("cursor",0); com.alibaba.fastjson.JSONObject jsonObject = HttpUtils.httpPost(url, map); roomname = jsonObject.getString("roomname"); if (StringUtils.isBlank(roomname)){ com.alibaba.fastjson.JSONObject groupChat = jsonObject.getJSONObject("group_chat"); if (groupChat!=null){ roomname = groupChat.getString("name"); } } if (jsonObject.getInteger("errcode")==0){ }else { System.out.println("获取外部群名称失败"+jsonObject.getString("errcode")); } } else { //https://qyapi.weixin.qq.com/cgi-bin/msgaudit/groupchat/get String url=String.format("https://qyapi.weixin.qq.com/cgi-bin/msgaudit/groupchat/get?access_token=%s",getAccessToken(type)); Map map = new HashMap(); map.put("roomid",roomid); com.alibaba.fastjson.JSONObject jsonObject = HttpUtils.httpPost(url, map); System.out.println(jsonObject.toJSONString()); roomname = jsonObject.getString("roomname"); if (StringUtils.isBlank(roomname)){ com.alibaba.fastjson.JSONObject groupChat = jsonObject.getJSONObject("group_chat"); roomname = groupChat.getString("name"); } if (jsonObject.getInteger("errcode")==0){ }else { System.out.println("获取内部群名称失败"+jsonObject.getString("errcode")); } } chatMsgUser = new ChatMsgUser(); chatMsgUser.setUserId(roomid); chatMsgUser.setType(3); chatMsgUser.setCreateTime(new Date()); if (StringUtils.isNotBlank(roomname)){ chatMsgUser.setName(roomname); } chatMsgUserMapper.insert(chatMsgUser); if (StringUtils.isBlank(roomname)){ chatMsgUser.setName("未知群("+chatMsgUser.getId()+")"); chatMsgUserMapper.update(chatMsgUser); } } return roomname; } @Override public Object getMsgData(InputGetChatName in) { List list = chatMsgUserMapper.getUserList(2,in.getProvinceType()); list.forEach(e->{ //查询每个人的所有信息 List chatMsgs = chatMsgMapper.selectMsgById(e.getUserId(),null); List collect = chatMsgs.stream().filter(e1 -> e1.getType().equals(0)).collect(Collectors.toList()); List collect1 = chatMsgs.stream().filter(e1 -> e1.getType().equals(1)).collect(Collectors.toList()); List toUser=new ArrayList<>(); List toList=new ArrayList<>(); collect.forEach(e1->{ if (e1.getFromId().equals(e.getUserId())){ if (!toUser.contains(e1.getTolist())){ toUser.add(e1.getTolist()); } }else { if (!toUser.contains(e1.getFromId())){ toUser.add(e1.getFromId()); } } }); collect1.forEach(e1->{ if (e1.getFromId().equals(e.getUserId())){ if (!toList.contains(e1.getRoomid())){ toList.add(e1.getRoomid()); } }else { if (!toList.contains(e1.getRoomid())){ toList.add(e1.getRoomid()); } } }); System.out.println(e.getName()+"单聊有:"); toUser.forEach(System.out::println); System.out.println("================================"); System.out.println(e.getName()+"群聊有:"); toList.forEach(System.out::println); }); return list; } @Override public Object getUserMsg(InputgetUserMsg in) { List list = chatMsgUserMapper.getUserList(2,in.getProvinceType()); return list; } @Override public Object getMyIdByUser(InputgetUserMsg in) { if (in.getEndTime()!=null)in.setEndTime(in.getEndTime()+" 23:59:59"); return chatMsgUserMapper.selectMyIdByUser(in); } @Override public Object getMyIdByRoom(InputgetUserMsg in) { if (in.getEndTime()!=null)in.setEndTime(in.getEndTime()+" 23:59:59"); return chatMsgUserMapper.selectMyIdByRoom(in); } @Override public Object getMsgList(InputgetUserMsg in) { if (in.getEndTime()!=null)in.setEndTime(in.getEndTime()+" 23:59:59"); List chatMsgs=new ArrayList<>(); if (StringUtils.isNotEmpty(in.getRoomId())){ chatMsgs = chatMsgMapper.selectByRoomId(in); }else if (StringUtils.isNotEmpty(in.getUserId())&&StringUtils.isNotEmpty(in.getFoId())){ chatMsgs = chatMsgMapper.selectByUserIdAndFoId(in); //将list按时间先后排序 chatMsgs.sort(Comparator.comparing(ChatMsg::getMsgtime)); } for (ChatMsg e : chatMsgs) { WechatSmgTypeEnum field = WechatSmgTypeEnum.getField(e.getMsgtype()); if (field==null){ e.setMsgType(e.getMsgtype()); }else { String desc = field.getDesc(); e.setMsgType(desc); } if (e.getType()==0){ e.setTypeName("单聊"); }else if (e.getType()==1){ e.setTypeName("群聊"); } } return chatMsgs; } private Map getUserName(String url,Integer type){ String name = null; Integer code=0; Map map=new HashMap(); if (type==0) { name="机器人"; }else if (type==1){ com.alibaba.fastjson.JSONObject result = HttpUtils.httpGet(url); if (result.getInteger("errcode")==0) { System.out.println(result.toJSONString()); com.alibaba.fastjson.JSONObject externalContact = result.getJSONObject("external_contact"); name=externalContact.getString("name"); }else { code = result.getInteger("errcode"); System.out.println(result.toJSONString()); System.out.println("获取外部联系人名称失败"); } }else if (type==2){ com.alibaba.fastjson.JSONObject result = HttpUtils.httpGet(url); if (result.getInteger("errcode")==0) { System.out.println(result.toJSONString()); com.alibaba.fastjson.JSONObject externalContact = result.getJSONObject("external_contact"); name = result.getString("name"); }else { System.out.println(result.toJSONString()); code = result.getInteger("errcode"); } } map.put("name",name); map.put("code",code); return map; } private Map getAccessMap(String corpid, String secret) { String url=String.format("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s",corpid,secret); Date date = new Date(); com.alibaba.fastjson.JSONObject jsonObject = HttpUtils.httpGet(url); String access_token = (String) jsonObject.get("access_token"); Integer expires_in = (Integer) jsonObject.get("expires_in"); //时间加上过期时间 Date expireDate = DateUtils.addMilliseconds(date, expires_in*1000); Map map = new HashMap<>(); map.put("accessToken",access_token); map.put("expireDate", String.valueOf(expireDate.getTime())); return map; } }