|
@@ -1,778 +0,0 @@
|
|
|
-package com.fs.wx.cp.service;
|
|
|
-
|
|
|
-import com.alibaba.fastjson.JSONArray;
|
|
|
-import com.alibaba.fastjson.JSONObject;
|
|
|
-import com.fs.common.core.redis.RedisCache;
|
|
|
-import com.fs.qywx.domain.QywxCompany;
|
|
|
-import com.fs.qywx.domain.QywxUser;
|
|
|
-import com.fs.qywx.service.IQywxCompanyService;
|
|
|
-import com.fs.qywx.service.IQywxUserService;
|
|
|
-import com.fs.wx.cp.config.QywxCacheConfig;
|
|
|
-import com.fs.wx.cp.config.QywxThirdConfig;
|
|
|
-import com.fs.wx.util.AesException;
|
|
|
-import com.fs.wx.cp.model.entity.WechatCorpLogin;
|
|
|
-import com.fs.wx.cp.model.xml.MessageText;
|
|
|
-import com.fs.wx.util.*;
|
|
|
-import org.slf4j.Logger;
|
|
|
-import org.slf4j.LoggerFactory;
|
|
|
-import org.springframework.beans.factory.annotation.Autowired;
|
|
|
-import org.springframework.core.io.FileSystemResource;
|
|
|
-import org.springframework.http.HttpEntity;
|
|
|
-import org.springframework.http.HttpHeaders;
|
|
|
-import org.springframework.http.MediaType;
|
|
|
-import org.springframework.stereotype.Service;
|
|
|
-import org.springframework.util.LinkedMultiValueMap;
|
|
|
-import org.springframework.util.MultiValueMap;
|
|
|
-import org.w3c.dom.Document;
|
|
|
-import org.w3c.dom.Element;
|
|
|
-import org.w3c.dom.NodeList;
|
|
|
-import org.xml.sax.InputSource;
|
|
|
-import javax.xml.parsers.DocumentBuilder;
|
|
|
-import javax.xml.parsers.DocumentBuilderFactory;
|
|
|
-import java.io.File;
|
|
|
-import java.io.IOException;
|
|
|
-import java.io.StringReader;
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
-
|
|
|
-@SuppressWarnings("all")
|
|
|
-@Service
|
|
|
-public class QywxThirdService {
|
|
|
- private final static Logger logger = LoggerFactory.getLogger("test");
|
|
|
- @Autowired
|
|
|
- private QywxThirdConfig qywxThirdConfig;
|
|
|
- @Autowired
|
|
|
- private QywxCacheConfig qywxCacheConfig;
|
|
|
- @Autowired
|
|
|
- RedisCache redisCache;
|
|
|
- @Autowired
|
|
|
- private IQywxCompanyService qyxCompanyService;
|
|
|
- @Autowired
|
|
|
- private IQywxUserService qywxUserService;
|
|
|
- @Autowired
|
|
|
- private AccessTokenUtil accessTokenUtil;
|
|
|
- @Autowired
|
|
|
- private QywxUserUtil qywxUserUtil;
|
|
|
- //********************************** 回调处理 *************************//
|
|
|
- /**
|
|
|
- * 指令回调url验证 get请求
|
|
|
- */
|
|
|
- public String getVerify(String sVerifyMsgSig,String sVerifyTimeStamp,
|
|
|
- String sVerifyNonce,String sVerifyEchoStr){
|
|
|
-
|
|
|
- String sToken = qywxThirdConfig.getToken();
|
|
|
- String sCorpID = qywxThirdConfig.getCorpId();
|
|
|
- String sEncodingAESKey = qywxThirdConfig.getEncodingAESKey();
|
|
|
-
|
|
|
- WXBizMsgCrypt wxcpt = null;
|
|
|
- try {
|
|
|
- wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID);
|
|
|
- }catch (AesException E){
|
|
|
- return "error";
|
|
|
- }
|
|
|
- String sEchoStr; //需要返回的明文
|
|
|
- try {
|
|
|
- sEchoStr = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp,
|
|
|
- sVerifyNonce, sVerifyEchoStr);
|
|
|
- } catch (Exception e) {
|
|
|
- //验证URL失败,错误原因请查看异常
|
|
|
- e.printStackTrace();
|
|
|
- return "error";
|
|
|
- }
|
|
|
- return sEchoStr;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 指令回调接收 post请求处理
|
|
|
- */
|
|
|
- public String instructCallback(String sVerifyMsgSig,String sVerifyTimeStamp,String sVerifyNonce,String sData){
|
|
|
- String sToken = qywxThirdConfig.getToken();
|
|
|
- String sSuiteid =qywxThirdConfig.getSuiteId();
|
|
|
- String sEncodingAESKey = qywxThirdConfig.getEncodingAESKey();
|
|
|
- String result = "error";
|
|
|
- WXBizMsgCrypt wxcpt = null;
|
|
|
- try {
|
|
|
- wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sSuiteid);
|
|
|
- }catch (AesException E){
|
|
|
- return result;
|
|
|
- }
|
|
|
- try{
|
|
|
- String sMsg = wxcpt.DecryptMsg(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sData);
|
|
|
- System.out.println("after encrypt sEncrytMsg: " + sMsg);
|
|
|
- // 加密成功
|
|
|
- // TODO: 解析出明文xml标签的内容进行处理
|
|
|
- // For example:
|
|
|
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
|
|
- DocumentBuilder db = dbf.newDocumentBuilder();
|
|
|
- StringReader sr = new StringReader(sMsg);
|
|
|
- InputSource is = new InputSource(sr);
|
|
|
- Document document = db.parse(is);
|
|
|
- Element root = document.getDocumentElement();
|
|
|
- NodeList infoTypeNode = root.getElementsByTagName("InfoType");
|
|
|
- String infoType = infoTypeNode.item(0).getTextContent();
|
|
|
- logger.info(infoType);
|
|
|
- switch (infoType){
|
|
|
- case "suite_ticket" :
|
|
|
- setSuitTicket(root);
|
|
|
- break;
|
|
|
- case "create_auth":
|
|
|
- //获取auth_code
|
|
|
- NodeList authcodeNode = root.getElementsByTagName("AuthCode");
|
|
|
- String authcode = authcodeNode.item(0).getTextContent();
|
|
|
- logger.info("auth code:"+authcode);
|
|
|
- getPermentCode(authcode);
|
|
|
- ;
|
|
|
- break;
|
|
|
- //改变授权
|
|
|
- case "change_auth":
|
|
|
- //获取auth_code
|
|
|
- System.out.println("root:");
|
|
|
- System.out.println(root);
|
|
|
- ;
|
|
|
- break;
|
|
|
- case "cancel_auth":
|
|
|
- //获取corp_id
|
|
|
- NodeList authCorpNode = root.getElementsByTagName("AuthCorpId");
|
|
|
- String corpId = authCorpNode.item(0).getTextContent();
|
|
|
- qyxCompanyService.deleteQywxCompanyByCorpId(corpId);
|
|
|
- ;
|
|
|
- break;
|
|
|
- //改变事件
|
|
|
- case "change_contact":
|
|
|
- //获取auth_code
|
|
|
- changeContact(root);
|
|
|
-
|
|
|
- ;
|
|
|
- break;
|
|
|
- case "register_corp":
|
|
|
- NodeList stateNode = root.getElementsByTagName("state");
|
|
|
- String state = stateNode.item(0).getTextContent();
|
|
|
- logger.info("state :"+state);
|
|
|
- break;
|
|
|
- case "batch_job_result":
|
|
|
- //通讯录id转译异步任务回调 https://open.work.weixin.qq.com/api/doc/90001/90143/91875
|
|
|
- break;
|
|
|
- default:
|
|
|
- logger.info(infoType);
|
|
|
- }
|
|
|
- }
|
|
|
- catch(Exception e)
|
|
|
- {
|
|
|
- e.printStackTrace();
|
|
|
- // 加密失败
|
|
|
- return result;
|
|
|
- }
|
|
|
- result = "success";
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- private void changeContact(Element root) {
|
|
|
- NodeList ChangeType = root.getElementsByTagName("ChangeType");
|
|
|
- String ChangeTypeinfo = ChangeType.item(0).getTextContent();
|
|
|
- switch (ChangeTypeinfo){
|
|
|
- case "create_user":
|
|
|
- //获取auth_code
|
|
|
- System.out.println("新建用户");
|
|
|
- String CorpId = root.getElementsByTagName("AuthCorpId").item(0).getTextContent();
|
|
|
- String userID = root.getElementsByTagName("UserID").item(0).getTextContent();
|
|
|
- String OpenUserID = root.getElementsByTagName("OpenUserID").item(0).getTextContent();
|
|
|
- String Name = root.getElementsByTagName("Name").item(0).getTextContent();
|
|
|
- String MainDepartment = root.getElementsByTagName("MainDepartment").item(0).getTextContent();
|
|
|
-
|
|
|
- String Avatar = root.getElementsByTagName("Avatar").item(0).getTextContent();
|
|
|
- QywxUser qywxUser = new QywxUser();
|
|
|
- qywxUser.setCorpId(CorpId);
|
|
|
- qywxUser.setUserId(userID);
|
|
|
- qywxUser.setOpenUserid(OpenUserID);
|
|
|
- qywxUser.setName(Name);
|
|
|
- qywxUser.setMainDepartment(Integer.parseInt(MainDepartment));
|
|
|
-
|
|
|
- qywxUser.setAvatar(Avatar);
|
|
|
- qywxUser.setStatus(0);
|
|
|
- qywxUserService.insertQywxUser(qywxUser);
|
|
|
- break;
|
|
|
- case "delete_user":
|
|
|
- System.out.println("删除用户");
|
|
|
- NodeList AuthCorpIdN = root.getElementsByTagName("AuthCorpId");
|
|
|
- String AuthCorpId = AuthCorpIdN.item(0).getTextContent();
|
|
|
- NodeList UserIDNo = root.getElementsByTagName("UserID");
|
|
|
- String UserID = UserIDNo.item(0).getTextContent();
|
|
|
- qywxUserService.deleteQywxUserByCorpIdAndCorpId(AuthCorpId,UserID);
|
|
|
- break;
|
|
|
- case "update_user":
|
|
|
- System.out.println("修改用户");
|
|
|
- NodeList AuCorpId = root.getElementsByTagName("AuthCorpId");
|
|
|
- String cId = AuCorpId.item(0).getTextContent();
|
|
|
- NodeList uID = root.getElementsByTagName("UserID");
|
|
|
- String uid = uID.item(0).getTextContent();
|
|
|
- NodeList Status = root.getElementsByTagName("Status");
|
|
|
- if (Status.getLength()!=0){
|
|
|
- String status = Status.item(0).getTextContent();
|
|
|
- QywxUser q = new QywxUser();
|
|
|
- q.setStatus(1);
|
|
|
- q.setCorpId(cId);
|
|
|
- q.setUserId(uid);
|
|
|
-
|
|
|
- qywxUserService.updateQywxUserByUserIdAndCorpId(q);
|
|
|
- }
|
|
|
-
|
|
|
- break;
|
|
|
- case "create_party":
|
|
|
- System.out.println("创建部门");
|
|
|
- break;
|
|
|
- case "delete_party":
|
|
|
- System.out.println("删除部门");
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public String dataCallback(String sVerifyMsgSig,String sVerifyTimeStamp,String sVerifyNonce,String sData){
|
|
|
- String sToken = qywxThirdConfig.getToken();
|
|
|
- String sEncodingAESKey = qywxThirdConfig.getEncodingAESKey();
|
|
|
- String result = "error";
|
|
|
- WXBizMsgCrypt wxcpt = null;
|
|
|
- try {
|
|
|
- Object[] encrypt = XMLParse.extract(sData);
|
|
|
- String sSuiteid = (String) encrypt[2];
|
|
|
-
|
|
|
- wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sSuiteid);
|
|
|
- }catch (AesException E){
|
|
|
- return result;
|
|
|
- }
|
|
|
- try{
|
|
|
- String sMsg = wxcpt.DecryptMsg(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sData);
|
|
|
- System.out.println("after encrypt sEncrytMsg: " + sMsg);
|
|
|
- // 加密成功
|
|
|
- // TODO: 解析出明文xml标签的内容进行处理
|
|
|
- // For example:
|
|
|
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
|
|
- DocumentBuilder db = dbf.newDocumentBuilder();
|
|
|
- StringReader sr = new StringReader(sMsg);
|
|
|
- InputSource is = new InputSource(sr);
|
|
|
- Document document = db.parse(is);
|
|
|
-
|
|
|
- Element root = document.getDocumentElement();
|
|
|
- NodeList msgTypeNode = root.getElementsByTagName("MsgType");
|
|
|
- String msgType = msgTypeNode.item(0).getTextContent();
|
|
|
- System.out.println("msgType: " + msgType);
|
|
|
- if(msgType.equals("event")){
|
|
|
- NodeList eventNode = root.getElementsByTagName("Event");
|
|
|
- String event = eventNode.item(0).getTextContent();
|
|
|
- logger.info(event);
|
|
|
- switch (event){
|
|
|
- case "subscribe" :
|
|
|
- System.out.println("event: " + event);
|
|
|
- break;
|
|
|
- case "unsubscribe":
|
|
|
- System.out.println("event: " + event);
|
|
|
- break;
|
|
|
- case "open_approval_change":
|
|
|
- break;
|
|
|
- case "click":
|
|
|
- break;
|
|
|
- case "view":
|
|
|
- String createTime = String.valueOf(System.currentTimeMillis());
|
|
|
- String nonce = "sdfsdfsd";
|
|
|
- //文本消息
|
|
|
- MessageText msgText = new MessageText();
|
|
|
- msgText.setToUserName("");
|
|
|
- msgText.setFromUserName("");
|
|
|
- msgText.setCreateTime(createTime);
|
|
|
- msgText.setMsgType("text");
|
|
|
- msgText.setContent("test");
|
|
|
- msgText.setMsgId("111111111111111111");
|
|
|
- msgText.setAgentID("");
|
|
|
- String msgTextXmlStr = XmlConvertUtils.convertToXml(msgText,"utf-8");
|
|
|
- //加密消息xml
|
|
|
- result = wxcpt.EncryptMsg(msgTextXmlStr,createTime,nonce);
|
|
|
- break;
|
|
|
- default:
|
|
|
- logger.info(event);
|
|
|
- }
|
|
|
- }else{
|
|
|
- switch (msgType){
|
|
|
- case "text" :
|
|
|
- break;
|
|
|
- case "image" :
|
|
|
- break;
|
|
|
- case "voice" :
|
|
|
- break;
|
|
|
- case "location" :
|
|
|
- break;
|
|
|
- case "video" :
|
|
|
- break;
|
|
|
- case "link" :
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- catch(Exception e)
|
|
|
- {
|
|
|
- e.printStackTrace();
|
|
|
- // 加密失败
|
|
|
- System.out.println(result);
|
|
|
- return result;
|
|
|
- }
|
|
|
- result = "success";
|
|
|
- return result;
|
|
|
- }
|
|
|
- public String registerCallback(String sVerifyMsgSig,String sVerifyTimeStamp,String sVerifyNonce,String sData){
|
|
|
- String sToken = qywxThirdConfig.getToken();
|
|
|
- String sSuiteid =qywxThirdConfig.getSuiteId();
|
|
|
- String sEncodingAESKey = qywxThirdConfig.getEncodingAESKey();
|
|
|
- String result = "error";
|
|
|
- WXBizMsgCrypt wxcpt = null;
|
|
|
- try {
|
|
|
- wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sSuiteid);
|
|
|
- }catch (AesException E){
|
|
|
- return result;
|
|
|
- }
|
|
|
- try{
|
|
|
- String sMsg = wxcpt.DecryptMsg(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sData);
|
|
|
- System.out.println("after encrypt sEncrytMsg: " + sMsg);
|
|
|
- // 加密成功
|
|
|
- // TODO: 解析出明文xml标签的内容进行处理
|
|
|
- // For example:
|
|
|
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
|
|
- DocumentBuilder db = dbf.newDocumentBuilder();
|
|
|
- StringReader sr = new StringReader(sMsg);
|
|
|
- InputSource is = new InputSource(sr);
|
|
|
- Document document = db.parse(is);
|
|
|
- Element root = document.getDocumentElement();
|
|
|
- NodeList infoTypeNode = root.getElementsByTagName("InfoType");
|
|
|
- String infoType = infoTypeNode.item(0).getTextContent();
|
|
|
- logger.info(infoType);
|
|
|
- switch (infoType){
|
|
|
- case "create_auth":
|
|
|
- //获取auth_code
|
|
|
- NodeList authcodeNode = root.getElementsByTagName("AuthCode");
|
|
|
- String authcode = authcodeNode.item(0).getTextContent();
|
|
|
- logger.info("auth code:"+authcode);
|
|
|
- ;
|
|
|
- break;
|
|
|
- case "register_corp":
|
|
|
- NodeList stateNode = root.getElementsByTagName("state");
|
|
|
- String state = stateNode.item(0).getTextContent();
|
|
|
- logger.info("state :"+state);
|
|
|
- break;
|
|
|
- default:
|
|
|
- logger.info(infoType);
|
|
|
- }
|
|
|
- }
|
|
|
- catch(Exception e)
|
|
|
- {
|
|
|
- e.printStackTrace();
|
|
|
- // 加密失败
|
|
|
- return result;
|
|
|
- }
|
|
|
- result = "success";
|
|
|
- return result;
|
|
|
-
|
|
|
- }
|
|
|
- //suite_ticket缓存10分钟一次
|
|
|
- private String setSuitTicket(Element root){
|
|
|
- NodeList nodelist = root.getElementsByTagName("SuiteTicket");
|
|
|
- String result = nodelist.item(0).getTextContent();
|
|
|
- redisCache.setCacheObject("suite_ticket",result);
|
|
|
- String suiteToken = getSuiteToken(result);
|
|
|
- redisCache.setCacheObject("suite_access_token",suiteToken);
|
|
|
- saveAllAccessToken();
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- //获取服务商授权码
|
|
|
- public String getSuiteToken(String suiteTicket){
|
|
|
- HttpHeaders headers = new HttpHeaders();
|
|
|
- headers.setContentType(MediaType.APPLICATION_JSON);
|
|
|
- //方式二 对象转字符串j
|
|
|
-
|
|
|
- JSONObject postJson = new JSONObject();
|
|
|
- postJson.put("suite_id",qywxThirdConfig.getSuiteId());
|
|
|
- postJson.put("suite_secret",qywxThirdConfig.getSuiteSecret());
|
|
|
- postJson.put("suite_ticket",suiteTicket);
|
|
|
- Map response = RestUtils.post(qywxThirdConfig.getSuiteTokenUrl(),postJson);
|
|
|
- //获取错误日志
|
|
|
- if(response.containsKey("errcode") && (Integer) response.get("errcode") != 0){
|
|
|
- logger.error(response.toString());
|
|
|
- }
|
|
|
- String result = (String) response.get("suite_access_token");
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- //********************************** 应用安装 *************************//
|
|
|
-
|
|
|
- public Boolean getPermentCode(String authCode){
|
|
|
- //通过auth code获取公司信息及永久授权码
|
|
|
- JSONObject postJson = new JSONObject();
|
|
|
- postJson.put("auth_code",authCode);
|
|
|
- logger.error(postJson.toString());
|
|
|
- String suiteAccessToken = redisCache.getCacheObject("suite_access_token");
|
|
|
- String url = String.format(qywxThirdConfig.getPermanentCodeUrl(),suiteAccessToken);
|
|
|
- Map response = RestUtils.post(url,postJson);
|
|
|
- //获取错误日志
|
|
|
- if(response.containsKey("errcode") && (Integer) response.get("errcode") != 0){
|
|
|
- logger.error(response.toString());
|
|
|
- return false;
|
|
|
- }
|
|
|
- logger.error(response.toString());
|
|
|
- //保存授权公司信息
|
|
|
- String permanenCode= (String) response.get("permanent_code");
|
|
|
- //获取corpId
|
|
|
- Map authCorpInfo =(Map) response.get("auth_corp_info");
|
|
|
- String corpId = (String) authCorpInfo.get("corpid");
|
|
|
- redisCache.setCacheObject(corpId,permanenCode);
|
|
|
- //获取agent
|
|
|
- Map authInfo = (Map) response.get("auth_info");
|
|
|
- List agentList = (List) authInfo.get("agent");
|
|
|
- Map agent = (Map) agentList.get(0);
|
|
|
- Integer agentId = (Integer) agent.get("agentid");
|
|
|
- QywxCompany company = new QywxCompany();
|
|
|
- company.setPermanentCode(permanenCode);
|
|
|
- company.setCorpId(corpId) ;
|
|
|
- company.setCorpName((String) authCorpInfo.get("corp_name"));
|
|
|
- String fullName = authCorpInfo.get("corp_full_name") == null ? "" : (String)authCorpInfo.get("corp_full_name");
|
|
|
- company.setCorpFullName(fullName);
|
|
|
- company.setSubjectType((Integer) authCorpInfo.get("subject_type"));
|
|
|
- //设置授权应用id 用于Jssdk agentconfig等使用
|
|
|
- company.setAgentId(agentId);
|
|
|
- company.setStatus(1);
|
|
|
- logger.info(company.toString());
|
|
|
- qyxCompanyService.insertQywxCompany(company);
|
|
|
- //授权用户信息
|
|
|
- QywxUser user = new QywxUser();
|
|
|
- Map authUserInfo = (Map) response.get("auth_user_info");
|
|
|
- user.setUserId((String)authUserInfo.get("userid"));
|
|
|
- user.setName((String)authUserInfo.get("name"));
|
|
|
- user.setAvatar((String)authUserInfo.get("avatar"));
|
|
|
- user.setCorpId(corpId);
|
|
|
- user.setStatus(1);
|
|
|
- user.setOpenUserid((String)authUserInfo.get("open_userid"));
|
|
|
- logger.info(user.toString());
|
|
|
- String s = permanentCodegetAccessToken(permanenCode, corpId);
|
|
|
- //异步同步部门,人员 待处理
|
|
|
- Map<String,QywxUser> userList = qywxUserUtil.getUserList(s, corpId);
|
|
|
- userList.put(user.getUserId(),user);
|
|
|
- for(String key:userList.keySet()) {
|
|
|
- QywxUser u = userList.get(key);
|
|
|
- qywxUserService.insertQywxUser(u);
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- //获取所有企业授权码
|
|
|
- public void saveAllAccessToken(){
|
|
|
- QywxCompany qywxCompany = new QywxCompany();
|
|
|
- qywxCompany.setStatus(1);
|
|
|
- List<QywxCompany> q = qyxCompanyService.selectQywxCompanyList(qywxCompany);
|
|
|
- for (QywxCompany company : q) {
|
|
|
- permanentCodegetAccessToken(company.getPermanentCode(),company.getCorpId());
|
|
|
- }
|
|
|
- }
|
|
|
- //获取企业授权码
|
|
|
- public String permanentCodegetAccessToken(String permanenCode,String corpId){
|
|
|
- JSONObject postJson = new JSONObject();
|
|
|
- postJson.put("auth_corpid",corpId);
|
|
|
- postJson.put("permanent_code",permanenCode);
|
|
|
- logger.error(postJson.toString());
|
|
|
- String suiteAccessToken = redisCache.getCacheObject("suite_access_token");
|
|
|
- String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/service/get_corp_token?suite_access_token=%s",suiteAccessToken);
|
|
|
- Map response = RestUtils.post(url,postJson);
|
|
|
- //获取错误日志
|
|
|
- if(response.containsKey("errcode") && (Integer) response.get("errcode") != 0){
|
|
|
- logger.error(response.toString());
|
|
|
- return null;
|
|
|
- }
|
|
|
- logger.error(response.toString());
|
|
|
- String acc= (String) response.get("access_token");
|
|
|
- redisCache.setCacheObject(corpId+":access_token",acc);
|
|
|
- return acc;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-// //获取临时授权码
|
|
|
-// public String getPreAuthCode(){
|
|
|
-// String result = "";
|
|
|
-// String token = getSuiteToken();
|
|
|
-// String url = String.format(qywxThirdConfig.getPreAuthCodeUrl(),token);
|
|
|
-// Map response = RestUtils.get(url);
|
|
|
-// //获取错误日志
|
|
|
-// if(response.containsKey("errcode") && (Integer) response.get("errcode") != 0){
|
|
|
-// logger.error(response.toString());
|
|
|
-// }else{
|
|
|
-// result = (String) response.get("pre_auth_code");
|
|
|
-// //设置授权楝,对某次预授权码pre_auth_code进行授权类型设置
|
|
|
-// setSessionInfo(result);
|
|
|
-// }
|
|
|
-// System.out.println("pre_auth_code: "+result);
|
|
|
-// return result;
|
|
|
-// }
|
|
|
-// private Boolean setSessionInfo(String preAuthCode){
|
|
|
-// String token = getSuiteToken();
|
|
|
-// //如是测试授权,设置授权配置
|
|
|
-// //if(qywxThirdConfig.getAuthType() == 1){
|
|
|
-// JSONObject sessionInfo = new JSONObject();
|
|
|
-// sessionInfo.put("appid", new int[0]);
|
|
|
-// sessionInfo.put("auth_type",qywxThirdConfig.getAuthType());
|
|
|
-// JSONObject postJson = new JSONObject();
|
|
|
-// postJson.put("pre_auth_code",preAuthCode);
|
|
|
-// postJson.put("session_info",sessionInfo);
|
|
|
-// logger.error(postJson.toString());
|
|
|
-// String sessionInfoUrl = String.format(qywxThirdConfig.getSessionInfoUrl(),token);
|
|
|
-// Map sessionResponse = RestUtils.post(sessionInfoUrl,postJson);
|
|
|
-// //获取错误日志
|
|
|
-// if(sessionResponse.containsKey("errcode") && (Integer) sessionResponse.get("errcode") != 0){
|
|
|
-// logger.error(sessionResponse.toString());
|
|
|
-// return false;
|
|
|
-// }
|
|
|
-// //}
|
|
|
-// return true;
|
|
|
-// }
|
|
|
-
|
|
|
-// public String getInstallUrl(String url){
|
|
|
-// String preAuthCode= getPreAuthCode();
|
|
|
-// String result = String.format(qywxThirdConfig.getInstallUrl(),qywxThirdConfig.getSuiteId(),preAuthCode,url);
|
|
|
-// return result;
|
|
|
-// }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- //********************************** 服务商相关 *************************//
|
|
|
- public String getProviderToken(){
|
|
|
- JSONObject postJson = new JSONObject();
|
|
|
- postJson.put("corpid",qywxThirdConfig.getCorpId());
|
|
|
- postJson.put("provider_secret",qywxThirdConfig.getProviderSecret());
|
|
|
- String url = qywxThirdConfig.getProviderTokenUlr();
|
|
|
- logger.info(url);
|
|
|
- logger.info(postJson.toJSONString());
|
|
|
- JSONObject response = RestUtils.post(url,postJson);
|
|
|
- //获取错误日志
|
|
|
- if(response.containsKey("errcode") && (Integer) response.get("errcode") != 0){
|
|
|
- logger.error(response.toString());
|
|
|
- }
|
|
|
- String token = (String) response.get("provider_access_token");
|
|
|
- return token;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- public String getRegisterCode(){
|
|
|
- String url = String.format(qywxThirdConfig.getRegisterCodeUrl(),getProviderToken()) ;
|
|
|
- JSONObject postJson = new JSONObject();
|
|
|
- postJson.put("template_id",qywxThirdConfig.getTemplateId());
|
|
|
- postJson.put("state","lyx123456");
|
|
|
- JSONObject response = RestUtils.post(url,postJson);
|
|
|
- //获取错误日志
|
|
|
- if(response.containsKey("errcode") && (Integer) response.get("errcode") != 0){
|
|
|
- logger.error(response.toString());
|
|
|
- }
|
|
|
- String token = (String) response.get("register_code");
|
|
|
- return token;
|
|
|
- }
|
|
|
-
|
|
|
- public String getRegisterUrl(){
|
|
|
- String registerUrl = String.format(qywxThirdConfig.getRegisterUrl(),getRegisterCode());
|
|
|
- return registerUrl;
|
|
|
- }
|
|
|
-
|
|
|
- //********************************** 通讯录相关 *************************//
|
|
|
- /**
|
|
|
- *
|
|
|
- * @param filePath
|
|
|
- * @return
|
|
|
- * {
|
|
|
- * "errcode": 0,
|
|
|
- * "errmsg": "",
|
|
|
- * "type": "image",
|
|
|
- * "media_id": "1G6nrLmr5EC3MMb_-zK1dDdzmd0p7cNliYu9V5w7o8K0",
|
|
|
- * "created_at": "1380000000"
|
|
|
- * }
|
|
|
- *
|
|
|
- */
|
|
|
- public Map uploadContact(String filePath){
|
|
|
- //https://open.work.weixin.qq.com/api/doc/90001/90143/91883
|
|
|
- String providerToken = getProviderToken();
|
|
|
- String url = String.format(qywxThirdConfig.getContactUploadUrl(),providerToken,"file");
|
|
|
- MultiValueMap<String, Object> params= new LinkedMultiValueMap<>();
|
|
|
- FileSystemResource resource = new FileSystemResource(new File(filePath));
|
|
|
- params.add("media",resource);
|
|
|
- return RestUtils.upload(url,params);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- *
|
|
|
- * @return
|
|
|
- * {
|
|
|
- * "errcode": 0,
|
|
|
- * "errmsg": "ok",
|
|
|
- * "jobid": "xxxxx"
|
|
|
- * }
|
|
|
- */
|
|
|
- public Map transContact(String corpId,String mediaId){
|
|
|
- //https://open.work.weixin.qq.com/api/doc/90001/90143/91846
|
|
|
- /**
|
|
|
- * 参数
|
|
|
- * {
|
|
|
- * "auth_corpid": "wwxxxx",
|
|
|
- * "media_id_list": ["1G6nrLmr5EC3MMb_-zK1dDdzmd0p7cNliYu9V5w7o8K0"],
|
|
|
- * "output_file_name": "学习手册",
|
|
|
- * "output_file_format": "pdf"
|
|
|
- * }
|
|
|
- */
|
|
|
- String providerToken = getProviderToken();
|
|
|
- String url = String.format(qywxThirdConfig.getContactTransUrl(),providerToken);
|
|
|
- JSONObject postJson = new JSONObject();
|
|
|
- postJson.put("auth_corpid",corpId);
|
|
|
- JSONArray mediaList = new JSONArray();
|
|
|
- mediaList.add(mediaId);
|
|
|
- postJson.put("media_id_list",mediaList);
|
|
|
- return RestUtils.post(url,postJson);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- *
|
|
|
- * @param jobId
|
|
|
- * @return
|
|
|
- * {
|
|
|
- * "errcode": 0,
|
|
|
- * "errmsg": "ok",
|
|
|
- * "status": 1,
|
|
|
- * "type": "contact_id_translate",
|
|
|
- * "result": {
|
|
|
- * "contact_id_translate":{
|
|
|
- * "url":"xxxx"
|
|
|
- * }
|
|
|
- * }
|
|
|
- * }
|
|
|
- */
|
|
|
- public Map getTransResult(String jobId){
|
|
|
- //https://open.work.weixin.qq.com/api/doc/90001/90143/91882
|
|
|
- /**
|
|
|
- * id
|
|
|
- */
|
|
|
- String corpToken = getProviderToken();
|
|
|
- String url = String.format(qywxThirdConfig.getTransResultUrl(),corpToken,jobId);
|
|
|
- Map rs = RestUtils.get(url);
|
|
|
- rs.put("rs_url",url);
|
|
|
- return rs;
|
|
|
- }
|
|
|
- public String downloadTrans(String rerefeUrl, String downloadUrl, String targetPath, WechatCorpLogin login) throws IOException {
|
|
|
- //通过cookie及refer模拟下载转译结果
|
|
|
- //设置请求头cookie及refer
|
|
|
- //指定header
|
|
|
- HttpHeaders headers = new HttpHeaders();
|
|
|
- headers.set("Referer", rerefeUrl);
|
|
|
- headers.set("Cookie", login.getCookieSid());
|
|
|
- HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>( headers);
|
|
|
- String filePath = RestUtils.download(downloadUrl,targetPath,httpEntity);
|
|
|
- return filePath;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- //********************************** PC相关 *************************//
|
|
|
- //PC网页 sso 用于非企业微信环境下扫码登录,如运行在浏览的器应用后台或者脱离企业微信环境下H5应用
|
|
|
- //https://open.work.weixin.qq.com/wwopen/sso/3rd_qrConnect?appid=ww100000a5f2191&redirect_uri=http%3A%2F%2Fwww.oa.com&state=web_login@gyoss9&usertype=admin
|
|
|
- public String getSsoUrl(String redirectUrl,String userType){
|
|
|
- String state = "test";
|
|
|
- String ssoUrl = String.format(qywxThirdConfig.getSsoAuthUrl(),qywxThirdConfig.getCorpId(),redirectUrl,state,userType);
|
|
|
- return ssoUrl;
|
|
|
- }
|
|
|
-
|
|
|
- public Map getLoginInfo(String authCode){
|
|
|
- String url = String.format(qywxThirdConfig.getLoginInfoUrl(),getProviderToken()) ;
|
|
|
- JSONObject postJson = new JSONObject();
|
|
|
- postJson.put("auth_code",authCode);
|
|
|
- JSONObject response = RestUtils.post(url,postJson);
|
|
|
- //获取错误日志
|
|
|
- if(response.containsKey("errcode") && (Integer) response.get("errcode") != 0){
|
|
|
- logger.error(response.toString());
|
|
|
- }
|
|
|
- return response;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- //********************************** H5应用 Oauth *************************//
|
|
|
- public String getOauthUrl(String url){
|
|
|
-// 应用授权作用域。
|
|
|
-// snsapi_base:静默授权,可获取成员的基础信息(UserId与DeviceId);
|
|
|
-// snsapi_userinfo:静默授权,可获取成员的详细信息,但不包含手机、邮箱等敏感信息;
|
|
|
-// snsapi_privateinfo:手动授权,可获取成员的详细信息,包含手机、邮箱等敏感信息(已不再支持获取手机号/邮箱)。
|
|
|
- String scope = "snsapi_userinfo";
|
|
|
- String state = "sdfds343";
|
|
|
- String result = String.format(qywxThirdConfig.getOauthUrl(),qywxThirdConfig.getSuiteId(),url,scope,state);
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
-// public Map getOauthUser(String code) {
|
|
|
-//
|
|
|
-// String suiteToken = getSuiteToken();
|
|
|
-// //方法三
|
|
|
-// String getOauthUrl = String.format(qywxThirdConfig.getOauthUserUrl(),suiteToken,code);
|
|
|
-// Map response = RestUtils.get(getOauthUrl);
|
|
|
-// if(response.containsKey("errcode") && (Integer) response.get("errcode") != 0){
|
|
|
-// logger.error(response.toString());
|
|
|
-// return response;
|
|
|
-// }
|
|
|
-//
|
|
|
-// String userTicket = (String) response.get("user_ticket");
|
|
|
-// //获取访问用户敏感信息
|
|
|
-// JSONObject postJson = new JSONObject();
|
|
|
-// postJson.put("user_ticket",userTicket);
|
|
|
-// String url = String.format(qywxThirdConfig.getOauthUserDetailUrl(),suiteToken);
|
|
|
-// Map detaiResponse = RestUtils.post(url,postJson);
|
|
|
-// //获取错误日志
|
|
|
-// if(detaiResponse.containsKey("errcode") && (Integer) detaiResponse.get("errcode") != 0){
|
|
|
-// logger.error(detaiResponse.toString());
|
|
|
-// }
|
|
|
-// /**
|
|
|
-// * {
|
|
|
-// * "errcode": 0,
|
|
|
-// * "errmsg": "ok",
|
|
|
-// * "corpid": "wwcc3b4b831051d56e",
|
|
|
-// * "userid": "LiYueXi",
|
|
|
-// * "name": "LiYueXi",
|
|
|
-// * "department": [1],
|
|
|
-// * "gender": "1",
|
|
|
-// * "avatar": "https://rescdn.qqmail.com/node/wwmng/wwmng/style/images/independent/DefaultAvatar$73ba92b5.png",
|
|
|
-// * "open_userid": "woMAh2BwAApVMP0ZDYUk42tUw3CIeHFA"
|
|
|
-// * }
|
|
|
-// */
|
|
|
-//
|
|
|
-// return detaiResponse;
|
|
|
-//
|
|
|
-// }
|
|
|
-
|
|
|
- //****************************** 小程序应用 *********************//
|
|
|
-// public Map getCode2sessionUser(String code){
|
|
|
-// String suiteToken = getSuiteToken();
|
|
|
-// //获取访问用户身份
|
|
|
-//// Map paramsMap = new HashMap();
|
|
|
-//// paramsMap.put("suite_access_token",suiteToken);
|
|
|
-//// paramsMap.put("code",code);
|
|
|
-// String url = String.format(qywxThirdConfig.getCode2sessionUrl(),suiteToken,code);
|
|
|
-// Map response = RestUtils.get(url);
|
|
|
-// //获取错误日志
|
|
|
-// if(response.containsKey("errcode") && (Integer) response.get("errcode") != 0){
|
|
|
-// logger.error(response.toString());
|
|
|
-// }
|
|
|
-// return response;
|
|
|
-// }
|
|
|
-
|
|
|
-
|
|
|
-}
|