接手企业微信接口有一段时间了,最近工作不忙,研究一下java使用会话的sdk。中间有一些疑惑还没有找到答案,望各位大佬指点
准备工作
首先去官网下载sdk,地址如下
https://open.work.weixin.qq.com/api/doc/90000/90135/91774
本人下载了windows的SDK v1.0、SDK v1.1,linux的SDK v1.2
<span style=“color: red;”>
解释下为什么要下载windows2个版本的sdk,因为v1.0的dll文件是以32结尾的,v1.1的dll是以x64结尾的。猜测是区分32、64位操作系统吗?本人pc64位操作系统,2个版本都可以使用,希望知道原理的大佬留言评论,暂且就当作区分操作系统的吧
<span>
调试工作
首先测试windows v1.0版本sdk。导入idea,修改main方法如下(demo写的什么鬼,传一堆参数)
public static void main(String[] args){
long sdk = Finance.NewSdk();
System.out.println(Finance.Init(sdk, "wwd08c8e7c775ab44d", "zJ6k0naVVQ--gt9PUSSEvs03zW_nlDVmjLCTOTAfrew"));
long slice = Finance.NewSlice();
long ret = Finance.GetChatData(sdk, 0, 10, "", "", 1000L, slice);
if (ret != 0) {
System.out.println("getchatdata ret " + ret);
return;
}
System.out.println("getchatdata :" + Finance.GetContentFromSlice(slice));
Finance.FreeSlice(slice);
Finance.DestroySdk(sdk);
}
运行,打印出getchatdata :{“errcode”:41001,“errmsg”:“access_token missing, hint: [xxx], from ip: xxx, more info at https://open.work.weixin.qq.com/devtool/query?e=41001","chatdata”:[]},更换corpid、secret,添加白名单,再次运行。完美,收工。
如果只是证明sdk可以运行,则可以关闭本帖了,这大概也是v1.0的本意
打包运行
只简单介绍下idea下怎么打jar包
File->Project Structure->Artifacts->+>JAR->from modules with ...->选择Main Class,其他默认->OK
Build->Build Artifacts...->Build
java -jar WeWorkFinanceSdk.jar,满心期待的报错输出了。解压jar包,发现dll一个没打进去。调整目录结构,把dll文件打包进去,发现不止jar包运行报错,idea下运行也报错了,还是调整回去吧。
<span style=“color: red;”>
流下了没有技术的眼泪,一行一行debug发现System.loadLibrary会加载当前工作目录下的dll。哪位大佬指点下jdk为什么这样搞?
<span>
对于一个web程序猿,还是去搞spring上使用吧,不用spring的也可以参考下
对于64位操作系统,就不在多写了,需要注意就是升级"x64: vc_redist.x64.exe"。参考https://developers.weixin.qq.com/community/develop/doc/000a82a895c3e8170b9bc22b456800?highLine=windows%252064%2520%25E4%25BC%259A%25E8%25AF%259D
对于linux,找猫画虎写了个demo,没有debug
spring上运行
JNA运行
jna简化了jni的复杂性,按照如下语句初始化即可
Finance INSTANCE = Native.load("WeWorkFinanceSdk", Finance.class);
windows idea 上运行成功,java -jar 运行不出所料报错了。linux上 java -jar 运行成功
<span style=“color: red;”>
猜测windows上找不到依赖的dll,如不对请大佬评论改正
<span>
JNI运行
根据jna源码原理CV一套JNI调用代码,其中有几个坑不是很理解。望大佬指教
<span style=“color: red;”>
1、依赖的dll文件使用File.createTempFile生产临时文件,只是文件名称改变就不能用。啥原理?
2、String resourceLibraryName = Platform.RESOURCE_PREFIX + File.separator + System.mapLibraryName(libraryName);Thread.currentThread().getContextClassLoader().getResourceAsStream(resourceLibraryName); java -jar 时加载不到资源,File.separator改成"/"就可以了。按说不都可以吗?
3、windows上file.deleteOnExit()在运行结束后不删除文件,是什么导致的?
<span>
附录
远程调试命令
java -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=y -jar wework-finance-sdk-0.0.1-SNAPSHOT.jar
源码地址
https://gitee.com/dgguo/we-chat-sdk.git