Browse Source

提交开源任务材料

10.0
LAPTOP-SB56SG4Q\86185 3 years ago
parent
commit
37a262dd65
  1. 5
      README.md
  2. BIN
      lib/commons-codec-1.15.jar
  3. BIN
      lib/commons-lang3-3.10.jar
  4. BIN
      lib/commons-text-1.9.jar
  5. BIN
      lib/httpclient-4.5.5.jar
  6. BIN
      lib/httpcore-4.4.9.jar
  7. BIN
      lib/joda-time-2.10.jar
  8. BIN
      lib/zwdd-sdk-java-1.2.0.jar
  9. 20
      plugin.xml
  10. 110
      src/main/java/com/fr/plugin/GlobalRequestFilterPlaceHolder.java
  11. 241
      src/main/java/com/fr/plugin/HttpApi.java
  12. 20
      src/main/java/com/fr/plugin/ZWDDLifeCycleMonitor.java
  13. 57
      src/main/java/com/fr/plugin/ZWDDScanConfig.java
  14. 208
      src/main/java/com/fr/plugin/ZWDDloginFilter.java
  15. 1
      src/main/resources/com/fr/plugin/demo.properties
  16. 1
      src/main/resources/com/fr/plugin/demo_zh_CN.properties
  17. BIN
      政务钉钉扫码插件使用手册.docx

5
README.md

@ -1,3 +1,6 @@
# open-JSD-7874
JSD-7874 政务钉钉集成 开源材料
JSD-7874 政务钉钉集成 开源材料\
免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\
仅作为开发者学习参考使用!禁止用于任何商业用途!\
为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系hugh处理。

BIN
lib/commons-codec-1.15.jar

Binary file not shown.

BIN
lib/commons-lang3-3.10.jar

Binary file not shown.

BIN
lib/commons-text-1.9.jar

Binary file not shown.

BIN
lib/httpclient-4.5.5.jar

Binary file not shown.

BIN
lib/httpcore-4.4.9.jar

Binary file not shown.

BIN
lib/joda-time-2.10.jar

Binary file not shown.

BIN
lib/zwdd-sdk-java-1.2.0.jar

Binary file not shown.

20
plugin.xml

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><plugin>
<id>com.fr.plugin.zwddscan</id>
<name><![CDATA[政务钉钉扫码]]></name>
<active>yes</active>
<version>1.0</version>
<env-version>10.0</env-version>
<jartime>2020-07-31</jartime>
<vendor>fr.open</vendor>
<description><![CDATA[政务钉钉扫码]]></description>
<change-notes><![CDATA[
]]></change-notes>
<lifecycle-monitor class="com.fr.plugin.ZWDDLifeCycleMonitor"/>
<extra-decision>
<!--这个是真实的-->
<GlobalRequestFilterProvider class="com.fr.plugin.ZWDDloginFilter"/>
<!--这个是代理-->
<GlobalRequestFilterProvider class="com.fr.plugin.GlobalRequestFilterPlaceHolder"/>
</extra-decision>
<function-recorder class="com.fr.plugin.ZWDDLifeCycleMonitor"/>
</plugin>

110
src/main/java/com/fr/plugin/GlobalRequestFilterPlaceHolder.java

