ConversationContentServiceImpl.java 30 KB

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