package foundation.icall.connector;
|
|
import java.util.Date;
|
|
import foundation.dao.DataReader;
|
import foundation.handler.DataPool;
|
import foundation.handler.ResultPool;
|
import foundation.icall.ICall;
|
import foundation.icall.callout.ICallRequest;
|
import foundation.icall.callout.JSONResponse;
|
import foundation.json.JObjectReader;
|
import foundation.util.DingCallbackCrypto;
|
import foundation.util.Util;
|
import foundation.workflow.WorkStep;
|
import okhttp3.MediaType;
|
import okhttp3.OkHttpClient;
|
import okhttp3.Request;
|
import okhttp3.RequestBody;
|
import okhttp3.Response;
|
|
public class GSPConn extends HttpServerConn {
|
private static GSPConn instance;
|
private static int TimeOutHour = 2;
|
private static String monitorId = "GSPConn";
|
public Date serverLastTime;
|
private String token;
|
|
private GSPConn() {
|
}
|
|
public static synchronized GSPConn getInstance() {
|
if (instance == null) {
|
instance = new GSPConn();
|
}
|
|
return instance;
|
}
|
|
public ResultPool echo(ResultPool resultPool, DataPool dataPool) throws Exception{
|
return resultPool;
|
}
|
|
@Override
|
public JObjectReader formatReader(DataReader reuqestReader) throws Exception{
|
DataPool dataPool = reuqestReader.getDataPool();
|
JObjectReader dataReader = dataPool.getJObjectReader();
|
String signature = dataPool.getParam("signature");
|
String msgSignature = dataPool.getParam("msg_signature");
|
String timeStamp = dataPool.getParam("timestamp");
|
String nonce = dataPool.getParam("nonce");
|
String encryptMsg = dataReader.getString("encrypt");
|
encryptMsg = encryptMsg.replace(' ', '+');
|
String aesToken = meta.getString("token");
|
String aesKey = meta.getString("aes_key");
|
String keyField = dataPool.getParam("keyfield");
|
|
if (Util.isEmpty(keyField)){
|
keyField = "client_id";
|
}
|
String suitKey = meta.getString(keyField);
|
|
DingCallbackCrypto callbackCrypto = new DingCallbackCrypto(aesToken, aesKey, suitKey);
|
String decryptMsg = callbackCrypto.getDecryptMsg(msgSignature, timeStamp, nonce, encryptMsg);
|
JObjectReader result = new JObjectReader(decryptMsg);
|
|
result.put("signature", signature);
|
result.put("timestamp", timeStamp);
|
result.put("nonce", nonce);
|
result.put("msgSignature", msgSignature);
|
return result;
|
}
|
|
@Override
|
public void login(WorkStep step, ICall iCall) throws Exception {
|
if (!tokenExpired()) {
|
return;
|
}
|
|
//1. 获取 token
|
getToken();
|
}
|
|
@Override
|
public void logout(WorkStep step, ICall iCall) throws Exception {
|
|
}
|
|
@Override
|
public ICallRequest createRequest(String url) {
|
String baseUrl = meta.getString("base_url");
|
ICallRequest request = new ICallRequest(baseUrl + url + "&token=" + token);
|
return request;
|
}
|
|
private boolean tokenExpired() {
|
if (Util.isEmpty(token) || serverLastTime == null) {
|
return true;
|
}
|
|
Date now = new Date();
|
boolean result = now.getTime() - serverLastTime.getTime() >= TimeOutHour * 60 * 60 * 1000;
|
logger.info("是否重新获取token:{}, 上次获取token时间:{}, 本次获取token时间:{}", result, serverLastTime, now);
|
|
return result;
|
}
|
|
private void getToken() throws Exception {
|
String appId = meta.getString("app_id");
|
String appKey = meta.getString("app_key");
|
String secret = meta.getString("app_secret");
|
String url = meta.getString("base_url");
|
String tokenUrl = meta.getString("token_url");
|
|
StringBuilder urlBuilder = new StringBuilder(url + tokenUrl);
|
urlBuilder.append("&app_id=" + appId);
|
urlBuilder.append("&app_key=" + appKey);
|
urlBuilder.append("&app_secret=" + secret);
|
|
Request request = new Request.Builder()
|
.url(urlBuilder.toString())
|
.post(RequestBody.create(MediaType.parse("text/plain"), ""))
|
.build();
|
|
OkHttpClient httpClient = new OkHttpClient();
|
Response response = httpClient.newCall(request).execute();
|
JSONResponse result = new JSONResponse(response);
|
logger.info("result:{}", result);
|
token = result.getString("token");
|
logger.info("token:{}", token);
|
|
serverLastTime = new Date();
|
}
|
|
public String getName() {
|
return meta.getName();
|
}
|
|
@Override
|
public String getAccessToken() {
|
return token;
|
}
|
}
|