@ -0,0 +1,110 @@
package com.fr.plugin;
import com.fr.decision.ExtraDecisionClassManager;
import com.fr.decision.fun.GlobalRequestFilterProvider;
import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider;
import com.fr.event.Event;
import com.fr.event.EventDispatcher;
import com.fr.event.Listener;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.context.PluginContext;
import com.fr.plugin.injectable.PluginModule;
import com.fr.plugin.observer.PluginEventType;
import com.fr.stable.StringUtils;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Set;
/**
* @author Peng
*/
public class GlobalRequestFilterPlaceHolder extends AbstractGlobalRequestFilterProvider {
private static final String CURRENT_PLUGIN_ID = "com.fr.plugin.zwddscan";//需要求个这两个配置
private static final String CURRENT_FILTER_NAME = "ddzwLogin";
private static GlobalRequestFilterProvider PLACE_HOLDER_IMPL_FILTER;
@Override
public void init(FilterConfig filterConfig) {
Set<GlobalRequestFilterProvider> providers = ExtraDecisionClassManager.getInstance().getArray(GlobalRequestFilterProvider.MARK_STRING);
if (providers != null) {
for (GlobalRequestFilterProvider provider : providers) {
String filterName = provider.filterName();
if (StringUtils.isNotEmpty(filterName) && CURRENT_FILTER_NAME.equals(filterName)) {
PLACE_HOLDER_IMPL_FILTER = provider;
break;
}
}
}
com.fr.stable.Filter<PluginContext> filter = new com.fr.stable.Filter<PluginContext>() {
@Override
public boolean accept(PluginContext context) {
String pluginId = context.getID();
return context.contain(PluginModule.ExtraDecision, GlobalRequestFilterProvider.MARK_STRING) && CURRENT_PLUGIN_ID.equals(pluginId);
}
};
EventDispatcher.listen(PluginEventType.AfterRun, new Listener<PluginContext>() {
@Override
public void on(Event event, PluginContext context) {
Set<GlobalRequestFilterProvider> providers = context.getRuntime().get(PluginModule.ExtraDecision, GlobalRequestFilterProvider.MARK_STRING);
if (providers != null) {
for (GlobalRequestFilterProvider provider : providers) {
String filterName = provider.filterName();
if (StringUtils.isNotEmpty(filterName) && CURRENT_FILTER_NAME.equals(filterName)) {
PLACE_HOLDER_IMPL_FILTER = provider;
break;
}
}
}
}
}, filter);
EventDispatcher.listen(PluginEventType.BeforeStop, new Listener<PluginContext>() {
@Override
public void on(Event event, PluginContext context) {
PLACE_HOLDER_IMPL_FILTER = null;
}
}, filter);
}
@Override
public String filterName() {
return "GlobalRequestFilterPlaceHolder";
}
@Override
public String[] urlPatterns() {
return new String[]{
"/*"
};
}
@Override
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) {
try {
process(request, response, filterChain);
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e, e.getMessage());
try {
filterChain.doFilter(request, response);
} catch (Exception ex) {
FineLoggerFactory.getLogger().error(ex, ex.getMessage());
}
}
}
public void process(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws Exception {
if (PLACE_HOLDER_IMPL_FILTER == null) {
if(FineLoggerFactory.getLogger().isDebugEnabled()) {
FineLoggerFactory.getLogger().debug("[GlobalRequestFilterPlaceHolder] placeHolderImplFilter 为 null");
}
filterChain.doFilter(request, response);
} else {
PLACE_HOLDER_IMPL_FILTER.doFilter(request, response, filterChain);
}
}
}

241
src/main/java/com/fr/plugin/HttpApi.java

