tool_testSdk.cpp 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #include "WeWorkFinanceSdk_C.h"
  2. #include <dlfcn.h>
  3. #include <stdint.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string>
  7. using std::string;
  8. typedef WeWorkFinanceSdk_t* newsdk_t();
  9. typedef int Init_t(WeWorkFinanceSdk_t*, const char*, const char*);
  10. typedef void DestroySdk_t(WeWorkFinanceSdk_t*);
  11. typedef int GetChatData_t(WeWorkFinanceSdk_t*, unsigned long long, unsigned int, const char*, const char*, int, Slice_t*);
  12. typedef Slice_t* NewSlice_t();
  13. typedef void FreeSlice_t(Slice_t*);
  14. typedef int GetMediaData_t(WeWorkFinanceSdk_t*, const char*, const char*, const char*, const char*, int, MediaData_t*);
  15. typedef int DecryptData_t(const char*, const char*, Slice_t*);
  16. typedef MediaData_t* NewMediaData_t();
  17. typedef void FreeMediaData_t(MediaData_t*);
  18. int main(int argc, char* argv[])
  19. {
  20. int ret = 0;
  21. //seq 表示该企业存档消息序号,该序号单调递增,拉取序号建议设置为上次拉取返回结果中最大序号。首次拉取时seq传0,sdk会返回有效期内最早的消息。
  22. //limit 表示本次拉取的最大消息条数,取值范围为1~1000
  23. //proxy与passwd为代理参数,如果运行sdk的环境不能直接访问外网,需要配置代理参数。sdk访问的域名是"https://qyapi.weixin.qq.com"。
  24. //建议先通过curl访问"https://qyapi.weixin.qq.com",验证代理配置正确后,再传入sdk。
  25. //timeout 为拉取会话存档的超时时间,单位为秒,建议超时时间设置为5s。
  26. //sdkfileid 媒体文件id,从解密后的会话存档中得到
  27. //savefile 媒体文件保存路径
  28. //encrypt_key 拉取会话存档返回的encrypt_random_key,使用配置在企业微信管理台的rsa公钥对应的私钥解密后得到encrypt_key。
  29. //encrypt_chat_msg 拉取会话存档返回的encrypt_chat_msg
  30. if (argc < 2) {
  31. printf("./sdktools 1(chatmsg) 2(mediadata) 3(decryptdata)\n");
  32. printf("./sdktools 1 seq limit proxy passwd timeout\n");
  33. printf("./sdktools 2 fileid proxy passwd timeout savefile\n");
  34. printf("./sdktools 3 encrypt_key encrypt_chat_msg\n");
  35. return -1;
  36. }
  37. void* so_handle = dlopen("./libWeWorkFinanceSdk_C.so", RTLD_LAZY);
  38. if (!so_handle) {
  39. printf("load sdk so fail:%s\n", dlerror());
  40. return -1;
  41. }
  42. newsdk_t* newsdk_fn = (newsdk_t*)dlsym(so_handle, "NewSdk");
  43. WeWorkFinanceSdk_t* sdk = newsdk_fn();
  44. //使用sdk前需要初始化,初始化成功后的sdk可以一直使用。
  45. //如需并发调用sdk,建议每个线程持有一个sdk实例。
  46. //初始化时请填入自己企业的corpid与secrectkey。
  47. Init_t* init_fn = (Init_t*)dlsym(so_handle, "Init");
  48. DestroySdk_t* destroysdk_fn = (DestroySdk_t*)dlsym(so_handle, "DestroySdk");
  49. ret = init_fn(sdk, "wwd08c8e7c775ab44d", "zJ6k0naVVQ--gt9PUSSEvs03zW_nlDVmjLCTOTAfrew");
  50. if (ret != 0) {
  51. //sdk需要主动释放
  52. destroysdk_fn(sdk);
  53. printf("init sdk err ret:%d\n", ret);
  54. return -1;
  55. }
  56. int type = strtoul(argv[1], NULL, 10);
  57. if (type == 1) {
  58. //拉取会话存档
  59. uint64_t iSeq = strtoul(argv[2], NULL, 10);
  60. uint64_t iLimit = strtoul(argv[3], NULL, 10);
  61. uint64_t timeout = strtoul(argv[6], NULL, 10);
  62. NewSlice_t* newslice_fn = (NewSlice_t*)dlsym(so_handle, "NewSlice");
  63. FreeSlice_t* freeslice_fn = (FreeSlice_t*)dlsym(so_handle, "FreeSlice");
  64. //每次使用GetChatData拉取存档前需要调用NewSlice获取一个chatDatas,在使用完chatDatas中数据后,还需要调用FreeSlice释放。
  65. Slice_t* chatDatas = newslice_fn();
  66. GetChatData_t* getchatdata_fn = (GetChatData_t*)dlsym(so_handle, "GetChatData");
  67. ret = getchatdata_fn(sdk, iSeq, iLimit, argv[4], argv[5], timeout, chatDatas);
  68. if (ret != 0) {
  69. freeslice_fn(chatDatas);
  70. printf("GetChatData err ret:%d\n", ret);
  71. return -1;
  72. }
  73. printf("GetChatData len:%d data:%s\n", chatDatas->len, chatDatas->buf);
  74. freeslice_fn(chatDatas);
  75. }
  76. else if (type == 2) {
  77. //拉取媒体文件
  78. std::string index;
  79. uint64_t timeout = strtoul(argv[5], NULL, 10);
  80. int isfinish = 0;
  81. GetMediaData_t* getmediadata_fn = (GetMediaData_t*)dlsym(so_handle, "GetMediaData");
  82. NewMediaData_t* newmediadata_fn = (NewMediaData_t*)dlsym(so_handle, "NewMediaData");
  83. FreeMediaData_t* freemediadata_fn = (FreeMediaData_t*)dlsym(so_handle, "FreeMediaData");
  84. //媒体文件每次拉取的最大size为512k,因此超过512k的文件需要分片拉取。若该文件未拉取完整,mediaData中的is_finish会返回0,同时mediaData中的outindexbuf会返回下次拉取需要传入GetMediaData的indexbuf。
  85. //indexbuf一般格式如右侧所示,”Range:bytes=524288-1048575“,表示这次拉取的是从524288到1048575的分片。单个文件首次拉取填写的indexbuf为空字符串,拉取后续分片时直接填入上次返回的indexbuf即可。
  86. while (isfinish == 0) {
  87. //每次使用GetMediaData拉取存档前需要调用NewMediaData获取一个mediaData,在使用完mediaData中数据后,还需要调用FreeMediaData释放。
  88. printf("index:%s\n", index.c_str());
  89. MediaData_t* mediaData = newmediadata_fn();
  90. ret = getmediadata_fn(sdk, index.c_str(), argv[2], argv[3], argv[4], timeout, mediaData);
  91. if (ret != 0) {
  92. //单个分片拉取失败建议重试拉取该分片,避免从头开始拉取。
  93. freemediadata_fn(mediaData);
  94. printf("GetMediaData err ret:%d\n", ret);
  95. return -1;
  96. }
  97. printf("content size:%d isfin:%d outindex:%s\n", mediaData->data_len, mediaData->is_finish, mediaData->outindexbuf);
  98. //大于512k的文件会分片拉取,此处需要使用追加写,避免后面的分片覆盖之前的数据。
  99. char file[200];
  100. snprintf(file, sizeof(file), "%s", argv[6]);
  101. FILE* fp = fopen(file, "ab+");
  102. printf("filename:%s \n", file);
  103. if (NULL == fp) {
  104. freemediadata_fn(mediaData);
  105. printf("open file err\n");
  106. return -1;
  107. }
  108. fwrite(mediaData->data, mediaData->data_len, 1, fp);
  109. fclose(fp);
  110. //获取下次拉取需要使用的indexbuf
  111. index.assign(string(mediaData->outindexbuf));
  112. isfinish = mediaData->is_finish;
  113. freemediadata_fn(mediaData);
  114. }
  115. }
  116. else if (type == 3) {
  117. //解密会话存档内容
  118. //sdk不会要求用户传入rsa私钥,保证用户会话存档数据只有自己能够解密。
  119. //此处需要用户先用rsa私钥解密encrypt_random_key后,作为encrypt_key参数传入sdk来解密encrypt_chat_msg获取会话存档明文。
  120. //每次使用DecryptData解密会话存档前需要调用NewSlice获取一个Msgs,在使用完Msgs中数据后,还需要调用FreeSlice释放。
  121. NewSlice_t* newslice_fn = (NewSlice_t*)dlsym(so_handle, "NewSlice");
  122. FreeSlice_t* freeslice_fn = (FreeSlice_t*)dlsym(so_handle, "FreeSlice");
  123. Slice_t* Msgs = newslice_fn();
  124. // decryptdata api
  125. DecryptData_t* decryptdata_fn = (DecryptData_t*)dlsym(so_handle, "DecryptData");
  126. ret = decryptdata_fn(argv[2], argv[3], Msgs);
  127. printf("chatdata :%s ret :%d\n", Msgs->buf, ret);
  128. freeslice_fn(Msgs);
  129. }
  130. return ret;
  131. }