ConversationContentServiceImpl.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. package com.kede.wechat.service.impl;
  2. import com.kede.common.model.ChatMsgUser;
  3. import com.kede.common.utils.DateUtils;
  4. import com.kede.common.utils.HttpUtils;
  5. import com.kede.common.utils.RSAEncrypt;
  6. import com.kede.common.utils.StringUtils;
  7. import com.kede.wechat.bo.InputChatMsg;
  8. import com.kede.wechat.service.ConversationContentService;
  9. import com.tencent.wework.Finance;
  10. import org.json.JSONArray;
  11. import org.json.JSONObject;
  12. import org.slf4j.Logger;
  13. import org.slf4j.LoggerFactory;
  14. import org.springframework.beans.factory.annotation.Value;
  15. import org.springframework.data.redis.core.RedisTemplate;
  16. import org.springframework.stereotype.Service;
  17. import com.kede.common.dao.ChatMsgUserMapper;
  18. import javax.annotation.Resource;
  19. import java.util.*;
  20. @Service("ConversationContentService")
  21. public class ConversationContentServiceImpl implements ConversationContentService {
  22. Logger logger = LoggerFactory.getLogger(ConversationContentServiceImpl.class);
  23. @Resource
  24. private RedisTemplate redisTemplate;
  25. @Resource
  26. private ChatMsgUserMapper chatMsgUserMapper;
  27. @Value(value = "${conversationContent.corpid}")
  28. private String corpid;
  29. @Value(value = "${conversationContent.secret}")
  30. private String secret;
  31. @Value(value = "${conversationContent.addressBook.secret}")
  32. private String addressBookSecret;
  33. static String priKey ="-----BEGIN PRIVATE KEY-----\n" +
  34. "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCnh5N/kiyeNx/y\n" +
  35. "dDKe3FO8HWj8tuQQUCkCc8ol1Sqmcs9ey7S2189UDbZOPeY2xiiMD6AdFVUK5Y0P\n" +
  36. "gbX/XZFVizhwXseE+1IV1k0w3C++5Y4Zll7nZoJ05ANMbj+dlamAlNYOutmc0lZf\n" +
  37. "CGXM5oeu+U0XDWE1+uY7TRAGV3OcA7GBraXiothncbkNf0ZwfBEGVyLNHcNODgwz\n" +
  38. "ECc0KJuEF2V+UAt11HloT60atSmdiktwbJ6KOJ62TM/eU+F/5d3UJLdw0Xb8kEFn\n" +
  39. "PYK/1mD8PGKFA6F0wSajNLc6iPg5mgiOS5j02N2+nEN8m7vIdL7Hd0yrigf5kEdl\n" +
  40. "x9PC7OYpAgMBAAECggEAIUhSCVok+xnAgw6Kr/zdtdWx8eLz1DnYq+ANHQ8IdiEB\n" +
  41. "Cbg2osylJ/HBcjHh9qfPjmPcT2rZhlysdZQzcBRKt0/9WnW59bVoTWZR148m/Snl\n" +
  42. "3Td+i0JWUJqr/Rc6FDiTgDQRgsOkT/+JoT+t2dNCyYRFyHqkAXFjJAzfTiM5mJjg\n" +
  43. "h8q7bU/LXoc49kuaNYmt5rV1nACoIh7MmKZpmR4OKXDWrl52Xt5qCEonp3bAH/S3\n" +
  44. "HaTqsoqot7fF5aZWEuDWUeYQPzgVSsdw2k9Lq1c8aoE15IRfQCxtBOYpk8LEDJty\n" +
  45. "JIGHrzBEHP7cok4UdBWbfuI1YjqmjefQovQumKqfcQKBgQDlXDrFFvx+k9pUI2bo\n" +
  46. "KXcqroOcpdsssO5uJOG1PwuM02wIR0hP1d89fItFwLLuzjb+jeyN3qwFgoh21fkk\n" +
  47. "Z3HkxubMY4fpXk1mAsTPUZxll8YYgGE7tXk1Rk5xsBMzlFRW88N7Ww/rQMBOlpJA\n" +
  48. "6UfZGFYMezb1vXf7u3M4w/N22wKBgQC6/OF5DsCHAOui8CPXS2z2YTKuoOJmHKIe\n" +
  49. "vBeXy+ic+YRuTBXgA0Z1wL4xDW/LeCqoTmetbTuvGSyahMV4QSK0pxH9gk80sH4+\n" +
  50. "YEza3DLASxr4gSsr2fL6siuXN/OHyMClQb6JVa0yuPG1zLzShaIXYVAyz1m9rU1B\n" +
  51. "JpQfbEV8SwKBgGnBDvAVWzLZ5Y9qC2b8x4+Mi+7MorSGmEl9A/1YJnE2gteGVpdJ\n" +
  52. "G/fz1xvAcECgIMdalToM8/BOcbGpk4jvkZpVA9I2ClLWQoXIvQqCrMRDKPnfJ/Yq\n" +
  53. "BMtFsaHF9/SObhzxpK7aHAry/ji+QI1hgtlc2UBEB+FjDVGq6sO/xiCFAoGAV/3Y\n" +
  54. "PJdskhskx7AprY6Y3/gtWW/sGhEvWTc6Avy5oeTpJN45DQl9hrwExCCGk0EhEcKT\n" +
  55. "l1Dn3SYDj1MbedNs+YYFOT6w9yJ2xfObNwKX/1VYg8iFAEW3ybE+QhLaTvNxdFLT\n" +
  56. "zty6fDv7wolt8cNg24+3pbFdkZyT1izJV2Aj8rECgYBZQMObUgJ57n8FrXCdcdSa\n" +
  57. "MGsFYl8KUZa1zvzhoi3h7YtbVNNtSHcEK7VDyIheBt9pFCN7nuDX3jW2XYW2USEC\n" +
  58. "T7Pab2DAXPkRmXspWNID21G+AqqGSLD4pk9+ZmqevTfAtI+ajiu5NH1guH73rVOM\n" +
  59. "xGjQ5dCmWpUGt4fmO+zWIw==\n" +
  60. "-----END PRIVATE KEY-----";
  61. static String pubKey ="-----BEGIN PUBLIC KEY-----\n" +
  62. "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp4eTf5Isnjcf8nQyntxT\n" +
  63. "vB1o/LbkEFApAnPKJdUqpnLPXsu0ttfPVA22Tj3mNsYojA+gHRVVCuWND4G1/12R\n" +
  64. "VYs4cF7HhPtSFdZNMNwvvuWOGZZe52aCdOQDTG4/nZWpgJTWDrrZnNJWXwhlzOaH\n" +
  65. "rvlNFw1hNfrmO00QBldznAOxga2l4qLYZ3G5DX9GcHwRBlcizR3DTg4MMxAnNCib\n" +
  66. "hBdlflALddR5aE+tGrUpnYpLcGyeijietkzP3lPhf+Xd1CS3cNF2/JBBZz2Cv9Zg\n" +
  67. "/DxihQOhdMEmozS3Ooj4OZoIjkuY9NjdvpxDfJu7yHS+x3dMq4oH+ZBHZcfTwuzm\n" +
  68. "KQIDAQAB\n" +
  69. "-----END PUBLIC KEY-----";
  70. @Override
  71. public Map<String,Object> getChatData(Integer pageSeq, Integer pageLimit) {
  72. String message = null;
  73. Map<String,Object> map = new HashMap<>();
  74. List<InputChatMsg> list = new ArrayList<>();
  75. Integer total = 0;
  76. long sdk = Finance.NewSdk();
  77. System.out.println(Finance.Init(sdk, corpid, secret));
  78. long ret = 0;
  79. int seq = 0;
  80. int limit = 200;
  81. if (pageSeq != null || pageLimit!=null){
  82. seq=pageSeq;
  83. limit = pageLimit;
  84. }
  85. long slice = Finance.NewSlice();
  86. ret = Finance.GetChatData(sdk, seq, limit, null, null, 3, slice);
  87. if (ret != 0) {
  88. System.out.println("getchatdata ret " + ret);
  89. }
  90. String getchatdata = Finance.GetContentFromSlice(slice);
  91. JSONObject jo = new JSONObject(getchatdata);
  92. JSONArray chatdata = jo.getJSONArray("chatdata");
  93. total=chatdata.length();
  94. System.out.println("消息数:" + total);
  95. for (int i = 0; i < chatdata.length(); i++) {
  96. String item = chatdata.get(i).toString();
  97. // item:{
  98. // "publickey_ver":1,
  99. // "encrypt_chat_msg":"XSeHr+qM0YfX/q5WWvmnVEuL2E4U0RclkIbK9JnWQq7Y/0Ynir3srKh+9DH6BqRj/NYXKmUC65+0WRo
  100. // QboW3dC200XTqVNj+z0kljl11HdNmjuS3p7g0L+DYG5Bdz6Lo8FuHf/5WkOVi/R5VxOO6FvU+PediEOSCBN2dVHCeyIvExCk5mh
  101. // o+ME9QV/Q19HujmHpxzl3cu1XvBAZ7YvIpd2d/BCCI9JwmBc5bXr2FQ0r/PFkZadKGjw0cxqPyNIBkNc+ic0wHhWSZFTvY3qDW2
  102. // FFAdkYW68w8PA5f+8gD9VUuxKzz/j3Fu/6547Ayyuo93lPtbud5lAWXyeLexyHujFmdr300MA44BoYZsuTqdVsHbtEGLw967kO1
  103. // oHcImidD416ZuQh2VZiOYTJMtDZALdB1tXramb7kFj0AsKloFLKeg3ks3TYRKwEmM9wJ/y2hGDJzq5xncBFFShbLao5u",
  104. // "msgid":"1634016854685227651_1749628622146_external",
  105. // "encrypt_random_key":"kJ3XJM7CB7DGZqFxSfT8+EDWfr8vZmVVKzKLl5FM47Sd7iUSlgZF/a4dm5sTpCMW3uzk/m1LZV4odH
  106. // RyVO2+AaVJsidMoLV2LmmWiCAuXkzdK4yDbGItkvpZGrilgAlJjR8EhsUuqXOjvxkUemGvKMhrUqKdCaO4p3GYT/cxMRJDUmrP0v
  107. // TQqdgwznQOSubbBFDdMTSAfEtZnGp5tOQdCNFCbIqks4/Y8Isd/nd/Kq3QNsXjE+GdZkqVuOqRujOeCeqFRJF022i2KFuJQ+R+7X
  108. // 1es92NKBbaNT1AlRNfjtACH1KrPRLlEnmAS0EUIWWmn45/kOpH3T4ovOuNDnrafw==",
  109. // "seq":1}
  110. JSONObject data = new JSONObject(item);
  111. String encrypt_random_key = data.getString("encrypt_random_key");
  112. String encrypt_chat_msg = data.getString("encrypt_chat_msg");
  113. long msg = Finance.NewSlice();
  114. try {
  115. message = RSAEncrypt.decryptRSA(encrypt_random_key, priKey);
  116. ret = Finance.DecryptData(sdk, message, encrypt_chat_msg, msg);
  117. if (ret != 0) {
  118. System.out.println("getchatdata ret " + ret);
  119. // return;
  120. }
  121. String str = String.valueOf(Finance.GetContentFromSlice(msg));
  122. com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(str);
  123. // System.out.println(jsonObject);
  124. String action = jsonObject.getString("action");
  125. if (!action.equals("switch")){
  126. InputChatMsg chatMsg = new InputChatMsg(jsonObject);
  127. list.add(chatMsg);
  128. }
  129. Finance.FreeSlice(msg);
  130. } catch (Exception e) {
  131. e.printStackTrace();
  132. }
  133. }
  134. Finance.FreeSlice(slice);
  135. map.put("list",list);
  136. map.put("total",total);
  137. return map;
  138. }
  139. @Override
  140. public String getAccessToken() {
  141. //获取redis缓存数据
  142. String accessToken = null;
  143. Map<String,String> accessMap = (Map<String, String>) redisTemplate.opsForValue().get("ACCESS_TOKEN");
  144. if (accessMap == null){
  145. logger.debug("getAccessToken无缓存从接口获取");
  146. Map<String, String> map = getAccessMap(corpid, secret);
  147. //新增redis缓存数据
  148. redisTemplate.opsForValue().set("ACCESS_TOKEN",map);
  149. accessToken = map.get("accessToken");
  150. }else {
  151. logger.debug("getAccessToken有缓存从缓存获取");
  152. accessToken = accessMap.get("accessToken");
  153. Long expireDate = Long.valueOf(accessMap.get("expireDate"));
  154. if (expireDate < System.currentTimeMillis()){
  155. logger.debug("getAccessToken缓存已过期从接口获取");
  156. Map<String, String> map = getAccessMap(corpid, secret);
  157. accessToken = map.get("accessToken");
  158. //新增redis缓存数据
  159. redisTemplate.opsForValue().set("ACCESS_TOKEN",map);
  160. }
  161. }
  162. return accessToken;
  163. }
  164. @Override
  165. public String getAddressBookAccessToken() {
  166. //获取redis缓存数据
  167. String accessToken = null;
  168. Map<String,String> accessMap = (Map<String, String>) redisTemplate.opsForValue().get("ADDRESS_BOOK_ACCESS_TOKEN");
  169. if (accessMap == null){
  170. logger.debug("AddressBookAccessToken无缓存从接口获取");
  171. Map<String, String> map = getAccessMap(corpid,secret);
  172. //新增redis缓存数据
  173. redisTemplate.opsForValue().set("ADDRESS_BOOK_ACCESS_TOKEN",map);
  174. accessToken = map.get("accessToken");
  175. }else {
  176. logger.debug("AddressBookAccessToken有缓存从缓存获取");
  177. accessToken = accessMap.get("accessToken");
  178. Long expireDate = Long.valueOf(accessMap.get("expireDate"));
  179. if (expireDate < System.currentTimeMillis()){
  180. logger.debug("AddressBookAccessToken缓存已过期从接口获取");
  181. Map<String, String> map = getAccessMap(corpid,secret);
  182. accessToken = map.get("accessToken");
  183. //新增redis缓存数据
  184. redisTemplate.opsForValue().set("ADDRESS_BOOK_ACCESS_TOKEN",map);
  185. }
  186. }
  187. return accessToken;
  188. }
  189. @Override
  190. public String getPermitUserList() {
  191. String url=String.format("https://qyapi.weixin.qq.com/cgi-bin/msgaudit/get_permit_user_list?access_token=%s",getAccessToken());
  192. com.alibaba.fastjson.JSONObject result = HttpUtils.httpGet(url);
  193. if (result.getInteger("errcode")==0){
  194. List<String> ids = result.getJSONArray("ids").toJavaList(String.class);
  195. ids.stream().forEach(System.out::println);
  196. }else {
  197. System.out.println(result.getString("errcode"));
  198. System.out.println("获取会话内容存档成员列表失败");
  199. }
  200. pushGetChatName(result.toJSONString());
  201. return null;
  202. }
  203. @Override
  204. public String pushGetChatName(String userId) {
  205. ChatMsgUser chatMsgUser = chatMsgUserMapper.selectByUserId(userId);
  206. if (chatMsgUser != null){
  207. return chatMsgUser.getName();
  208. }else {
  209. String msgIdSub = userId.substring(0, 2);
  210. String url=null;
  211. Integer type=0;
  212. if (msgIdSub.equals("wb")){
  213. url=String.format("https://qyapi.weixin.qq.com/cgi-bin/msgaudit/get_robot_info??access_token=%s&robot_id=%s",getAddressBookAccessToken(),userId);
  214. }else if (msgIdSub.equals("wo")||msgIdSub.equals("wm")){
  215. // https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get?access_token=ACCESS_TOKEN&external_userid=EXTERNAL_USERID&cursor=CURSOR
  216. url=String.format("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get?access_token=%s&external_userid=%s",getAddressBookAccessToken(),userId);
  217. type=1;
  218. }else {
  219. url=String.format("https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=%s&userid=%s",getAccessToken(),userId);
  220. type=2;
  221. }
  222. String userName = getUserName(url);
  223. System.out.println(userId+"="+userName);
  224. if (StringUtils.isNotBlank(userName)){
  225. chatMsgUser = new ChatMsgUser();
  226. chatMsgUser.setUserId(userId);
  227. chatMsgUser.setName(userName);
  228. chatMsgUser.setType(type);
  229. chatMsgUser.setCreateTime(new Date());
  230. chatMsgUserMapper.insert(chatMsgUser);
  231. }
  232. return userName;
  233. }
  234. }
  235. @Override
  236. public String pushGetRoomName(String roomid) {
  237. // https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/get?access_token=ACCESS_TOKEN
  238. ChatMsgUser chatMsgUser = chatMsgUserMapper.selectByUserId(roomid);
  239. if (chatMsgUser != null){
  240. return chatMsgUser.getName();
  241. }else {
  242. String url=String.format("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/get?access_token=%s",getAddressBookAccessToken());
  243. Map<String,Object> map = new HashMap<String, Object>();
  244. map.put("chat_id",roomid);
  245. map.put("cursor",0);
  246. com.alibaba.fastjson.JSONObject jsonObject = HttpUtils.httpPost(url, map);
  247. System.out.println(jsonObject.toJSONString());
  248. if (jsonObject.getInteger("errcode")==0){
  249. }else {
  250. System.out.println("获取会话内容存档群名称失败");
  251. }
  252. }
  253. return null;
  254. }
  255. private String getUserName(String url){
  256. com.alibaba.fastjson.JSONObject result = HttpUtils.httpGet(url);
  257. if (result.getInteger("errcode")==0){
  258. System.out.println(result.toJSONString());
  259. return result.getString("name");
  260. }else {
  261. System.out.println(result.toJSONString());
  262. System.out.println("获取会话内容存档成员列表失败");
  263. }
  264. return null;
  265. }
  266. private Map<String, String> getAccessMap(String corpid, String secret) {
  267. String url=String.format("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s",corpid,secret);
  268. Date date = new Date();
  269. com.alibaba.fastjson.JSONObject jsonObject = HttpUtils.httpGet(url);
  270. String access_token = (String) jsonObject.get("access_token");
  271. Integer expires_in = (Integer) jsonObject.get("expires_in");
  272. //时间加上过期时间
  273. Date expireDate = DateUtils.addMilliseconds(date, expires_in);
  274. Map<String,String> map = new HashMap<>();
  275. map.put("accessToken",access_token);
  276. map.put("expireDate", String.valueOf(expireDate.getTime()));
  277. return map;
  278. }
  279. }