赞
踩
当我们对接钉钉第三方服务商应用,也叫ISV应用,就是企业微信的第三方服务商应用。有以下几个要点步骤。
认证产品方案服务商https://partner.dingtalk.com/indexReource#/isv_service/service_info1、打开上面的网址,点击【去认证】。注意,这里一定要使用管理员的帐号去操作,否则可能看不到网页或提示无权限。页面认证的图大概如下。这里也是需要营业执照和公司的公章。
2、这里的第一步非常的重要,如果第一步没有完成,后面的步骤是无法看到的,比如新建第三方应用等操作。
3、如果上面的认证没有完成,技术人员可以先去认证成为开发者,输入自己相关的信息,例如手机号等。
钉钉企业应用列表https://open-dev.dingtalk.com/fe/app#/corp/app1、打开上面的网页,进入后,点击【应用开发】,选择【第三方企业应用】。可以参照下图。
2、选择【第三方企业应用】,然后点击右边的创建应用。
3、新建的时候,选择【H5微应用】,这样既可以在PC端也可以在手机端,本文只是DEMO,所以选择的是JSP,前后端一起的。
4、也可以参照下面的教程,都是填写一些基本信息。
1、进入到具体的开发,可以参照下面的博文,比较全面。
2、代码参照地址,记得配置IP白名单,这里叫出口IP配置,不然调用接口提示没有权限。
钉钉H5微应用开发,服务端示例代码https://gitee.com/lne/ding-server#https://gitee.com/link?target=https%3A%2F%2Fwww.cnblogs.com%2Fapplerosa%2Fp%2F11509512.html3、该代码对应的操作图文教程,如下:
钉钉H5微应用开发,服务端示例代码-图文教程钉钉第三方企业/服务提供商的小程序/微应用开发,实现授权,回调,响应下单,用户免登等基础功能的教程说明;https://www.cnblogs.com/applerosa/p/11509512.html4、参照上面的教程后,基本的suit推送,登录都是可以的,为了后续的上架,我们还需要对现有的功能进行扩展。钉钉官网要求ISV应用上架必须具备的改造。
改造1,通讯录加密,因为后续选择价格便宜的计算巢方式上架。官方给出的教程地址如下:
通讯录加密 - 钉钉开放平台本文档介绍了通讯录加密的操作流程。https://open.dingtalk.com/document/isv/address-book-encryption1、这里需要注意,不管自己的代码逻辑有没有用到通讯录的(用户名称、用户职位、部门名称)这三个字段,接入的代码必须要有。
2、我这里多赘述一下教程。首先我们需要把自己的index页面的地址按照下面的示例,改造出来。最终的效果就是最下面的一长串一样,中间的都不用改。
3、前端页面引入 open-data SDK,在页面中引入以下SDK。
- <!-- 注意,这行引入,必须放入到整个页面的所有JS的第一行 -->
- <script src="https://auth.dingtalk.com/opendata-1.1.0.js"></script>
4、如下图所示,还有一个要注意的点就是,页面要设置viewport,不然有输入框的页面,在获得焦点后,移动端页面会被放大,这个要注意。还有,下面的一堆JS,都是【安全与监控】-【监控中心】页面复制而来的代码,每个JSP或HTML的页面必须添加,用于监控,不然监控不到数据,后续是无法上架的。
5、前端页面加载 open-data 中的数据。在页面初始化时,需要调用 DTOpenData.init 方法初始化SDK,入参是开通应用企业的corpId。该方法会返回一个boolean值,标识初始化成功或失败。如果初始化失败,一般说明当前用户未登录,需要自动跳转到上面提到的“统一登录”的url进行登录操作。
- <script>
- if (window.DTOpenData.init('$CORPID$')) {
- // 入参是开通应用企业的corpId
- // SDK初始化成功,继续执行页面逻辑
- } else {
- // 说明当前用户未登录,需要跳转到钉钉统一登录
- window.location.href = '$统一登录链接url$';
- }
- </script>
6、大概的意思就是,你原来是直接在自己的onload事件里面调用了登录接口,现在把那个登录接口放在这个if里面就可以了。可以参照下图
7、如果在PC上开发,模拟手机端,console控制台会报错,自己把它注释掉就行。或者如下图所示,如果它检测不到自己的环境,就会输出文字【这不是钉钉的环境,报错啦】,而不是不错。
8、pom中依赖的jar。
- <!-- dingtalk第三方企业应用 -->
- <dependency>
- <groupId>org.apache.httpcomponents</groupId>
- <artifactId>httpclient</artifactId>
- <version>4.5.1</version>
- </dependency>
- <dependency>
- <groupId>org.apache.httpcomponents</groupId>
- <artifactId>httpcore</artifactId>
- <version>4.4.4</version>
- </dependency>
- <dependency>
- <groupId>org.apache.httpcomponents</groupId>
- <artifactId>httpmime</artifactId>
- <version>4.3.5</version>
- </dependency>
- <dependency>
- <groupId>commons-io</groupId>
- <artifactId>commons-io</artifactId>
- <version>2.4</version>
- </dependency>
- <dependency>
- <groupId>com.aliyun</groupId>
- <artifactId>alibaba-dingtalk-service-sdk</artifactId>
- <version>2.0.0</version>
- </dependency>
- <dependency>
- <groupId>com.aliyun</groupId>
- <artifactId>dingtalk</artifactId>
- <version>1.3.77</version>
- <scope>system</scope>
- <systemPath>${pom.basedir}/lib/dingtalk-1.3.77.jar</systemPath>
- </dependency>
- <dependency>
- <groupId>com.aliyun</groupId>
- <artifactId>dingtalk-shaded</artifactId>
- <version>1.3.77</version>
- <scope>system</scope>
- <systemPath>${pom.basedir}/lib/dingtalk-1.3.77-shaded.jar</systemPath>
- </dependency>
9、pom中build的配置
- <build>
- <finalName>dingtalkd3f</finalName>
- <plugins>
- <!-- 指定编译java版本 -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <configuration>
- <source>1.8</source>
- <target>1.8</target>
- <encoding>UTF-8</encoding>
- </configuration>
- </plugin>
- <!-- mvn jar 打包 -->
- <!-- 必须指定1.4.2.RELEASE启动,否则jsp页面无法访问 -->
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- <version>1.4.2.RELEASE</version>
- <configuration>
- <mainClass>cn.renkai721.Dingtalkd3fApplication</mainClass>
- <!-- 包含本地自己引入的jar-->
- <includeSystemScope>true</includeSystemScope>
- </configuration>
- </plugin>
- </plugins>
- <resources>
- <resource>
- <directory>src/main/java</directory>
- <includes>
- <include>**/**</include>
- </includes>
- <filtering>false</filtering>
- </resource>
- <resource>
- <directory>src/main/resources</directory>
- <!-- 加载resources下所有的文件,配置文件和资源文件-->
- <includes>
- <include>**/**</include>
- </includes>
- <filtering>false</filtering>
- </resource>
- <resource>
- <directory>src/main/webapp</directory>
- <!-- 如果不配置,jsp无法访问 -->
- <targetPath>META-INF/resources</targetPath>
- <includes>
- <include>**/**</include>
- </includes>
- <filtering>false</filtering>
- </resource>
- <resource>
- <directory>lib</directory>
- <includes>
- <include>**/*.jar</include>
- </includes>
- </resource>
- </resources>
- </build>
10,系统用到的【dingtalk-1.3.77.jar】和【dingtalk-1.3.77-shaded.jar】,阿里官网nexus下载的地址如下,
alibaba Nexus jar包下载https://s01.oss.sonatype.org/?spm=ding_open_doc.document.0.0.5283b670U93ous#nexus-search;quick~dingtalk网站打开较慢,多等待,多刷新即可。
11、核心加解密的时候,使用的参数如下
- @PostMapping(value = "/dingCallback")
- public Object dingCallback(
- @RequestParam(value = "signature") String signature,
- @RequestParam(value = "timestamp") Long timestamp,
- @RequestParam(value = "nonce") String nonce,
- @RequestBody(required = false) JSONObject body,
- HttpServletRequest request) throws DingTalkEncryptException {
- log.info("接收d3f post请求:[signature=[{}], timestamp=[{}], nonce=[{}] ]",
- signature, timestamp, nonce);
- // 这里的token是登录管理后台-第三方企业应用-应用详情-应用功能-事件与回调
- // id 说明:
- // 1、开发者后台配置的订阅事件为应用级事件推送,
- // 此时OWNER_KEY为应用的APP_KEY(企业内部应用)或SUITE_KEY(三方应用)。
- // 2、调用订阅事件接口订阅的事件为企业级事件推送,
- // 此时OWNER_KEY为:企业的CORP_ID(企业内部应用)或SUITE_KEY(三方应用)
-
-
- return dingTalkEncryptor.getEncryptedMap("failure", timestamp, nonce);
- }
12、官网的事件订阅地址
配置事件订阅 - 钉钉开放平台钉钉会向应用推送订阅的事件,例如部门变更、签到通知、打卡通知等。通过订阅这些事件,可以更好地与钉钉集成。你只需告诉钉钉当某个事件发生时,钉钉需要推送消息到哪个URL,钉钉会以HTTPhttps://open.dingtalk.com/document/orgapp-server/configure-event-subcription13、API Explorer,这个工具可以很快的找到自己需要的API,然后可以点击测试,也可以很快的导航到对应的DOC文档中去,很实用。记得进入页面后选择【第三方企业应用】。API Explorer企业注册并上传企业通讯录后,手机端随时随地找人不再难,与同事和客户免费电话多方通话,重要事DING一下电话使命必达。还可以申请免费企业云邮箱和请假系统、财务报销系统,以及自有OA的移动化管理使用https://open-dev.dingtalk.com/apiExplorer?spm=ding_open_doc.document.0.0.717f722fyXp9c3#/?devType=isv&api=oauth2_1.0%23CreateJsapiTicket
14、钉钉的授权事件,也就是需要解密知道当前监听事件的消息是哪种操作,请看下面的文档。
授权事件 - 钉钉开放平台本文介绍了授权的RDS和SyncHTTP推送的数据格式。https://open.dingtalk.com/document/isvapp-server/authorization-event15、这些事件中biz_type=2,4的时候,关键信息,一定要保存下来。比如2的时候,需要保存【suite_ticket】,接收到【tmp_auth_code】时候,需要激活应用。接收到4的时候,关键信息一定要保存下来,后面会用到agentId,等。
- /**
- * 激活应用授权
- * tmp_auth_code
- */
- public Boolean suiteActive(JSONObject activeNode) throws ApiException {
- Boolean isActive = false;
-
- return isActive;
- }
-
- public String getSuiteToken() {
- String url_suite_token = "https://oapi.dingtalk.com/service/get_suite_token";
-
- return accessToken;
- }
-
- public String getPermanentCode(String suiteAccessToken, String tempCode) {
- String url_permanent_code = "https://oapi.dingtalk.com/service/get_permanent_code";
-
- return permanentCode;
- }
-
- public Boolean activateSuite(String suiteAccessToken, String corpId, String permanentCode) {
- String url_activate_suite = "https://oapi.dingtalk.com/service/activate_suite";
-
- log.debug("激活应用的企业授权, corpId={}, permanentCode={}, isActive={}", corpId, permanentCode, isActive);
- return isActive;
- }
-
-
- public void getCorpAuthInfoByActive(String corpId) {
- String corpToken = get_access_token(corpId);
- }
-
- public JsonNode getCorpAuthInfo(String corpId) {
- String url_get_auth_info = "https://oapi.dingtalk.com/service/get_auth_info";
-
- return result;
- }
-
-
- public String get_access_token(String corp_id) {
- // 调用服务端API获取应用资源时,需要通过access_token来鉴权调用者身份进行授权
- String suiteId = MsgUtil.val("dingtalkd3f.suiteId");
-
- return corp_token;
- }
16、【部署与发布】-【版本管理与发布】,选择要授权的体验组织,然后点击【授权】,后台应该就会收到授权的事件了,如果授权成功,过一会刷新页面就能看到了,如果确认自己的代码没有问题,前端提示授权失败,或其它的没有展示,都是钉钉自己的问题,过一会再试试就OK了。自己也可以生成二维码,让其它的组织加入进来。
17、到此开发的后台基本完毕。
1、上面开发完毕后,就是上架的流程,这个比较难搞,官方写的不清楚。请按照下面的流程来做。
2、点击【部署与发布】-【应用部署】-部署方式选择,计算巢部署。
3、然后关键的操作来了,一定要使用阿里云超管RAM帐号操作,不是普通的子账号或有权限的人的帐号来操作。然后超管需要绑定自己的钉钉号。操作步骤是,登录阿里云控制台
阿里云控制台首页欢迎登录阿里云,全球领先的云计算及人工智能科技公司,阿里云为200多个国家和地区的企业、开发者和政府机构提供云计算基础服务及解决方案。阿里云云计算、安全、大数据、人工智能、企业应用、物联网等云计算服务。https://home.console.aliyun.com/home/dashboard/ProductAndService然后,点击右上角的小图标,然后选择【安全信息管理】
然后去绑定钉钉帐号,
4、接下来,点击【资源管理】
5、进去以后,主要导入ECS,自己的后台服务器;RDS,自己的数据库,注意代码上线不能使用外网地址,必须使用内网链接地址;SLB负载均衡的机器,如果没有SLB,必须要购买一台。这里的ECS和RDS就不多说了。主要说一下SLB。
6、我们随便找一台有nginx的ECS机器,然后在上面装好nginx,在nginx里面转发到自己的后台服务中去,然后SLB负载这里只配置一个http80的端口和一个https443的端口,注意443必须使用公司以及域名的SSL证书。
7、这样配置好了后,回到钉钉的页面,点击【安全与监控】-【钉钉安全域名】,然后就能看到刚才生成的安全域名了。这时候点击提交,去自己的代码里面把以前自己监听的http地址或自定义域名改成这个域名,注意nginx里面要监听这个安全域名,不然你还是访问不到。
8、把自己的以前配置的页面,首页或后台http push的地址都改成这个安全域名就可以了。至于那个页面中一直显示的出口IP未配置,不用去管。直接去点击自检,然后提交上线,这时候有一堆的文件或截图要弄,需要耐心,一步一步去操作。没有的话去网上找些资料改一改。
9、然后需要【安全验收】,【产品验收】,【稳定性验收】,也可以参照下面的几个官网教程
应用部署 - 钉钉开放平台计算巢为服务商提供了一套环境管理应用,一键云资源与应用诊断,一体化监控事件收集和预警体系https://open.dingtalk.com/document/isv/deploy-applications-1计算巢应用导入资源 - 钉钉开放平台本文档介绍了如何访问计算巢关联应用以及资源导入。https://open.dingtalk.com/document/isv/create-a-compute-nest-application安全准入评估指南 - 钉钉开放平台本文介绍了安全准入指南,包括应用基础信息、安全技术、安全管理和其他钉钉自检评估项的安全准入评估要求。https://open.dingtalk.com/document/operation-specification/security-access-evaluation-guide安全性认证 - 钉钉开放平台本文介绍了安全测试报告相关内容,包括常见问题、安全测试用例、安全测试结果等。https://open.dingtalk.com/document/operation-specification/Security-certification10、上面的【安全准入评估指南 - 钉钉开放平台】和【安全性认证 - 钉钉开放平台】很重要,其中的工作量也很大。
11、到此需要完成的基本差不多,只需要完成对应的指标即可申请上架和付款。其中的ISV上架的保证金是10万元。
12、等待审核。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。