ConversationContentServiceImpl.java 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699
  1. package com.kede.wechat.service.impl;
  2. import com.kede.common.dao.ChatMsgMapper;
  3. import com.kede.common.dao.ChatMsgOptimizeMapper;
  4. import com.kede.common.enums.WechatSmgTypeEnum;
  5. import com.kede.common.model.ChatMsg;
  6. import com.kede.common.model.ChatMsgOptimize;
  7. import com.kede.common.model.ChatMsgUser;
  8. import com.kede.common.utils.DateUtils;
  9. import com.kede.common.utils.HttpUtils;
  10. import com.kede.common.utils.RSAEncrypt;
  11. import com.kede.common.utils.StringUtils;
  12. import com.kede.core.mybatis.BaseMybatisDao;
  13. import com.kede.wechat.bo.ChatMsgUserBo;
  14. import com.kede.wechat.bo.InputChatMsg;
  15. import com.kede.wechat.bo.InputGetChatName;
  16. import com.kede.wechat.bo.InputgetUserMsg;
  17. import com.kede.wechat.service.ConversationContentService;
  18. import com.tencent.wework.Finance;
  19. import org.json.JSONArray;
  20. import org.json.JSONObject;
  21. import org.slf4j.Logger;
  22. import org.slf4j.LoggerFactory;
  23. import org.springframework.beans.factory.annotation.Value;
  24. import org.springframework.data.redis.core.RedisTemplate;
  25. import org.springframework.stereotype.Service;
  26. import com.kede.common.dao.ChatMsgUserMapper;
  27. import javax.annotation.Resource;
  28. import java.io.File;
  29. import java.io.FileOutputStream;
  30. import java.io.UnsupportedEncodingException;
  31. import java.util.*;
  32. import java.util.stream.Collectors;
  33. import static sun.plugin2.os.windows.OSVERSIONINFOA.size;
  34. @Service("ConversationContentService")
  35. public class ConversationContentServiceImpl extends BaseMybatisDao<ChatMsgUserMapper> implements ConversationContentService {
  36. static String priKey ="-----BEGIN PRIVATE KEY-----\n" +
  37. "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCnh5N/kiyeNx/y\n" +
  38. "dDKe3FO8HWj8tuQQUCkCc8ol1Sqmcs9ey7S2189UDbZOPeY2xiiMD6AdFVUK5Y0P\n" +
  39. "gbX/XZFVizhwXseE+1IV1k0w3C++5Y4Zll7nZoJ05ANMbj+dlamAlNYOutmc0lZf\n" +
  40. "CGXM5oeu+U0XDWE1+uY7TRAGV3OcA7GBraXiothncbkNf0ZwfBEGVyLNHcNODgwz\n" +
  41. "ECc0KJuEF2V+UAt11HloT60atSmdiktwbJ6KOJ62TM/eU+F/5d3UJLdw0Xb8kEFn\n" +
  42. "PYK/1mD8PGKFA6F0wSajNLc6iPg5mgiOS5j02N2+nEN8m7vIdL7Hd0yrigf5kEdl\n" +
  43. "x9PC7OYpAgMBAAECggEAIUhSCVok+xnAgw6Kr/zdtdWx8eLz1DnYq+ANHQ8IdiEB\n" +
  44. "Cbg2osylJ/HBcjHh9qfPjmPcT2rZhlysdZQzcBRKt0/9WnW59bVoTWZR148m/Snl\n" +
  45. "3Td+i0JWUJqr/Rc6FDiTgDQRgsOkT/+JoT+t2dNCyYRFyHqkAXFjJAzfTiM5mJjg\n" +
  46. "h8q7bU/LXoc49kuaNYmt5rV1nACoIh7MmKZpmR4OKXDWrl52Xt5qCEonp3bAH/S3\n" +
  47. "HaTqsoqot7fF5aZWEuDWUeYQPzgVSsdw2k9Lq1c8aoE15IRfQCxtBOYpk8LEDJty\n" +
  48. "JIGHrzBEHP7cok4UdBWbfuI1YjqmjefQovQumKqfcQKBgQDlXDrFFvx+k9pUI2bo\n" +
  49. "KXcqroOcpdsssO5uJOG1PwuM02wIR0hP1d89fItFwLLuzjb+jeyN3qwFgoh21fkk\n" +
  50. "Z3HkxubMY4fpXk1mAsTPUZxll8YYgGE7tXk1Rk5xsBMzlFRW88N7Ww/rQMBOlpJA\n" +
  51. "6UfZGFYMezb1vXf7u3M4w/N22wKBgQC6/OF5DsCHAOui8CPXS2z2YTKuoOJmHKIe\n" +
  52. "vBeXy+ic+YRuTBXgA0Z1wL4xDW/LeCqoTmetbTuvGSyahMV4QSK0pxH9gk80sH4+\n" +
  53. "YEza3DLASxr4gSsr2fL6siuXN/OHyMClQb6JVa0yuPG1zLzShaIXYVAyz1m9rU1B\n" +
  54. "JpQfbEV8SwKBgGnBDvAVWzLZ5Y9qC2b8x4+Mi+7MorSGmEl9A/1YJnE2gteGVpdJ\n" +
  55. "G/fz1xvAcECgIMdalToM8/BOcbGpk4jvkZpVA9I2ClLWQoXIvQqCrMRDKPnfJ/Yq\n" +
  56. "BMtFsaHF9/SObhzxpK7aHAry/ji+QI1hgtlc2UBEB+FjDVGq6sO/xiCFAoGAV/3Y\n" +
  57. "PJdskhskx7AprY6Y3/gtWW/sGhEvWTc6Avy5oeTpJN45DQl9hrwExCCGk0EhEcKT\n" +
  58. "l1Dn3SYDj1MbedNs+YYFOT6w9yJ2xfObNwKX/1VYg8iFAEW3ybE+QhLaTvNxdFLT\n" +
  59. "zty6fDv7wolt8cNg24+3pbFdkZyT1izJV2Aj8rECgYBZQMObUgJ57n8FrXCdcdSa\n" +
  60. "MGsFYl8KUZa1zvzhoi3h7YtbVNNtSHcEK7VDyIheBt9pFCN7nuDX3jW2XYW2USEC\n" +
  61. "T7Pab2DAXPkRmXspWNID21G+AqqGSLD4pk9+ZmqevTfAtI+ajiu5NH1guH73rVOM\n" +
  62. "xGjQ5dCmWpUGt4fmO+zWIw==\n" +
  63. "-----END PRIVATE KEY-----";
  64. static String pubKey ="-----BEGIN PUBLIC KEY-----\n" +
  65. "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp4eTf5Isnjcf8nQyntxT\n" +
  66. "vB1o/LbkEFApAnPKJdUqpnLPXsu0ttfPVA22Tj3mNsYojA+gHRVVCuWND4G1/12R\n" +
  67. "VYs4cF7HhPtSFdZNMNwvvuWOGZZe52aCdOQDTG4/nZWpgJTWDrrZnNJWXwhlzOaH\n" +
  68. "rvlNFw1hNfrmO00QBldznAOxga2l4qLYZ3G5DX9GcHwRBlcizR3DTg4MMxAnNCib\n" +
  69. "hBdlflALddR5aE+tGrUpnYpLcGyeijietkzP3lPhf+Xd1CS3cNF2/JBBZz2Cv9Zg\n" +
  70. "/DxihQOhdMEmozS3Ooj4OZoIjkuY9NjdvpxDfJu7yHS+x3dMq4oH+ZBHZcfTwuzm\n" +
  71. "KQIDAQAB\n" +
  72. "-----END PUBLIC KEY-----";
  73. Logger logger = LoggerFactory.getLogger(ConversationContentServiceImpl.class);
  74. @Value(value = "${conversationContent.corpid}")
  75. private String corpid;
  76. @Value(value = "${conversationContent.secret}")
  77. private String secret;
  78. @Value(value = "${conversationContent.app.secret}")
  79. private String appSecret;
  80. @Value(value = "${conversationContent.addressBook.secret}")
  81. private String addressBookSecret;
  82. @Value(value = "${upload.path}")
  83. private String uploadPath;
  84. @Resource
  85. private RedisTemplate redisTemplate;
  86. @Resource
  87. private ChatMsgUserMapper chatMsgUserMapper;
  88. @Resource
  89. private ChatMsgMapper chatMsgMapper;
  90. @Resource
  91. private ChatMsgOptimizeMapper chatMsgOptimizeMapper;
  92. @Override
  93. public Map<String,Object> pushChatData(Integer pageSeq, Integer pageLimit) {
  94. String message = null;
  95. Map<String,Object> map = new HashMap<>();
  96. List<InputChatMsg> list = new ArrayList<>();
  97. Integer total = 0;
  98. long sdk = Finance.NewSdk();
  99. System.out.println(Finance.Init(sdk, corpid, secret));
  100. long ret = 0;
  101. int seq = 0;
  102. int limit = 200;
  103. if (pageSeq != null || pageLimit!=null){
  104. seq=pageSeq;
  105. limit = pageLimit;
  106. }
  107. long slice = Finance.NewSlice();
  108. ret = Finance.GetChatData(sdk, seq, limit, null, null, 3, slice);
  109. if (ret != 0) {
  110. System.out.println("getchatdata ret " + ret);
  111. }
  112. String getchatdata = Finance.GetContentFromSlice(slice);
  113. JSONObject jo = new JSONObject(getchatdata);
  114. JSONArray chatdata = jo.getJSONArray("chatdata");
  115. total=chatdata.length();
  116. System.out.println("消息数:" + total);
  117. Date earlyToday = DateUtils.getEarlyToday();
  118. Date date = DateUtils.getDateBefore(earlyToday, -1);
  119. for (int i = 0; i < chatdata.length(); i++) {
  120. String item = chatdata.get(i).toString();
  121. // item:{
  122. // "publickey_ver":1,
  123. // "encrypt_chat_msg":"XSeHr+qM0YfX/q5WWvmnVEuL2E4U0RclkIbK9JnWQq7Y/0Ynir3srKh+9DH6BqRj/NYXKmUC65+0WRo
  124. // QboW3dC200XTqVNj+z0kljl11HdNmjuS3p7g0L+DYG5Bdz6Lo8FuHf/5WkOVi/R5VxOO6FvU+PediEOSCBN2dVHCeyIvExCk5mh
  125. // o+ME9QV/Q19HujmHpxzl3cu1XvBAZ7YvIpd2d/BCCI9JwmBc5bXr2FQ0r/PFkZadKGjw0cxqPyNIBkNc+ic0wHhWSZFTvY3qDW2
  126. // FFAdkYW68w8PA5f+8gD9VUuxKzz/j3Fu/6547Ayyuo93lPtbud5lAWXyeLexyHujFmdr300MA44BoYZsuTqdVsHbtEGLw967kO1
  127. // oHcImidD416ZuQh2VZiOYTJMtDZALdB1tXramb7kFj0AsKloFLKeg3ks3TYRKwEmM9wJ/y2hGDJzq5xncBFFShbLao5u",
  128. // "msgid":"1634016854685227651_1749628622146_external",
  129. // "encrypt_random_key":"kJ3XJM7CB7DGZqFxSfT8+EDWfr8vZmVVKzKLl5FM47Sd7iUSlgZF/a4dm5sTpCMW3uzk/m1LZV4odH
  130. // RyVO2+AaVJsidMoLV2LmmWiCAuXkzdK4yDbGItkvpZGrilgAlJjR8EhsUuqXOjvxkUemGvKMhrUqKdCaO4p3GYT/cxMRJDUmrP0v
  131. // TQqdgwznQOSubbBFDdMTSAfEtZnGp5tOQdCNFCbIqks4/Y8Isd/nd/Kq3QNsXjE+GdZkqVuOqRujOeCeqFRJF022i2KFuJQ+R+7X
  132. // 1es92NKBbaNT1AlRNfjtACH1KrPRLlEnmAS0EUIWWmn45/kOpH3T4ovOuNDnrafw==",
  133. // "seq":1}
  134. JSONObject data = new JSONObject(item);
  135. String encrypt_random_key = data.getString("encrypt_random_key");
  136. String encrypt_chat_msg = data.getString("encrypt_chat_msg");
  137. long msg = Finance.NewSlice();
  138. try {
  139. message = RSAEncrypt.decryptRSA(encrypt_random_key, priKey);
  140. ret = Finance.DecryptData(sdk, message, encrypt_chat_msg, msg);
  141. if (ret != 0) {
  142. System.out.println("getchatdata ret " + ret);
  143. // return;
  144. }
  145. String str = String.valueOf(Finance.GetContentFromSlice(msg));
  146. com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(str);
  147. String msgtype = jsonObject.getString("msgtype");
  148. InputChatMsg chatMsg = new InputChatMsg(jsonObject);
  149. if (chatMsg.getMsgtime().getTime()>date.getTime()){
  150. //处理数据
  151. ChatMsgOptimize chatMsgOptimize = chatMsgOptimizeMapper.selectById(chatMsg.getMsgid());
  152. if (chatMsgOptimize==null){
  153. chatMsgOptimize = new ChatMsgOptimize();
  154. chatMsgOptimize.setMsgid(chatMsg.getMsgid());
  155. chatMsgOptimize.setMsgtime(chatMsg.getMsgtime());
  156. chatMsgOptimizeMapper.insert(chatMsgOptimize);
  157. pushSmgType(msgtype, jsonObject, sdk, chatMsg);
  158. list.add(chatMsg);
  159. }
  160. }
  161. } catch (Exception e) {
  162. e.printStackTrace();
  163. }
  164. }
  165. Finance.FreeSlice(slice);
  166. map.put("list",list);
  167. map.put("total",total);
  168. return map;
  169. }
  170. private void pushSmgType(String msgtype, com.alibaba.fastjson.JSONObject jsonObject, long sdk, InputChatMsg chatMsg) {
  171. if (msgtype.equals("text"))
  172. {
  173. //文档
  174. com.alibaba.fastjson.JSONObject text = jsonObject.getJSONObject("text");
  175. if (text!=null){
  176. String content1 = text.getString("content");
  177. // chatMsg.setContent(pushCharset(content1));
  178. chatMsg.setContent(content1);
  179. }
  180. }else if (msgtype.equals("link"))
  181. {
  182. //链接
  183. com.alibaba.fastjson.JSONObject link = jsonObject.getJSONObject("link");
  184. chatMsg.setMsgurl(link.getString("link_url"));
  185. chatMsg.setContent(pushCharset(link.getString("title")));
  186. }else if (msgtype.equals("mixed"))
  187. {
  188. //混合
  189. System.out.println("=+++++++++++++++++++++++++++++++++++++"+jsonObject);
  190. com.alibaba.fastjson.JSONObject mixed = jsonObject.getJSONObject("mixed");
  191. com.alibaba.fastjson.JSONArray item = mixed.getJSONArray("item");
  192. for (int j = 0; j < item.size(); j++) {
  193. com.alibaba.fastjson.JSONObject e = item.getJSONObject(j);
  194. String type = e.getString("type");
  195. if (type.equals("text")){
  196. com.alibaba.fastjson.JSONObject contentJson = e.getJSONObject("content");
  197. String content = contentJson.getString("content");
  198. chatMsg.setContent(content);
  199. }else {
  200. String url ="";
  201. com.alibaba.fastjson.JSONObject content = e.getJSONObject("content");
  202. String sdkfileid=content.getString("sdkfileid");
  203. if (type.equals("file")){
  204. String filename = content.getString("filename");
  205. String osname = System.getProperties().getProperty("os.name");
  206. if (osname.contains("Windows")) {
  207. // filename = new String(filename.getBytes("GBK"),"UTF-8");
  208. String safeName=filename.replaceAll("[<>:\"/\\\\|?*,、]", "_");
  209. url="/wechat/"+ safeName;
  210. }
  211. }else if (type.equals("image")) {
  212. url="/wechat/" + System.currentTimeMillis() + ".jpg";
  213. com.alibaba.fastjson.JSONObject image = jsonObject.getJSONObject("image");
  214. }else {
  215. chatMsg.setContent(chatMsg.getContent()+"[附件="+e+"]");
  216. }
  217. downloadFile(sdk, sdkfileid, uploadPath+ url);
  218. chatMsg.setMsgurl(url);
  219. }
  220. }
  221. } else if (msgtype.equals("sphfeed"))
  222. {
  223. chatMsg.setContent(jsonObject.getString("sphfeed"));
  224. } else if (msgtype.equals("file")||msgtype.equals("image")||msgtype.equals("video")||msgtype.equals("voice"))
  225. {
  226. String url=pushFileUrl(sdk, msgtype, jsonObject);
  227. chatMsg.setMsgurl(url);
  228. } else {
  229. chatMsg.setContent(pushCharset(jsonObject.toJSONString()));
  230. }
  231. }
  232. private String pushCharset(String content1) {
  233. String str ;
  234. try {
  235. String osname = System.getProperties().getProperty("os.name");
  236. if (osname.contains("Windows")) {
  237. String result = new String(content1.getBytes("GBK"),"UTF-8");
  238. str=result;
  239. }else{
  240. str=content1;
  241. }
  242. } catch (UnsupportedEncodingException e) {
  243. throw new RuntimeException(e);
  244. }
  245. return str;
  246. }
  247. private String pushFileUrl(long sdk, String msgtype, com.alibaba.fastjson.JSONObject jsonObject) {
  248. String url = "";
  249. String sdkfileid=null;
  250. if (msgtype.equals("file")){
  251. com.alibaba.fastjson.JSONObject file = jsonObject.getJSONObject("file");
  252. String filename = file.getString("filename");
  253. sdkfileid = file.getString("sdkfileid");
  254. String osname = System.getProperties().getProperty("os.name");
  255. if (osname.contains("Windows")) {
  256. // filename = new String(filename.getBytes("GBK"),"UTF-8");
  257. String safeName=filename.replaceAll("[<>:\"/\\\\|?*,、]", "_");
  258. url = "/wechat/"+ safeName;
  259. }
  260. }else if (msgtype.equals("image")){
  261. url = "/wechat/"+ System.currentTimeMillis()+".jpg";
  262. com.alibaba.fastjson.JSONObject image = jsonObject.getJSONObject("image");
  263. sdkfileid = image.getString("sdkfileid");
  264. }else if (msgtype.equals("voice")){
  265. url = "/wechat/"+ System.currentTimeMillis()+".mp3";
  266. com.alibaba.fastjson.JSONObject image = jsonObject.getJSONObject("voice");
  267. sdkfileid = image.getString("sdkfileid");
  268. }else if (msgtype.equals("video")){
  269. url = url +"/wechat/"+ System.currentTimeMillis()+".mp4";
  270. com.alibaba.fastjson.JSONObject image = jsonObject.getJSONObject("video");
  271. }
  272. // 下载文件
  273. downloadFile(sdk, sdkfileid, uploadPath+url);
  274. return url;
  275. }
  276. private void downloadFile(long sdk, String sdkfileid, String url) {
  277. String indexbuf = "";
  278. while(true){
  279. //每次使用GetMediaData拉取存档前需要调用NewMediaData获取一个media_data,在使用完media_data中数据后,还需要调用FreeMediaData释放。
  280. long media_data = Finance.NewMediaData();
  281. int ret = Finance.GetMediaData(sdk, indexbuf, sdkfileid, null, null, 3, media_data);
  282. if(ret!=0){
  283. System.out.println("getmediadata ret:" + ret);
  284. Finance.FreeMediaData(media_data);
  285. return;
  286. }
  287. 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));
  288. try {
  289. File file = new File(url);
  290. if (!file.getParentFile().exists()) {
  291. file.getParentFile().mkdirs(); // 自动创建缺失的父目录
  292. }
  293. //大于512k的文件会分片拉取,此处需要使用追加写,避免后面的分片覆盖之前的数据。
  294. FileOutputStream outputStream = new FileOutputStream(url, true);
  295. outputStream.write(Finance.GetData(media_data));
  296. outputStream.close();
  297. } catch (Exception e) {
  298. e.printStackTrace();
  299. }
  300. if(Finance.IsMediaDataFinish(media_data) == 1)
  301. {
  302. //已经拉取完成最后一个分片
  303. Finance.FreeMediaData(media_data);
  304. break;
  305. }
  306. else
  307. {
  308. //获取下次拉取需要使用的indexbuf
  309. indexbuf = Finance.GetOutIndexBuf(media_data);
  310. Finance.FreeMediaData(media_data);
  311. }
  312. }
  313. }
  314. @Override
  315. public String getAccessToken() {
  316. //获取redis缓存数据
  317. String accessToken = null;
  318. Map<String,String> accessMap = (Map<String, String>) redisTemplate.opsForValue().get("ACCESS_TOKEN");
  319. if (accessMap == null){
  320. logger.debug("getAccessToken无缓存从接口获取");
  321. Map<String, String> map = getAccessMap(corpid, secret);
  322. //新增redis缓存数据
  323. redisTemplate.opsForValue().set("ACCESS_TOKEN",map);
  324. accessToken = map.get("accessToken");
  325. }else {
  326. logger.debug("getAccessToken有缓存从缓存获取");
  327. accessToken = accessMap.get("accessToken");
  328. Long expireDate = Long.valueOf(accessMap.get("expireDate"));
  329. if (expireDate < System.currentTimeMillis()){
  330. logger.debug("getAccessToken缓存已过期从接口获取");
  331. Map<String, String> map = getAccessMap(corpid, secret);
  332. accessToken = map.get("accessToken");
  333. //新增redis缓存数据
  334. redisTemplate.opsForValue().set("ACCESS_TOKEN",map);
  335. }
  336. }
  337. return accessToken;
  338. }
  339. public String getAddressBookAccessToken() {
  340. //获取redis缓存数据
  341. String accessToken = null;
  342. Map<String,String> accessMap = (Map<String, String>) redisTemplate.opsForValue().get("ADDRESS_BOOK_ACCESS_TOKEN");
  343. if (accessMap == null){
  344. logger.debug("ADDRESS_BOOK无缓存从接口获取");
  345. Map<String, String> map = getAccessMap(corpid, secret);
  346. //新增redis缓存数据
  347. redisTemplate.opsForValue().set("ADDRESS_BOOK_ACCESS_TOKEN",map);
  348. accessToken = map.get("accessToken");
  349. }else {
  350. logger.debug("ADDRESS_BOOK有缓存从缓存获取");
  351. accessToken = accessMap.get("accessToken");
  352. Long expireDate = Long.valueOf(accessMap.get("expireDate"));
  353. if (expireDate < System.currentTimeMillis()){
  354. logger.debug("ADDRESS_BOOK缓存已过期从接口获取");
  355. Map<String, String> map = getAccessMap(corpid, secret);
  356. accessToken = map.get("accessToken");
  357. //新增redis缓存数据
  358. redisTemplate.opsForValue().set("ADDRESS_BOOK_ACCESS_TOKEN",map);
  359. }
  360. }
  361. return accessToken;
  362. }
  363. @Override
  364. public String getAppAccessToken() {
  365. //获取redis缓存数据
  366. String accessToken = null;
  367. Map<String,String> accessMap = (Map<String, String>) redisTemplate.opsForValue().get("ADDRESS_BOOK_ACCESS_TOKEN");
  368. if (accessMap == null){
  369. logger.debug("APP_ACCESS_TOKEN无缓存从接口获取");
  370. Map<String, String> map = getAccessMap(corpid,appSecret);
  371. //新增redis缓存数据
  372. redisTemplate.opsForValue().set("APP_ACCESS_TOKEN",map);
  373. accessToken = map.get("accessToken");
  374. }else {
  375. logger.debug("APP_ACCESS_TOKEN有缓存从缓存获取");
  376. accessToken = accessMap.get("accessToken");
  377. Long expireDate = Long.valueOf(accessMap.get("expireDate"));
  378. if (expireDate < System.currentTimeMillis()){
  379. logger.debug("APP_ACCESS_TOKEN缓存已过期从接口获取");
  380. Map<String, String> map = getAccessMap(corpid,appSecret);
  381. accessToken = map.get("accessToken");
  382. //新增redis缓存数据
  383. redisTemplate.opsForValue().set("APP_ACCESS_TOKEN",map);
  384. }
  385. }
  386. return accessToken;
  387. }
  388. @Override
  389. public String getPermitUserList() {
  390. String url=String.format("https://qyapi.weixin.qq.com/cgi-bin/msgaudit/get_permit_user_list?access_token=%s",getAccessToken());
  391. com.alibaba.fastjson.JSONObject result = HttpUtils.httpGet(url);
  392. if (result.getInteger("errcode")==0){
  393. List<String> ids = result.getJSONArray("ids").toJavaList(String.class);
  394. ids.stream().forEach(System.out::println);
  395. }else {
  396. System.out.println(result.getString("errcode"));
  397. System.out.println("获取会话内容存档成员列表失败");
  398. }
  399. pushGetChatName(result.toJSONString());
  400. return null;
  401. }
  402. @Override
  403. public Map<String,Object> pushGetChatName(String userId) {
  404. Map<String,Object> map = new HashMap<>();
  405. Integer i = 0;
  406. ChatMsgUser chatMsgUser = chatMsgUserMapper.selectByUserId(userId);
  407. if (chatMsgUser != null){
  408. map.put("name",chatMsgUser.getName());
  409. map.put("code",i);
  410. return map;
  411. }else {
  412. String msgIdSub = userId.substring(0, 2);
  413. String url=null;
  414. Integer type;
  415. if (msgIdSub.equals("wb")){
  416. type=0;
  417. // url=String.format("https://qyapi.weixin.qq.com/cgi-bin/msgaudit/get_robot_info??access_token=%s&robot_id=%s",getAppAccessToken(),userId);
  418. }else if (msgIdSub.equals("wo")||msgIdSub.equals("wm")){
  419. // https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get
  420. url=String.format("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get?access_token=%s&external_userid=%s",getAppAccessToken(),userId);
  421. type=1;
  422. }else {
  423. url=String.format("https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=%s&userid=%s",getAccessToken(),userId);
  424. type=2;
  425. }
  426. Map<String, Object> maps = getUserName(url, type);
  427. Object o = maps.get("name");
  428. String userName = null;
  429. if(o!=null){
  430. userName = o.toString();
  431. }
  432. map.put ("code", maps.get("code"));
  433. chatMsgUser = new ChatMsgUser();
  434. chatMsgUser.setUserId(userId);
  435. chatMsgUser.setType(type);
  436. chatMsgUser.setCreateTime(new Date());
  437. if (StringUtils.isNotBlank(userName)){
  438. chatMsgUser.setName(userName);
  439. map.put("name",userName);
  440. }
  441. chatMsgUserMapper.insert(chatMsgUser);
  442. if (StringUtils.isBlank(userName)){
  443. String str = "未知(" + chatMsgUser.getId() + ")";
  444. chatMsgUser.setName(str);
  445. map.put("name",str);
  446. chatMsgUserMapper.update(chatMsgUser);
  447. }
  448. return map;
  449. }
  450. }
  451. /**
  452. * errorGode 错误码
  453. * 301059=非内部群,不提供数据
  454. * 90501=该群不是客户群
  455. * @param chatMsg
  456. * @return
  457. */
  458. @Override
  459. public String pushGetRoomName(ChatMsg chatMsg) {
  460. String roomname=null;
  461. // https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/get?access_token=ACCESS_TOKEN
  462. String roomid = chatMsg.getRoomid();
  463. ChatMsgUser chatMsgUser = chatMsgUserMapper.selectByUserId(roomid);
  464. if (chatMsgUser != null){
  465. return chatMsgUser.getName();
  466. }else {
  467. //查询编号中有没有external
  468. String msgIdSub = chatMsg.getMsgid();
  469. int i = msgIdSub.indexOf("external");
  470. if (i>0){
  471. String url=String.format("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/get?access_token=%s",getAppAccessToken());
  472. Map<String,Object> map = new HashMap<String, Object>();
  473. map.put("chat_id",roomid);
  474. map.put("cursor",0);
  475. com.alibaba.fastjson.JSONObject jsonObject = HttpUtils.httpPost(url, map);
  476. roomname = jsonObject.getString("roomname");
  477. if (StringUtils.isBlank(roomname)){
  478. com.alibaba.fastjson.JSONObject groupChat = jsonObject.getJSONObject("group_chat");
  479. if (groupChat!=null){
  480. roomname = groupChat.getString("name");
  481. }
  482. }
  483. if (jsonObject.getInteger("errcode")==0){
  484. }else {
  485. System.out.println("获取外部群名称失败"+jsonObject.getString("errcode"));
  486. }
  487. }
  488. else
  489. {
  490. //https://qyapi.weixin.qq.com/cgi-bin/msgaudit/groupchat/get
  491. String url=String.format("https://qyapi.weixin.qq.com/cgi-bin/msgaudit/groupchat/get?access_token=%s",getAccessToken());
  492. Map<String,Object> map = new HashMap<String, Object>();
  493. map.put("roomid",roomid);
  494. com.alibaba.fastjson.JSONObject jsonObject = HttpUtils.httpPost(url, map);
  495. System.out.println(jsonObject.toJSONString());
  496. roomname = jsonObject.getString("roomname");
  497. if (StringUtils.isBlank(roomname)){
  498. com.alibaba.fastjson.JSONObject groupChat = jsonObject.getJSONObject("group_chat");
  499. roomname = groupChat.getString("name");
  500. }
  501. if (jsonObject.getInteger("errcode")==0){
  502. }else {
  503. System.out.println("获取内部群名称失败"+jsonObject.getString("errcode"));
  504. }
  505. }
  506. chatMsgUser = new ChatMsgUser();
  507. chatMsgUser.setUserId(roomid);
  508. chatMsgUser.setType(3);
  509. chatMsgUser.setCreateTime(new Date());
  510. if (StringUtils.isNotBlank(roomname)){
  511. chatMsgUser.setName(roomname);
  512. }
  513. chatMsgUserMapper.insert(chatMsgUser);
  514. if (StringUtils.isBlank(roomname)){
  515. chatMsgUser.setName("未知群("+chatMsgUser.getId()+")");
  516. chatMsgUserMapper.update(chatMsgUser);
  517. }
  518. }
  519. return roomname;
  520. }
  521. @Override
  522. public Object getMsgData(InputGetChatName in) {
  523. List<ChatMsgUser> list = chatMsgUserMapper.getUserList(2);
  524. list.forEach(e->{
  525. //查询每个人的所有信息
  526. List<ChatMsg> chatMsgs = chatMsgMapper.selectMsgById(e.getUserId(),null);
  527. List<ChatMsg> collect = chatMsgs.stream().filter(e1 -> e1.getType().equals(0)).collect(Collectors.toList());
  528. List<ChatMsg> collect1 = chatMsgs.stream().filter(e1 -> e1.getType().equals(1)).collect(Collectors.toList());
  529. List<String> toUser=new ArrayList<>();
  530. List<String> toList=new ArrayList<>();
  531. collect.forEach(e1->{
  532. if (e1.getFromId().equals(e.getUserId())){
  533. if (!toUser.contains(e1.getTolist())){
  534. toUser.add(e1.getTolist());
  535. }
  536. }else {
  537. if (!toUser.contains(e1.getFromId())){
  538. toUser.add(e1.getFromId());
  539. }
  540. }
  541. });
  542. collect1.forEach(e1->{
  543. if (e1.getFromId().equals(e.getUserId())){
  544. if (!toList.contains(e1.getRoomid())){
  545. toList.add(e1.getRoomid());
  546. }
  547. }else {
  548. if (!toList.contains(e1.getRoomid())){
  549. toList.add(e1.getRoomid());
  550. }
  551. }
  552. });
  553. System.out.println(e.getName()+"单聊有:");
  554. toUser.forEach(System.out::println);
  555. System.out.println("================================");
  556. System.out.println(e.getName()+"群聊有:");
  557. toList.forEach(System.out::println);
  558. });
  559. return list;
  560. }
  561. @Override
  562. public Object getUserMsg(InputgetUserMsg in) {
  563. List<ChatMsgUser> list = chatMsgUserMapper.getUserList(2);
  564. return list;
  565. }
  566. @Override
  567. public Object getMyIdByUser(InputgetUserMsg in) {
  568. if (in.getEndTime()!=null)in.setEndTime(in.getEndTime()+" 23:59:59");
  569. return chatMsgUserMapper.selectMyIdByUser(in);
  570. }
  571. @Override
  572. public Object getMyIdByRoom(InputgetUserMsg in) {
  573. if (in.getEndTime()!=null)in.setEndTime(in.getEndTime()+" 23:59:59");
  574. return chatMsgUserMapper.selectMyIdByRoom(in);
  575. }
  576. @Override
  577. public Object getMsgList(InputgetUserMsg in) {
  578. if (in.getEndTime()!=null)in.setEndTime(in.getEndTime()+" 23:59:59");
  579. List<ChatMsg> chatMsgs=new ArrayList<>();
  580. if (StringUtils.isNotEmpty(in.getRoomId())){
  581. chatMsgs = chatMsgMapper.selectByRoomId(in);
  582. }else if (StringUtils.isNotEmpty(in.getUserId())&&StringUtils.isNotEmpty(in.getFoId())){
  583. chatMsgs = chatMsgMapper.selectByUserIdAndFoId(in);
  584. //将list按时间先后排序
  585. chatMsgs.sort(Comparator.comparing(ChatMsg::getMsgtime));
  586. }
  587. for (ChatMsg e : chatMsgs) {
  588. WechatSmgTypeEnum field = WechatSmgTypeEnum.getField(e.getMsgtype());
  589. if (field==null){
  590. e.setMsgType(e.getMsgtype());
  591. }else {
  592. String desc = field.getDesc();
  593. e.setMsgType(desc);
  594. }
  595. if (e.getType()==0){
  596. e.setTypeName("单聊");
  597. }else if (e.getType()==1){
  598. e.setTypeName("群聊");
  599. }
  600. }
  601. return chatMsgs;
  602. }
  603. private Map<String,Object> getUserName(String url,Integer type){
  604. String name = null;
  605. Integer code=0;
  606. Map<String,Object> map=new HashMap<String, Object>();
  607. if (type==0) {
  608. name="机器人";
  609. }else if (type==1){
  610. com.alibaba.fastjson.JSONObject result = HttpUtils.httpGet(url);
  611. if (result.getInteger("errcode")==0) {
  612. System.out.println(result.toJSONString());
  613. com.alibaba.fastjson.JSONObject externalContact = result.getJSONObject("external_contact");
  614. name=externalContact.getString("name");
  615. }else {
  616. code = result.getInteger("errcode");
  617. System.out.println(result.toJSONString());
  618. System.out.println("获取外部联系人名称失败");
  619. }
  620. }else if (type==2){
  621. com.alibaba.fastjson.JSONObject result = HttpUtils.httpGet(url);
  622. if (result.getInteger("errcode")==0) {
  623. System.out.println(result.toJSONString());
  624. com.alibaba.fastjson.JSONObject externalContact = result.getJSONObject("external_contact");
  625. name = result.getString("name");
  626. }else {
  627. System.out.println(result.toJSONString());
  628. code = result.getInteger("errcode");
  629. }
  630. }
  631. map.put("name",name);
  632. map.put("code",code);
  633. return map;
  634. }
  635. private Map<String, String> getAccessMap(String corpid, String secret) {
  636. String url=String.format("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s",corpid,secret);
  637. Date date = new Date();
  638. com.alibaba.fastjson.JSONObject jsonObject = HttpUtils.httpGet(url);
  639. String access_token = (String) jsonObject.get("access_token");
  640. Integer expires_in = (Integer) jsonObject.get("expires_in");
  641. //时间加上过期时间
  642. Date expireDate = DateUtils.addMilliseconds(date, expires_in*1000);
  643. Map<String,String> map = new HashMap<>();
  644. map.put("accessToken",access_token);
  645. map.put("expireDate", String.valueOf(expireDate.getTime()));
  646. return map;
  647. }
  648. }