企业微信会话存档功能开发

企业微信会话存档功能开发

概述

为保障客户服务质量、提高内部协作效率和监管合规等原因,企业微信提供会话内容存档功能。企业可以统一设置存档的员工范围,并通过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

输入参数直接运行

返回结果解密(未完成)

未完待续

猜你喜欢

转载自blog.csdn.net/weixin_43328357/article/details/121472722