如易云-钉钉集成1(企业定制应用)
关于钉钉开发平台,请移步了解https://open-doc.dingtalk.com/?spm=a219a.7629140.0.0.3ndh3z 。说实话,钉钉开发者社区还很不成熟,有太多需要改进的地方。希望通过本篇,可以加速大家基于钉钉做开发!
首先来了解下钉钉开发者生态,即官方目前限定的开放形态。钉钉官方说明 即ISV开发的微应用、ISV开发的服务窗应用、企业定制应用。前两者都是可以在“应用商店”(姑且叫这个名字吧)中找到并安装使用的,只是业务服务形式不同;企业定制应用的话是非开放的,企业内部的信息化系统按照钉钉开放平台方式集成到钉钉中而已。简单点可以这么划分,自己企业基于钉钉开发的应用 和 第三方基于钉钉开发的应用。有了这样的理解之后,我们也就知道了在代码开发层面 基本相同,只是因为两种业务模型的不同,导致在接入调用时有所差异罢了。关于差异 容我稍后再表。我们重点侧重于从开发者角度来理解整个过程。对于这两大类应用,从使用者企业的角度来看,都是安装应用->使用应用。对于企业定制应用,参见 企业接入指南 ,如图:
新建定制应用对于开发者而言,很清楚,需要自己开发一套应用,将首页信息填写在这里;对于ISV开发的应用,需要搜索-安装-使用,这也是常用的使用钉钉的方式。我们可以这么理解:定制应用我们使用URL的方式把它集成进钉钉;第三方应用我们是以钉钉抽象的模型方式把它插入钉钉容器。
我们知道了如何安装应用(自己开发和第三方开发的)后,看看背后的技术支撑。作为运行在钉钉平台上的应用,首先要解决的就是交互问题,交互的前提是互信和识别对方,如图(https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.6PAq3z&treeId=174&articleId=104939&docType=1 ):
初始化配置到了代码层面,不得不说钉钉开发平台文档的结构化思维太欠,而且各类凌乱和不够工程化,真是让人不爽!为了较好的理解,这一系列机制,降低代码上手门槛,以企业定制应用接入为例说明。注册为企业以后,进入OA管理后台,具体地址:https://oa.dingtalk.com/index.htm#/microApp/microAppList ,新建企业应用就会弹出上面那个截图,设置局域网IP的访问地址即可。点击左边的“微应用设置”即可拿到CorpID和CorpSecret值,这个是和钉钉建立连接,获取签名必备的信息。获取签名,常见的方式是:应用的服务端和钉钉交互,获取相关的信息,然后应用前端通过ajax获取到做dd.config初始化。我们使用java语言开发,所以需要java SDK,可惜的是钉钉并没有提供maven私服,大家可以使用如易云私服获取钉钉java SDK,
url "http://repo.startupeasy.cn:8081/repository/maven-public/"
我们使用gradle,依赖如下:
compile"com.dingtalk.open:client-sdk.api:1.0.0-SNAPSHOT"
compile"com.dingtalk.open:client-sdk.core:1.0.0-SNAPSHOT"
compile"com.dingtalk.open:client-sdk.common:1.0.0-SNAPSHOT"
compile"com.dingtalk.open:client-sdk.spring:1.0.0-SNAPSHOT"
compile"com.laiwang.lippi:lippi.oapi.encryt:1.0.3-SNAPSHOT"
【
题外话:因为我们使用的nexus 3+版本,不提供web方式上传第三方jar包,我们只能使用命令行方式上传,如下:
mvn deploy:deploy-file -DgroupId=com.dingtalk.open -DartifactId=client-sdk.api -Dversion=1.0.0-SNAPSHOT -Dpackaging=jar -Dfile=/Users/qyang/works/mywork/dd/ding-isv-access/api/lib/client-sdk.api-1.0.0-SNAPSHOT.jar -Durl=http://repo.startupeasy.cn:8081/repository/maven-snapshots/ -DrepositoryId=starteasy
mvn deploy:deploy-file -DgroupId=com.dingtalk.open -DartifactId=client-sdk.core -Dversion=1.0.0-SNAPSHOT -Dpackaging=jar -Dfile=/Users/qyang/works/mywork/dd/ding-isv-access/api/lib/client-sdk.core-1.0.0-SNAPSHOT.jar -Durl=http://repo.startupeasy.cn:8081/repository/maven-snapshots/ -DrepositoryId=starteasy
mvn deploy:deploy-file -DgroupId=com.dingtalk.open -DartifactId=client-sdk.common -Dversion=1.0.0-SNAPSHOT -Dpackaging=jar -Dfile=/Users/qyang/works/mywork/dd/ding-isv-access/api/lib/client-sdk.common-1.0.0-SNAPSHOT.jar -Durl=http://repo.startupeasy.cn:8081/repository/maven-snapshots/ -DrepositoryId=starteasy
mvn deploy:deploy-file -DgroupId=com.dingtalk.open -DartifactId=client-sdk.spring -Dversion=1.0.0-SNAPSHOT -Dpackaging=jar -Dfile=/Users/qyang/works/mywork/dd/ding-isv-access/api/lib/client-sdk.spring-1.0.0-SNAPSHOT.jar -Durl=http://repo.startupeasy.cn:8081/repository/maven-snapshots/ -DrepositoryId=starteasy
mvn deploy:deploy-file -DgroupId=com.laiwang.lippi -DartifactId=lippi.oapi.encryt -Dversion=1.0.3-SNAPSHOT -Dpackaging=jar -Dfile=/Users/qyang/works/mywork/dd/ding-isv-access/api/lib/lippi-oapi-encrpt.jar -Durl=http://repo.startupeasy.cn:8081/repository/maven-snapshots/ -DrepositoryId=starteasy
】
服务端代码就比较简单了,如下:
String accessToken = ((CorpConnectionService)corpConnectionService.getObject()).getCorpToken(DingTalkConfig.CorpID, DingTalkConfig.CorpSecret);
String jsTicket = (String)JSON.parse(((JsapiService)jsapiService.getObject()).getJsapiTicket(accessToken,"jsapi"), HashMap.class).get("ticket");
String nonceStr ="abcdefg";
longtimeStamp = System.currentTimeMillis() /1000;
String signedUrl = request.getParameter("signedUrl");
String signature = AuthUtil.sign(jsTicket, nonceStr, timeStamp, signedUrl);
Map bizData =newHashMap<>();
bizData.put("nonceStr", nonceStr);
bizData.put("jsTicket", jsTicket);
bizData.put("timeStamp", String.valueOf(timeStamp));
bizData.put("signature", signature);
bizData.put("agentId", DingTalkConfig.AgentId);
bizData.put("corpId", DingTalkConfig.CorpID);
这几个http的spring bean初始化参见 钉钉文档:
我们使用的springboot进行初始化,稍后会释出相关的代码。后面就是API的调用问题,慢慢熟悉API吧(我们现在使用的java SDK发现有限模型和返回的数据已经不一致了,还是需要我们自行处理。【这里说下我习惯用okhttp+retrofit,将http协议java化那是非常的方便】)
有了以上的只是储备后,我们看看ISV方式。这里有几个概念:套件,微应用,服务窗应用。除了连接部分的处理方式不同意外,平台核心API的调用完全一致。那我们接下来看看ISV如何基于钉钉平台开发。