@ -0,0 +1,241 @@
package com.fr.plugin;
import com.fr.json.JSONObject;
import com.fr.log.FineLoggerFactory;
import com.fr.third.fasterxml.jackson.core.JsonGenerationException;
import com.fr.third.fasterxml.jackson.databind.JsonMappingException;
import com.fr.third.fasterxml.jackson.databind.ObjectMapper;
import javax.net.ssl.*;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.security.cert.X509Certificate;
import java.util.Base64;
public class HttpApi {
public HttpApi() {
}
private static ObjectMapper objectMapper = new ObjectMapper();
public static String serialize(Object object) {
Writer write = new StringWriter();
try {
objectMapper.writeValue(write, object);
} catch (JsonGenerationException e) {
} catch (JsonMappingException e) {
} catch (IOException e) {
}
return write.toString();
}
private final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
private static void trustAllHosts() {
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[] {};
}
public void checkClientTrusted(X509Certificate[] chain, String authType) {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) {
}
} };
// Install the all-trusting trust manager
try {
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
e.printStackTrace();
}
}
public static String sendPostByForm(String url, String params) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try {
trustAllHosts();
URL realUrl = new URL(url);
URLConnection conn = realUrl.openConnection();
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
if (realUrl.getProtocol().equalsIgnoreCase("https")) {
HttpsURLConnection https = (HttpsURLConnection) realUrl.openConnection();
https.setHostnameVerifier(DO_NOT_VERIFY);
conn = https;
} else {
conn = realUrl.openConnection();
}
conn.setDoOutput(true);
conn.setDoInput(true);
out = new PrintWriter(conn.getOutputStream());
out.print(params);
out.flush();
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result = result + line;
}
return result;
} catch (Exception e) {
printexception2Fr(e);
} finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (IOException ex) {
printexception2Fr(ex);
}
}
return null;
}
public static void printexception2Fr (Exception e) {
StringWriter writer = new StringWriter();
e.printStackTrace(new PrintWriter(writer));
String s = writer.toString();
FineLoggerFactory.getLogger().error("错误:{}", s);
}
public static String sendJsonPost(String var0, JSONObject var1, String var2) {
PrintWriter var3 = null;
BufferedReader var4 = null;
HttpURLConnection var5 = null;
String var6 = "";
try {
URL var7 = new URL(var0);
var5 = (HttpURLConnection) var7.openConnection();
var5.setRequestProperty("Content-Type", "application/json;charset=utf8");
// var5.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=utf8");
var5.setRequestProperty("accept", "*/*");
var5.setRequestProperty("connection", "Keep-Alive");
var5.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
var5.setRequestProperty("Accept-Charset", var2);
var5.setRequestMethod("POST");
var5.setDoOutput(true);
var5.setDoInput(true);
var3 = new PrintWriter(var5.getOutputStream());
var3.print(var1.toString());
var3.flush();
String var8;
for (var4 = new BufferedReader(new InputStreamReader(var5.getInputStream(), var2)); (var8 = var4.readLine()) != null; var6 = var6 + var8) {
;
}
} catch (Exception var17) {
var17.printStackTrace();
} finally {
try {
if (var3 != null) {
var3.close();
}
if (var4 != null) {
var4.close();
}
} catch (Exception var16) {
;
}
var5.disconnect();
}
System.out.println(var6);
return var6;
}
/**
* 发送传统的表单提交
*
* @param url
* @return
*/
public static String sendGet(String url) {
StringBuilder sb = new StringBuilder();
PrintWriter out = null;
BufferedReader in = null;
HttpURLConnection conn = null;
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
conn = (HttpURLConnection) realUrl.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestMethod("GET");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
conn.setConnectTimeout(100);
conn.setReadTimeout(200);
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
sb = new StringBuilder();
while ((line = in.readLine()) != null) {
sb.append(line);
}
} catch (Exception e) {
if (conn != null) {
InputStream errorStream = ( conn).getErrorStream();
if (errorStream != null) {
in = new BufferedReader(new InputStreamReader(errorStream));
String line;
sb = new StringBuilder();
try {
while ((line = in.readLine()) != null) {
sb.append(line);
}
} catch (Exception ee) {
FineLoggerFactory.getLogger().error("", ee);
}
FineLoggerFactory.getLogger().error("错误响应:=======》" + sb);
}
}
FineLoggerFactory.getLogger().error("发送 GET 请求出现异常!", e);
}
// 使用finally块来关闭输出流、输入流
finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (IOException ex) {
FineLoggerFactory.getLogger().error("", ex);
}
}
return sb.toString();
}
}

20
src/main/java/com/fr/plugin/ZWDDLifeCycleMonitor.java

@ -0,0 +1,20 @@
package com.fr.plugin;
import com.fr.plugin.context.PluginContext;
import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor;
import com.fr.plugin.transform.ExecuteFunctionRecord;
import com.fr.plugin.transform.FunctionRecorder;
@FunctionRecorder
public class ZWDDLifeCycleMonitor extends AbstractPluginLifecycleMonitor {
@Override
@ExecuteFunctionRecord
public void afterRun(PluginContext pluginContext) {
}
@Override
public void beforeStop(PluginContext pluginContext) {
}
}

57
src/main/java/com/fr/plugin/ZWDDScanConfig.java

