企业微信会话存档功能开发
概述
为保障客户服务质量、提高内部协作效率和监管合规等原因,企业微信提供会话内容存档功能。企业可以统一设置存档的员工范围,并通过API获取开启存档员工的工作沟通内容,满足企业的外部监管合规和内部管理需求。
使用前帮助
## 环境
开发:win10
部署: linux
sdk下载
把动态库拷贝到lib目录下面,Financ类放在com.tencent.wework包下面(必须的)
动态库加载
/**
* 加载动态库
* /lib 或者usr/lib 或者{JAVA_HOME}/jre/bin 等
*/
static {
List<String> libs = new ArrayList<>();
String property = System.getProperty("os.name","linux");
if(property.toLowerCase().startsWith("win")){
libs.add("libssl-1_1-x64.dll");
libs.add("libcurl-x64.dll");
libs.add("libcrypto-1_1-x64.dll");
libs.add("WeWorkFinanceSdk.dll");
}else{
libs.add("libWeWorkFinanceSdk_Java.so");
}
libs.forEach(Finance::loadDynamicLibrary);
}
//对junit测试环境单独处理
private static void loadDynamicLibrary(String s) {
String resourcePath = ResourceUtils.CLASSPATH_URL_PREFIX + "lib/"+ s;
if(isUnitTest()){
loadDevJarDynamicLibrary(resourcePath);
}else{
loadJarDynamicLibrary(resourcePath,s);
}
}
/**
* junit测试环境
* @param classpath
*/
private static void loadDevJarDynamicLibrary(String classpath) {
URL url = null;
try {
url = ResourceUtils.getURL(classpath);
} catch (FileNotFoundException e) {
log.error("loadDynamicLibraryInSpring error,classpath={}",classpath,e);
return;
}
String path = url.getPath();
log.info("开始加载动态库classpath={},path={}",classpath,path);
System.load(path);
}
/**
* 加载jar包里面的lib
* @param classpath classpath:lib/aaa.so
* @param filename aaa.so
*/
private static void loadJarDynamicLibrary(String classpath, String filename) {
ApplicationHome applicationHome = new ApplicationHome(Finance.class);
String rootPath = applicationHome.getSource().getParentFile().toString();
String path = rootPath+ File.separator+filename;
File file = new File(path);
if(file.exists()){
log.info("已经存在动态库file={}",file.getAbsolutePath());
}
try {
URL url = ResourceUtils.getURL(classpath);
InputStream inputStream = url.openConnection().getInputStream();
FileUtils.copyInputStreamToFile(inputStream,file);
String absolutePath = file.getAbsolutePath();
log.info("开始加载动态库path={}",absolutePath);
System.load(absolutePath);
} catch (Exception e) {
log.error("动态库拷贝error,classpath={},filename={}",classpath,filename);
}
}
/**
* 是否是junit测试
* @return
*/
private static boolean isUnitTest() {
try {
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
for (int i = stackTrace.length - 1; i >= 0; i--) {
if (stackTrace[i].getClassName().startsWith("org.junit.")) {
return true;
}
}
}
catch (Exception ex) {
log.error("isUnitTest error",ex);
}
return false;
}
问题:
1.动态库加载的区别
System.load(absolutePath);//加载全路径文件,后面带dll或者so
System.loadLibrary(libName);//加载动态库,只用名字,不带路径和dll或者so
2.为什么要把文件考出来
- 不考出来其实也是能得到文件路径的,得到的的是 /app/jar/app.jar/…/xxx.so,是不能直接加载jar包里面的动态库的
- 考出来可以兼容windows和linux环境
demo
输入参数直接运行
返回结果解密(未完成)
未完待续