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

该文介绍了企业微信会话存档功能的SDK开发,包括在Windows和Linux环境下加载动态库的方法。文章详细展示了如何根据操作系统加载不同类型的动态库文件,并提供了加载动态库的代码实现,确保在不同环境中兼容运行。此外,还探讨了为何需要将动态库文件拷贝到系统路径或jar包外的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

概述

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

输入参数直接运行

返回结果解密(未完成)

未完待续

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值