ConversationContentServiceImpl.java 12 KB

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