Browse Source

企业微信

master
zhizhi wu 6 years ago
parent
commit
f215e2628a
  1. 100
      health/src/main/java/com/ccsens/health/api/WeixinController.java
  2. 4
      health/src/main/java/com/ccsens/health/service/IWeiXinService.java
  3. 17
      health/src/main/java/com/ccsens/health/service/WeiXinService.java
  4. 1
      util/src/main/java/com/ccsens/util/enterprisewx/dto/MessageDto.java

100
health/src/main/java/com/ccsens/health/api/WeixinController.java

@ -17,11 +17,12 @@ import io.swagger.annotations.ApiModel;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -54,37 +55,77 @@ public class WeixinController {
* 数据回调URL * 数据回调URL
*/ */
@GetMapping("userChangeNotice") @GetMapping("userChangeNotice")
public String userChangeNotice(MessageDto dto) throws Exception{ public String userChangeNoticeGet(MessageDto dto) throws Exception{
log.info("数据回调请求参数:{}", dto); log.info("数据回调请求参数:{}", dto);
WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(WeiXinConstant.token, WeiXinConstant.encodingAESKey, WeiXinConstant.corpID); WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(WeiXinConstant.token, WeiXinConstant.encodingAESKey, WeiXinConstant.corpID);
String verifyURL = wxcpt.VerifyURL(dto.getMsg_signature(), dto.getTimestamp(), dto.getNonce(), dto.getEchostr()); String verifyURL = wxcpt.VerifyURL(dto.getMsg_signature(), dto.getTimestamp(), dto.getNonce(), dto.getEchostr());
log.info("数据回调解析结果:{}", verifyURL); log.info("数据回调解析结果:{}", verifyURL);
return verifyURL; return verifyURL;
} }
/** /**
* 指令回调URL * 指令回调get
* @param dto
* @return
* @throws Exception
*/ */
@GetMapping("authorizationChangeNotice") @GetMapping("authorizationChangeNotice")
public String authorizationChangeNotice(MessageDto dto) throws Exception{ public String authorizationChangeNoticeGet(MessageDto dto) throws Exception {
log.info("请求参数:{}", dto); log.info("请求参数:{}", dto);
WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(WeiXinConstant.token, WeiXinConstant.encodingAESKey, WeiXinConstant.corpID); WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(WeiXinConstant.token, WeiXinConstant.encodingAESKey, WeiXinConstant.corpID);
String verifyURL = wxcpt.VerifyURL(dto.getMsg_signature(), dto.getTimestamp(), dto.getNonce(), dto.getEchostr()); String verifyURL = wxcpt.VerifyURL(dto.getMsg_signature(), dto.getTimestamp(), dto.getNonce(), dto.getEchostr());
log.info("解析结果:{}", verifyURL); log.info("解析结果:{}", verifyURL);
if (StrUtil.isBlank(verifyURL) || !(verifyURL.startsWith("<xml") || verifyURL.startsWith("<XML"))){
return verifyURL; return verifyURL;
} }
/**
* 数据回调URL post
*/
@PostMapping("userChangeNotice")
public String userChangeNoticePost(HttpServletRequest request, MessageDto dto) throws Exception{
log.info("数据回调请求参数:{}", dto);
String body = getBody(request);
String xmlStr = JacksonUtil.xmlToJson(body);
log.info("数据回到xml转换:{}", xmlStr);
JSONObject jsonObject = JSONObject.parseObject(xmlStr);
WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(WeiXinConstant.token, WeiXinConstant.encodingAESKey, WeiXinConstant.corpID);
String verifyURL = wxcpt.VerifyURL(dto.getMsg_signature(), dto.getTimestamp(), dto.getNonce(), jsonObject.getString("Encrypt"));
log.info("数据回调解析结果:{}", verifyURL);
return "success";
}
/**
* 指令回调URL
*/
@PostMapping("authorizationChangeNotice")
public String authorizationChangeNotice(HttpServletRequest request, MessageDto dto) throws Exception{
log.info("指令回调请求参数:{}", dto);
String listString = getBody(request);
log.info("指令回调body:{}", listString);
String xmlStr = JacksonUtil.xmlToJson(listString);
log.info("指令回到xml转换:{}", xmlStr);
JSONObject jsonObject = JSONObject.parseObject(xmlStr);
log.info("jsonObject:{}", jsonObject);
WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(WeiXinConstant.token, WeiXinConstant.encodingAESKey, WeiXinConstant.suiteID);
String verifyURL = wxcpt.VerifyURL(dto.getMsg_signature(), dto.getTimestamp(), dto.getNonce(), jsonObject.getString("Encrypt"));
log.info("解析结果:{}", verifyURL);
String jsonStr = JacksonUtil.xmlToJson(verifyURL); String jsonStr = JacksonUtil.xmlToJson(verifyURL);
JSONObject json = JSONObject.parseObject(jsonStr); JSONObject json = JSONObject.parseObject(jsonStr);
log.info("指令回调业务参数:{}", json);
switch (json.getString("InfoType")){ switch (json.getString("InfoType")){
case "suite_ticket" : case "suite_ticket" :
MessageDto.Ticket ticket = JSONObject.parseObject(jsonStr, MessageDto.Ticket.class); MessageDto.Ticket ticket = JSONObject.parseObject(jsonStr, MessageDto.Ticket.class);
constantService.saveConstant(WeiXinConstant.getSuiteTicket(ticket.getSuiteId()), ticket.getSuiteTicket()); constantService.saveConstant(WeiXinConstant.getSuiteTicket(ticket.getSuiteId()), ticket.getSuiteTicket());
//获取第三方应用凭证
getSuiteAccessToken(ticket.getSuiteId(),ticket.getSuiteTicket());
break; break;
case "create_auth" : case "create_auth" :
MessageDto.Grant grant = JSONObject.parseObject(jsonStr, MessageDto.Grant.class); MessageDto.Grant grant = JSONObject.parseObject(jsonStr, MessageDto.Grant.class);
constantService.saveConstant(WeiXinConstant.getTempAuthCodeKey(grant.getSuiteId()), grant.getAuthCode()); constantService.saveConstant(WeiXinConstant.getTempAuthCodeKey(grant.getSuiteId()), grant.getAuthCode());
getPermanentCode(grant.getAuthCode()); //获取永久授权
getPermanentCode(grant.getSuiteId(), grant.getAuthCode());
break; break;
case "change_auth" : case "change_auth" :
//TODO 变更授权通知 //TODO 变更授权通知
@ -94,7 +135,33 @@ public class WeixinController {
break; break;
//TODO 成员变更和部门变更通知 //TODO 成员变更和部门变更通知
} }
return verifyURL; return "success";
}
/**
* 异步获取suite_access_token
* @param suite_id
* @param suite_ticket
*/
@Async
public void getSuiteAccessToken(String suite_id, String suite_ticket) {
weiXinService.getSuiteToken(suite_id, suite_ticket);
}
/**
* 读取body
* @param request
* @return
* @throws IOException
*/
private String getBody(HttpServletRequest request) throws IOException {
BufferedReader br = request.getReader();
String str = "";
String listString = "";
while ((str = br.readLine()) != null) {
listString += str;
}
return listString;
} }
/** /**
@ -102,14 +169,19 @@ public class WeixinController {
* @param authCode * @param authCode
*/ */
@Async @Async
public void getPermanentCode(String authCode){ public void getPermanentCode(String suiteId, String authCode){
weiXinService.savePermanentCode(authCode); String suiteTicket = constantService.getByKey(WeiXinConstant.getSuiteTicket(suiteId));
// TODO 读取部门信息和成员信息 String suiteToken = weiXinService.getSuiteToken(suiteId, suiteTicket);
String accessToken = weiXinService.savePermanentCode(authCode, suiteToken);
if (StrUtil.isNotBlank(accessToken)) {
weiXinService.initDepartment(accessToken);
}
} }
/** /**
* 系统验证 * 系统验证
*/ */
@GetMapping("reciveSysMsg") @RequestMapping(value = "reciveSysMsg",method = {RequestMethod.POST, RequestMethod.GET})
public String reciveSysMsg(MessageDto dto) throws Exception{ public String reciveSysMsg(MessageDto dto) throws Exception{
log.info("请求参数:{}", dto); log.info("请求参数:{}", dto);
WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(WeiXinConstant.token, WeiXinConstant.encodingAESKey, WeiXinConstant.corpID); WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(WeiXinConstant.token, WeiXinConstant.encodingAESKey, WeiXinConstant.corpID);

4
health/src/main/java/com/ccsens/health/service/IWeiXinService.java

@ -9,14 +9,14 @@ public interface IWeiXinService {
* 保存永久授权 * 保存永久授权
* @param authCode 微信返回永久授权字符串 * @param authCode 微信返回永久授权字符串
*/ */
void savePermanentCode(String authCode); String savePermanentCode(String authCode, String suiteAccessToken);
/** /**
* 获取第三方应用凭证 * 获取第三方应用凭证
* @param suiteId * @param suiteId
* @param suiteTicket * @param suiteTicket
*/ */
void getSuiteToken(String suiteId, String suiteTicket); String getSuiteToken(String suiteId, String suiteTicket);
/** /**
* 获取第三方授权 * 获取第三方授权

17
health/src/main/java/com/ccsens/health/service/WeiXinService.java

@ -76,7 +76,7 @@ public class WeiXinService implements IWeiXinService {
} }
@Override @Override
public void getSuiteToken(String suiteId, String suiteTicket) { public String getSuiteToken(String suiteId, String suiteTicket) {
log.info("获取suiteToken, suiteId:{}, suiteTicket:{}", suiteId, suiteTicket); log.info("获取suiteToken, suiteId:{}, suiteTicket:{}", suiteId, suiteTicket);
String key = WeiXinConstant.getSuiteAccessToken(suiteId); String key = WeiXinConstant.getSuiteAccessToken(suiteId);
String suiteAccessToken = (String)redisUtil.get(key); String suiteAccessToken = (String)redisUtil.get(key);
@ -87,7 +87,7 @@ public class WeiXinService implements IWeiXinService {
int expireTime = 1200; int expireTime = 1200;
if (expire > expireTime) { if (expire > expireTime) {
log.info("有效时长大于1200,无需更新"); log.info("有效时长大于1200,无需更新");
return; return suiteAccessToken;
} }
} }
@ -101,23 +101,25 @@ public class WeiXinService implements IWeiXinService {
if (!WeiXinConstant.pageResult(result)) { if (!WeiXinConstant.pageResult(result)) {
log.info("获取suite_ticket异常"); log.info("获取suite_ticket异常");
// TODO // TODO
return; return null;
} }
redisUtil.set(key, result.getString("suite_access_token"), result.getInteger("expires_in")); redisUtil.set(key, result.getString("suite_access_token"), result.getInteger("expires_in"));
return result.getString("suite_access_token");
} }
@Override @Override
public void savePermanentCode(String authCode) { public String savePermanentCode(String authCode, String suiteAccessToken) {
//授权成功通知 //授权成功通知
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
params.put("auth_code", authCode); params.put("auth_code", authCode);
String result = RestTemplateUtil.postBody(WeiXinConstant.GET_PERMANENT_CODE, params); String url = WeiXinConstant.GET_PERMANENT_CODE + " ?suite_access_token=" + suiteAccessToken;
String result = RestTemplateUtil.postBody(url, params);
log.info("获取永久授权返回:{}", result); log.info("获取永久授权返回:{}", result);
JSONObject json = JSONObject.parseObject(result); JSONObject json = JSONObject.parseObject(result);
if (json.getInteger(WeiXinConstant.ERR_CODE).intValue() != 0) { if (json.getInteger(WeiXinConstant.ERR_CODE).intValue() != 0) {
log.error("获取永久授权码异常:{}", result); log.error("获取永久授权码异常:{}", result);
//TODO 异常如何处理 //TODO 异常如何处理
return; return null;
} }
HealthAuth auth = initAuth(json); HealthAuth auth = initAuth(json);
HealthAuthAgent agent = initAuthAgent(json); HealthAuthAgent agent = initAuthAgent(json);
@ -126,6 +128,7 @@ public class WeiXinService implements IWeiXinService {
if (agent != null) { if (agent != null) {
healthAuthAgentMapper.insertSelective(agent); healthAuthAgentMapper.insertSelective(agent);
} }
return json.getString("access_token");
} }
@Override @Override
@ -198,7 +201,7 @@ public class WeiXinService implements IWeiXinService {
} }
}); });
// 保存员工信息 // 保存员工信息
insertBatchEmployee(employees, des);
} }
private void insertBatchEmployee(List<Employee> employees, List<DepartmentEmployee> des) { private void insertBatchEmployee(List<Employee> employees, List<DepartmentEmployee> des) {

1
util/src/main/java/com/ccsens/util/enterprisewx/dto/MessageDto.java

@ -16,6 +16,7 @@ public class MessageDto {
private String msg_signature; private String msg_signature;
private String timestamp; private String timestamp;
private String nonce; private String nonce;
//get方法返回
private String echostr; private String echostr;

Loading…
Cancel
Save