@ -0,0 +1,57 @@
package com.fr.plugin;
import com.fr.config.*;
import com.fr.config.holder.Conf;
import com.fr.config.holder.factory.Holders;
@Visualization(category = "政务钉钉扫码配置")
public class ZWDDScanConfig extends DefaultConfiguration {
private static volatile ZWDDScanConfig config = null;
public static ZWDDScanConfig getInstance() {
if (config == null) {
config = ConfigContext.getConfigInstance(ZWDDScanConfig.class);
}
return config;
}
@Identifier(value = "appKey", name = "钉钉appkey", description = "",status = Status.SHOW)
private Conf<String> appKey = Holders.simple("");
@Identifier(value = "secret", name = "钉钉appsecret", description = "",status = Status.SHOW)
private Conf<String> appsecret = Holders.simple("");
@Identifier(value = "domainName", name = "钉钉域名", description = "",status = Status.SHOW)
private Conf<String> domainName = Holders.simple("openplatform.dg-work.cn");
public String getAppKey() {
return appKey.get();
}
public void setAppKey(String appKey) {
this.appKey .set(appKey);
}
public String getAppsecret() {
return appsecret.get();
}
public void setAppsecret(String appsecret) {
this.appsecret .set(appsecret);
}
public String getDomainName() {
return domainName.get();
}
public void setDomainName(String domainName) {
this.domainName .set(domainName);
}
@Override
public Object clone() throws CloneNotSupportedException {
ZWDDScanConfig clone = (ZWDDScanConfig) super.clone();
clone.appKey = (Conf<String>) this.appKey.clone();
clone.appsecret = (Conf<String>) this.appKey.clone();
clone.domainName = (Conf<String>) this.appKey.clone();
return clone;
}
}

208
src/main/java/com/fr/plugin/ZWDDloginFilter.java

