package com.kede.wechat.service.impl; 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.wechat.bo.InputChatMsg; 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.util.*; @Service("ConversationContentService") public class ConversationContentServiceImpl implements ConversationContentService { Logger logger = LoggerFactory.getLogger(ConversationContentServiceImpl.class); @Resource private RedisTemplate redisTemplate; @Resource private ChatMsgUserMapper chatMsgUserMapper; @Value(value = "${conversationContent.corpid}") private String corpid; @Value(value = "${conversationContent.secret}") private String secret; @Value(value = "${conversationContent.addressBook.secret}") private String addressBookSecret; static String priKey ="-----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-----"; @Override public Map getChatData(Integer pageSeq, Integer pageLimit) { String message = null; Map map = new HashMap<>(); List list = new ArrayList<>(); Integer total = 0; long sdk = Finance.NewSdk(); 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); 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)); com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(str); // System.out.println(jsonObject); String action = jsonObject.getString("action"); if (!action.equals("switch")){ InputChatMsg chatMsg = new InputChatMsg(jsonObject); list.add(chatMsg); } Finance.FreeSlice(msg); } catch (Exception e) { e.printStackTrace(); } } Finance.FreeSlice(slice); map.put("list",list); map.put("total",total); return map; } @Override public String getAccessToken() { //获取redis缓存数据 String accessToken = null; 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); } } return accessToken; } @Override public String getAddressBookAccessToken() { //获取redis缓存数据 String accessToken = null; Map accessMap = (Map) redisTemplate.opsForValue().get("ADDRESS_BOOK_ACCESS_TOKEN"); if (accessMap == null){ logger.debug("AddressBookAccessToken无缓存从接口获取"); Map map = getAccessMap(corpid,secret); //新增redis缓存数据 redisTemplate.opsForValue().set("ADDRESS_BOOK_ACCESS_TOKEN",map); accessToken = map.get("accessToken"); }else { logger.debug("AddressBookAccessToken有缓存从缓存获取"); accessToken = accessMap.get("accessToken"); Long expireDate = Long.valueOf(accessMap.get("expireDate")); if (expireDate < System.currentTimeMillis()){ logger.debug("AddressBookAccessToken缓存已过期从接口获取"); Map map = getAccessMap(corpid,secret); accessToken = map.get("accessToken"); //新增redis缓存数据 redisTemplate.opsForValue().set("ADDRESS_BOOK_ACCESS_TOKEN",map); } } return accessToken; } @Override public String getPermitUserList() { String url=String.format("https://qyapi.weixin.qq.com/cgi-bin/msgaudit/get_permit_user_list?access_token=%s",getAccessToken()); 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()); return null; } @Override public String pushGetChatName(String userId) { ChatMsgUser chatMsgUser = chatMsgUserMapper.selectByUserId(userId); if (chatMsgUser != null){ return chatMsgUser.getName(); }else { String msgIdSub = userId.substring(0, 2); String url=null; Integer type=0; if (msgIdSub.equals("wb")){ url=String.format("https://qyapi.weixin.qq.com/cgi-bin/msgaudit/get_robot_info??access_token=%s&robot_id=%s",getAddressBookAccessToken(),userId); }else if (msgIdSub.equals("wo")||msgIdSub.equals("wm")){ // https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get?access_token=ACCESS_TOKEN&external_userid=EXTERNAL_USERID&cursor=CURSOR url=String.format("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get?access_token=%s&external_userid=%s",getAddressBookAccessToken(),userId); type=1; }else { url=String.format("https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=%s&userid=%s",getAccessToken(),userId); type=2; } String userName = getUserName(url); System.out.println(userId+"="+userName); if (StringUtils.isNotBlank(userName)){ chatMsgUser = new ChatMsgUser(); chatMsgUser.setUserId(userId); chatMsgUser.setName(userName); chatMsgUser.setType(type); chatMsgUser.setCreateTime(new Date()); chatMsgUserMapper.insert(chatMsgUser); } return userName; } } @Override public String pushGetRoomName(String roomid) { // https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/get?access_token=ACCESS_TOKEN ChatMsgUser chatMsgUser = chatMsgUserMapper.selectByUserId(roomid); if (chatMsgUser != null){ return chatMsgUser.getName(); }else { String url=String.format("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/get?access_token=%s",getAddressBookAccessToken()); Map map = new HashMap(); map.put("chat_id",roomid); map.put("cursor",0); com.alibaba.fastjson.JSONObject jsonObject = HttpUtils.httpPost(url, map); System.out.println(jsonObject.toJSONString()); if (jsonObject.getInteger("errcode")==0){ }else { System.out.println("获取会话内容存档群名称失败"); } } return null; } private String getUserName(String url){ com.alibaba.fastjson.JSONObject result = HttpUtils.httpGet(url); if (result.getInteger("errcode")==0){ System.out.println(result.toJSONString()); return result.getString("name"); }else { System.out.println(result.toJSONString()); System.out.println("获取会话内容存档成员列表失败"); } return null; } 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); Map map = new HashMap<>(); map.put("accessToken",access_token); map.put("expireDate", String.valueOf(expireDate.getTime())); return map; } }