package foundation.icall.connector;
|
|
import java.util.Date;
|
|
import foundation.dao.bizlogic.IRequest;
|
import foundation.dao.bizlogic.ResponseType;
|
import foundation.data.entity.Entity;
|
import foundation.data.entity.Filter;
|
import foundation.data.object.DataObject;
|
import foundation.handler.DataPool;
|
import foundation.icall.ICall;
|
import foundation.icall.callout.ICallRequest;
|
import foundation.icall.callout.JSONResponse;
|
import foundation.json.JObjectReader;
|
import foundation.persist.NamedSQL;
|
import foundation.persist.SQLRunner;
|
import foundation.util.Util;
|
import foundation.value.ValueType;
|
import foundation.workflow.WorkStep;
|
import okhttp3.MediaType;
|
import okhttp3.OkHttpClient;
|
import okhttp3.Request;
|
import okhttp3.RequestBody;
|
import okhttp3.Response;
|
|
|
public class QyWechatConn extends HttpServerConn {
|
|
private static QyWechatConn instance;
|
private static int TimeOutHour = 2;
|
private static String monitorId = "QyWechatConn";
|
public Date lastTime;
|
private String token;
|
|
private QyWechatConn() {
|
|
}
|
|
public static synchronized QyWechatConn getInstance() {
|
if (instance == null) {
|
instance = new QyWechatConn();
|
}
|
|
return instance;
|
}
|
|
@Override
|
public void login(WorkStep step, ICall iCall) throws Exception {
|
if (!tokenExpired()) {
|
return;
|
}
|
|
//1. 获取 token
|
getToken();
|
}
|
|
@Override
|
public Entity systemLogin(DataPool dataPool) throws Exception {
|
JObjectReader dataReader = dataPool.getJObjectReader();
|
String userName = dataReader.getString("userName");
|
String code = dataPool.getParam("code");
|
String getUserUrl = meta.getString("user_url");
|
IRequest request = createRequest(getUserUrl + code);
|
JSONResponse response = get(request, ResponseType.JSON);
|
|
logger.info(response.toString());
|
String userId = response.getString("userid");
|
if (Util.isEmpty(userId)) {
|
return null;
|
}
|
|
if (!Util.isEmpty(userName)) {
|
if (!accessAuthrize(userName, userId)) {
|
return null;
|
}
|
|
DataObject dataObject = DataObject.getInstance("md_employee");
|
Entity employeeEntity = dataObject.createTableEmptyEntity();
|
employeeEntity.set("qy_wechat_secret", ValueType.Null);
|
dataObject.updateByEntity(employeeEntity, new Filter("qy_wechat_secret", userId));
|
|
employeeEntity.set("qy_wechat_secret", userId);
|
dataObject.updateByEntity(employeeEntity, new Filter("code", userName));
|
}
|
|
Filter filter = new Filter();
|
filter.add("qy_wechat_secret", userId);
|
Entity entity = getExistsUser(filter);
|
|
if (entity == null) {
|
return null;
|
}
|
|
return entity;
|
}
|
|
@Override
|
public void logout(WorkStep step, ICall iCall) throws Exception {
|
|
}
|
|
@Override
|
public ICallRequest createRequest(String url) {
|
String requestUrl = meta.getString("request_url");
|
|
ICallRequest request = new ICallRequest(requestUrl + url);
|
request.addFormData("access_token", token);
|
request.addHeader("Content-Type", "text/plain");
|
return request;
|
}
|
|
private boolean tokenExpired() {
|
if (Util.isEmpty(token)) {
|
return true;
|
}
|
|
Date now = new Date();
|
boolean result = now.getTime() - lastTime.getTime() >= TimeOutHour * 60 * 60 * 1000;
|
|
logger.info("是否重新获取token:{}, 上次获取token时间:{}, 本次获取token时间:{}", result, lastTime, now);
|
|
return result;
|
}
|
|
private void getToken() throws Exception {
|
String corpid = meta.getString("appid");
|
String corpsecret = meta.getString("secret");
|
String url = meta.getString("token_url") + "?corpid=" + corpid + "&corpsecret=" + corpsecret;
|
|
Request request = new Request.Builder()
|
.url(url)
|
.post(RequestBody.create(MediaType.get("text/plain"),""))
|
.build();
|
|
OkHttpClient httpClient = new OkHttpClient();
|
Response response = httpClient.newCall(request).execute();
|
JSONResponse result = new JSONResponse(response);
|
|
token = result.getString("access_token");
|
lastTime = new Date();
|
}
|
|
public String getName() {
|
return meta.getName();
|
}
|
|
|
private boolean accessAuthrize(String userName, String qyWechatUserId) throws Exception {
|
DataObject dataObject = DataObject.getInstance("md_employee");
|
Filter filter = new Filter();
|
filter.add("qy_wechat_secret", "!= ", Util.quotedStr(qyWechatUserId));
|
filter.add("code", "=", Util.quotedStr(userName));
|
int count = dataObject.getCount(filter);
|
|
if (count > 0) {
|
return false;
|
}
|
return true;
|
}
|
|
private Entity getExistsUser(Filter filter) throws Exception {
|
NamedSQL namedSQL = NamedSQL.getInstance("getUserByUsername");
|
|
filter.add("md_employee.is_active", "T");
|
filter.add("sys_user.is_active", "T");
|
namedSQL.setFilter(filter);
|
|
Entity entity = SQLRunner.getEntity(namedSQL);
|
return entity;
|
}
|
}
|