| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304 |
- 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<String,Object> getChatData(Integer pageSeq, Integer pageLimit) {
- String message = null;
- Map<String,Object> map = new HashMap<>();
- List<InputChatMsg> 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<String,String> accessMap = (Map<String, String>) redisTemplate.opsForValue().get("ACCESS_TOKEN");
- if (accessMap == null){
- logger.debug("getAccessToken无缓存从接口获取");
- Map<String, String> 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<String, String> 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<String,String> accessMap = (Map<String, String>) redisTemplate.opsForValue().get("ADDRESS_BOOK_ACCESS_TOKEN");
- if (accessMap == null){
- logger.debug("AddressBookAccessToken无缓存从接口获取");
- Map<String, String> 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<String, String> 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<String> 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<String,Object> map = new HashMap<String, Object>();
- 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<String, String> 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<String,String> map = new HashMap<>();
- map.put("accessToken",access_token);
- map.put("expireDate", String.valueOf(expireDate.getTime()));
- return map;
- }
- }
|