最近在一个项目中要求星空对接钉钉数据,
尝试了几种对接方式:
1、用钉钉新接口对接
2、自定义接口对接
3、用钉钉旧接口对接
最后发现除了旧接口可以对接外,其他几种方式都有各自的缺点。
其一:用钉钉新接口对接我这边是直接使用了钉钉开发文档给出的sdk,这个虽然很好用,但是在调试时发现,其使用的Networkjson组件和星空使用的这个组件版本不一致,然而这个组件又不能高版本兼容低版本。如果使用了钉钉的高本版会导致星空无法登录。系统奔溃,如果使用了星空的低版本,钉钉这边的sdk组件又不能运行。
其二:在上次失败后我选中使用自定义的接口去直接调用钉钉提供的地址。发现这种方式根本就没法调通。最后发现是钉钉接口做了安全控制。不允许外部接口随意调用。于是这种方式就废弃了。
其三:使用钉钉旧的接口,这个接口的话挺方便,不过钉钉官方申明,不再对旧接口进行维护,保持原样。
调用这个接口时可以直接取到数据包,
调用本接口前,请注意以下限制:
如果只传了start_time参数,这个时间距离当前时间不能超过120天,end_time不传则默认取当前时间。
如果传了start_time和end_time,时间范围不能超过120天,同时start_time时间距当前时间不能超过365天。
批量获取的实例ID个数(循环获取),最多不能超过10000个。
Open API调用量50万次/月
另外提供部分C#源码供参考
IDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
OapiGettokenRequest request = new OapiGettokenRequest();
request.Appkey = AppKey;
request.Appsecret = AppSecret;
request.SetHttpMethod("GET");
OapiGettokenResponse response = client.Execute(request);
string responsemsg = response.Errmsg;
if (!responsemsg.Equals("ok"))
{
//输出异常日志
string err = "获取钉钉token失败!";
var jsonData = "";
updatelog(ctx, "无", err, jsonData);
return;
}
IDingTalkClient ProcessInstanceIdclient = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/processinstance/listids");
OapiProcessinstanceListidsRequest reqPro = new OapiProcessinstanceListidsRequest();
reqPro.ProcessCode = ProcessCode;
reqPro.StartTime = staticks;
reqPro.EndTime = endticks;
reqPro.Size = 20L;
reqPro.Cursor = cursor;
//reqPro.UseridList="manager1,manager2";
OapiProcessinstanceListidsResponse rspPros = ProcessInstanceIdclient.Execute(reqPro, response.AccessToken);
string rspProsmsg = rspPros.Errmsg;
if (!rspProsmsg.Equals("ok"))
{
//输出异常日志
string err = "未获钉钉流程id失败!";
var jsonData = "";
updatelog(ctx, "无", err, jsonData);
}
if (rspPros.Result.NextCursor==0)
{
next_cursor = 999999;
}
else
{
next_cursor = rspPros.Result.NextCursor;
//next_cursor = 999999;//--------------------------------上线需要删除---------------------------------------------------------
}
IDingTalkClient SPClient = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/processinstance/get");
OapiProcessinstanceGetRequest req = new OapiProcessinstanceGetRequest();
req.ProcessInstanceId = procid;
OapiProcessinstanceGetResponse rsps = SPClient.Execute(req, response.AccessToken);
string rsp = rsps.Body;
JObject respj = JObject.Parse(rsp);
string respjmsg = (string)respj["errmsg"];
if (!respjmsg.Equals("ok"))
{
//输出异常日志
string err = "未获取到钉钉对应的流程!";
var jsonData = "";
updatelog(ctx, "无", err, jsonData);
continue;
}
//流程状态已经完成
string status = Convert.ToString((string)respj["process_instance"]["status"]);
if (!status.Equals("COMPLETED"))
{
continue;
}