package com.tencent.wework; import java.util.Map; import java.util.HashMap;; /** * @warning: 1. 不要修改成员变量名,native方法内有反射调用 * 2. 调用本地方法需保持包结构,本工具需放在包com.tencent.wework内 * 3. 不允许继承,类名和函数名均不可修改,会影响本地方法的引用,详见:javah生成本地方法头文件 */ public final class SpecCallbackSDK { /** * @description 调用本地方法后实例化的对象指针 */ private long specCallbackSDKptr = 0; public long GetPtr() { return specCallbackSDKptr; } /** * @description: 回包的headers */ private Map responseHeaders; public Map GetResponseHeaders() { return responseHeaders; } /** * @description: 回包的加密后的body */ private String responseBody; public String GetResponseBody() { return responseBody; } /** * @description: 每个请求构造一个SpecCallbackSDK示例, * SpecCallbackSDK仅持有headers和body的引用, * 因此需保证headers和body的生存期比SpecCallbackSDK长 * @param method: 请求方法GET/POST * @param headers: 请求header * @param body: 请求body * @example: * SpecCallbackSDK sdk = new SpecCallbackSDK(method, headers, body); * if (sdk.IsOk()) { * String corpid = sdk.GetCorpId(); * String agentid = sdk.GetAgentId(); * String call_type = sdk.GetCallType(); * String data = sdk.GetData(); * //do something... * } * String response = ...; * sdk.BuildResponseHeaderBody(response); * Map responseHeaders = sdk.GetResponseHeaders(); * String body = sdk.GetResponseBody(); * //do response * * @return errorcode 示例如下: * -920001: 未设置请求方法 * -920002: 未设置请求header * -920003: 未设置请求body * */ public SpecCallbackSDK(String method, Map headers, String body) { try { specCallbackSDKptr = NewCallbackSDK(method, headers, body); } catch (Exception e) { SpecUtil.WWSpecLogError("SpecCallbackSDK exception caught", e.getMessage()); } } private native long NewCallbackSDK(String method, Map headers, String body); /** * @usage 在Java对象的内存回收前析构C++对象 */ @Override protected void finalize() throws Throwable { DeleteCPPInstance(specCallbackSDKptr); super.finalize(); } private native void DeleteCPPInstance(long specCallbackSDKptr); /** * @description: 判断构造函数中传入的请求是否解析成功 * @return: 成功与否 * */ public boolean IsOk() { return IsOk(specCallbackSDKptr); } private native boolean IsOk(long specCallbackSDKptr); /** * @description: 获取请求的企业 * @require: 仅当IsOk() == true可调用 * @return: corpid * */ public String GetCorpId() { return GetCorpId(specCallbackSDKptr); } private native String GetCorpId(long specCallbackSDKptr); /** * @description: 获取请求的应用 * @require: 仅当IsOk() == true可调用 * @return: agentid * */ public long GetAgentId() { return GetAgentId(specCallbackSDKptr); } private native long GetAgentId(long specCallbackSDKptr); /** * @description: 获取请求的类型 * @require: 仅当IsOk() == true可调用 * @return: 1 - 来自[应用调用专区]的请求 * 2 - 来自企业微信的回调事件 * */ public long GetCallType() { return GetCallType(specCallbackSDKptr); } private native long GetCallType(long specCallbackSDKptr); /** * @description: 获取请求数据 * @require: 仅当IsOk() == true可调用 * @return: 请求数据,根据call_type可能是: * - 企业微信回调事件 * - [应用调用专区]接口中的request_data * */ public String GetData() { return GetData(specCallbackSDKptr); } private native String GetData(long specCallbackSDKptr); /** * @description: 是否异步请求 * @require: 仅当IsOk() == true可调用 * @return: 是否异步请求 * */ public boolean GetIsAsync() { return GetIsAsync(specCallbackSDKptr); } private native boolean GetIsAsync(long specCallbackSDKptr); /** * @description: 获取请求的job_info, * @require: 仅当IsOk() == true可调用 * @return: job_info,无需理解内容, * 在同一个请求上下文中使用SpecSDK的时候传入 * */ public String GetJobInfo() { return GetJobInfo(specCallbackSDKptr); } private native String GetJobInfo(long specCallbackSDKptr); /** * @description: 获取请求的ability_id,[应用调用专区]接口时指定 * @require: 仅当IsOk() == true可调用 * @return: ability_id * */ public String GetAbilityId() { return GetAbilityId(specCallbackSDKptr); } private native String GetAbilityId(long specCallbackSDKptr); /** * @description: 获取请求的notify_id,用于[应用同步调用专区程序]接口 * @require: 仅当IsOk() == true可调用 * @return: notify_id * */ public String GetNotifyId() { return GetNotifyId(specCallbackSDKptr); } private native String GetNotifyId(long specCallbackSDKptr); /** * @description: 对返回包计算签名&加密 * @param response: 待加密的回包明文.如果IsOk()==false,传入空串即可 * @note 本接口的执行问题可查看日志 * */ public void BuildResponseHeaderBody(String response) { try { responseHeaders = new HashMap(); responseBody = ""; BuildResponseHeaderBody(specCallbackSDKptr, response); } catch (Exception e) { SpecUtil.WWSpecLogError("SpecCallbackSDK exception caught", e.getMessage()); } } private native void BuildResponseHeaderBody(long specCallbackSDKptr, String response); // 静态代码块内还无法调用native日志函数,这里的日志在管理系统无法查询 static { try { Class.forName("com.tencent.wework.SpecUtil"); } catch (ClassNotFoundException e) { e.printStackTrace(); System.exit(1); } } }