@ -0,0 +1,208 @@
package com.fr.plugin;
import com.alibaba.xxpt.gateway.shared.client.http.ExecutableClient;
import com.alibaba.xxpt.gateway.shared.client.http.GetClient;
import com.alibaba.xxpt.gateway.shared.client.http.PostClient;
import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider;
import com.fr.decision.webservice.bean.authentication.OriginUrlResponseBean;
import com.fr.decision.webservice.utils.DecisionStatusService;
import com.fr.decision.webservice.v10.login.LoginService;
import com.fr.general.ComparatorUtils;
import com.fr.json.JSONObject;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.transform.FunctionRecorder;
import com.fr.third.org.apache.commons.lang3.StringUtils;
import com.fr.web.utils.WebUtils;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
/**
* 参考实现:
* https://openplatform-portal.dg-work.cn/portal/#/helpdoc?docKey=kfzn&slug=engk1k
*/
@FunctionRecorder(localeKey = "fr2")
public class ZWDDloginFilter extends AbstractGlobalRequestFilterProvider {
@Override
public String filterName() {
return "ddzwLogin";
}
@Override
public String[] urlPatterns() {
return new String[]{
"/ds22222"
};
}
@Override
public void init(FilterConfig filterConfig) {
FineLoggerFactory.getLogger().info("政务钉钉扫码扫码初始化");
ZWDDScanConfig.getInstance();
super.init(filterConfig);
}
private String getToAuthUrl(HttpServletRequest request) {
String url = "https://xxx.zzl.ink:8080/webroot/decision/url/ddcallback";
String apiUrl = "https://login.xxx-work.cn/oauth2/auth.htm";
String clientId = "frt2";
String requestURI = "";
try {
requestURI = URLEncoder.encode(url, StandardCharsets.UTF_8.name());
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return apiUrl + "?response_type=code&client_id=" + clientId + "&redirect_uri=" + requestURI + "&scope=get_user_info&authType=QRCODE";
}
@Override
public void doFilter(HttpServletRequest request, HttpServletResponse httpServletResponse, FilterChain filterChain) {
try {
if (ComparatorUtils.equals(request.getMethod(), "GET") && "/login".equals(request.getPathInfo())) {
String isAdmin = request.getParameter("isAdmin");
if (ComparatorUtils.equals(isAdmin, "1")) {
try {
filterChain.doFilter(request, httpServletResponse);
} catch (IOException e) {
printException2FrLog(e);
} catch (ServletException e) {
printException2FrLog(e);
}
return;
}
String original = WebUtils.getHTTPRequestParameter(request, "origin");
try {
String originUrl = ((OriginUrlResponseBean) DecisionStatusService.originUrlStatusService().get(original)).getOriginUrl();
FineLoggerFactory.getLogger().error("---------回调地址---------:{}", original);
request.getSession(true).setAttribute("callBack", originUrl);
} catch (Exception e) {
e.printStackTrace();
}
sendRedirect(httpServletResponse, getToAuthUrl(request));
return;
}
if (ComparatorUtils.equals(request.getMethod(), "GET") && "/url/ddcallback".equals(request.getPathInfo())) {
String code = request.getParameter("code");
FineLoggerFactory.getLogger().error("---------访问回调地址了---------:{}", code);
if (StringUtils.isNotBlank(code)) {
//通过code进行登录
String userName = getUserName(code);
if (StringUtils.isNotBlank(userName)) {
login(request, httpServletResponse, userName);
//跳回页面
Object callBack = request.getSession().getAttribute("callBack");
if (callBack != null) {
String url = callBack.toString();
try {
FineLoggerFactory.getLogger().error("---------回调地址成功的地址---------:{}", url);
sendRedirect(httpServletResponse, url);
} catch (Exception e) {
e.printStackTrace();
}
} else {
sendRedirect(httpServletResponse, getHomeURI());
return;
}
}else{
sendRedirect(httpServletResponse, getToAuthUrl(request));
}
}
}
filterChain.doFilter(request, httpServletResponse);
} catch (IOException | ServletException e) {
printException2FrLog(e);
} catch (Exception e) {
e.printStackTrace();
}
}
private String getHomeURI() {
return "/webroot/decision";
}
private String getUserName(String code) {
try {
ZWDDScanConfig instance = ZWDDScanConfig.getInstance();
String appkey = instance.getAppKey();
String appsecret = instance.getAppsecret();
//第一步获取accessToken
ExecutableClient executableClient = ExecutableClient.getInstance();
executableClient.setAccessKey(appkey);
executableClient.setSecretKey(appsecret);
executableClient.setDomainName(instance.getDomainName());
executableClient.setProtocal("https");
executableClient.init();
//executableClient要单例,并且使用前要初始化,只需要初始化一次
String api = "/gettoken.json";
GetClient getClient = executableClient.newGetClient(api);
//设置参数
getClient.addParameter("appkey", appkey);
getClient.addParameter("appsecret", appsecret);
//调用API
String sendGet = getClient.get();
JSONObject entries = new JSONObject(sendGet);
boolean success = entries.getBoolean("success");
if (success) {
String accessToken = entries.getJSONObject("content").getJSONObject("data").getString("accessToken");
api = "/rpc/oauth2/getuserinfo_bycode.json";
PostClient postClient = executableClient.newPostClient(api);
//设置参数
postClient.addParameter("access_token", accessToken);
postClient.addParameter("code", code);
String body = postClient.post();
FineLoggerFactory.getLogger().info("获取用户信息请求响应 {} ", body);
FineLoggerFactory.getLogger().info("请求响应 {} ", body);
JSONObject jsonObject = new JSONObject(body);
if (jsonObject.getBoolean("success")) {
return jsonObject.getJSONObject("content").getJSONObject("data").getString("account");
}
FineLoggerFactory.getLogger().info("登录获取用户信息失败");
} else {
FineLoggerFactory.getLogger().info("登录获取的accessToken 失败 ");
}
} catch (Exception e) {
printException2FrLog(e);
}
return "";
}
public static void printException2FrLog(Throwable e) {
StringWriter writer = new StringWriter();
e.printStackTrace(new PrintWriter(writer));
String s = writer.toString();
FineLoggerFactory.getLogger().error("错误:{}", s);
}
private void sendRedirect(HttpServletResponse res, String url) {
res.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
res.setHeader("Location", url);
}
private void login(HttpServletRequest req, HttpServletResponse res, String username) {
String token = null;
try {
token = LoginService.getInstance().login(req, res, username);
req.setAttribute("fine_auth_token", token);
FineLoggerFactory.getLogger().error("login success");
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
FineLoggerFactory.getLogger().error("login failed");
}
}
private boolean isLogin(HttpServletRequest req) {
return LoginService.getInstance().isLogged(req);
}
}

1
src/main/resources/com/fr/plugin/demo.properties

@ -0,0 +1 @@
Plugin-Test_Function_Abs=Test ABS

1
src/main/resources/com/fr/plugin/demo_zh_CN.properties

@ -0,0 +1 @@
Plugin-Test_Function_Abs=测试ABS函数

BIN
政务钉钉扫码插件使用手册.docx

Binary file not shown.
Loading…
Cancel
Save