当前位置:   article > 正文

钉钉第三方服务商应用ISV应用开发及上架教程_入住钉钉的第三方企业

入住钉钉的第三方企业

 当我们对接钉钉第三方服务商应用,也叫ISV应用,就是企业微信的第三方服务商应用。有以下几个要点步骤。

第一章 服务商入驻

认证产品方案服务商icon-default.png?t=N7T8https://partner.dingtalk.com/indexReource#/isv_service/service_info1、打开上面的网址,点击【去认证】。注意,这里一定要使用管理员的帐号去操作,否则可能看不到网页或提示无权限。页面认证的图大概如下。这里也是需要营业执照和公司的公章。

2、这里的第一步非常的重要,如果第一步没有完成,后面的步骤是无法看到的,比如新建第三方应用等操作。

3、如果上面的认证没有完成,技术人员可以先去认证成为开发者,输入自己相关的信息,例如手机号等。

fb54a5fa913747218c670b9e6b230218.png

第二章 应用配置

钉钉企业应用列表icon-default.png?t=N7T8https://open-dev.dingtalk.com/fe/app#/corp/app1、打开上面的网页,进入后,点击【应用开发】,选择【第三方企业应用】。可以参照下图。

0603f950c2f14a77b746163f37e7fc37.png

2、选择【第三方企业应用】,然后点击右边的创建应用。

3、新建的时候,选择【H5微应用】,这样既可以在PC端也可以在手机端,本文只是DEMO,所以选择的是JSP,前后端一起的。

4、也可以参照下面的教程,都是填写一些基本信息。

钉钉第三方企业应用开发快速入门文章目录钉钉第三方企业应用开发快速入门1、创建小程序1.1. 登录开发者后台1.2. 填写基础信息1.3. 查看应用信息2、设置安全域名3、设置接口权限4、开发管理(创建回调)5、下载源码6、设置与修改源码6.1. 服务器端6.1.1. 配置代码6.2. 前端下载6.2.1. 修改前端配置7、添加体验组织并开通应用8、推送Ticket9、项目关联钉钉应用钉钉第三方企业应用开发快速入门1、创建小程序1.1. 登录开发者后台登录钉钉开发者后台,选择应用开发-第三方企业应用-小程序,点击创建应用。1.https://blog.csdn.net/a309220728/article/details/120704548

第三章 应用开发

1、进入到具体的开发,可以参照下面的博文,比较全面。

2、代码参照地址,记得配置IP白名单,这里叫出口IP配置,不然调用接口提示没有权限。

 出口IP配置官网文档在创建第三方企业应用后,需要完成基础配置,例如服务器出口IP并且要指定数据推送方式。icon-default.png?t=N7T8https://open.dingtalk.com/document/isv/basic-configuration

钉钉H5微应用开发,服务端示例代码icon-default.png?t=N7T8https://gitee.com/lne/ding-server#https://gitee.com/link?target=https%3A%2F%2Fwww.cnblogs.com%2Fapplerosa%2Fp%2F11509512.html3、该代码对应的操作图文教程,如下:

钉钉H5微应用开发,服务端示例代码-图文教程钉钉第三方企业/服务提供商的小程序/微应用开发,实现授权,回调,响应下单,用户免登等基础功能的教程说明;icon-default.png?t=N7T8https://www.cnblogs.com/applerosa/p/11509512.html4、参照上面的教程后,基本的suit推送,登录都是可以的,为了后续的上架,我们还需要对现有的功能进行扩展。钉钉官网要求ISV应用上架必须具备的改造。

改造1,通讯录加密,因为后续选择价格便宜的计算巢方式上架。官方给出的教程地址如下:

通讯录加密 - 钉钉开放平台本文档介绍了通讯录加密的操作流程。icon-default.png?t=N7T8https://open.dingtalk.com/document/isv/address-book-encryption1、这里需要注意,不管自己的代码逻辑有没有用到通讯录的(用户名称、用户职位、部门名称)这三个字段,接入的代码必须要有。

2、我这里多赘述一下教程。首先我们需要把自己的index页面的地址按照下面的示例,改造出来。最终的效果就是最下面的一长串一样,中间的都不用改。

986feb3ec6874f388459cbfe671c2175.png

 3、前端页面引入 open-data SDK,在页面中引入以下SDK。

  1. <!-- 注意,这行引入,必须放入到整个页面的所有JS的第一行 -->
  2. <script src="https://auth.dingtalk.com/opendata-1.1.0.js"></script>

4、如下图所示,还有一个要注意的点就是,页面要设置viewport,不然有输入框的页面,在获得焦点后,移动端页面会被放大,这个要注意。还有,下面的一堆JS,都是【安全与监控】-【监控中心】页面复制而来的代码,每个JSP或HTML的页面必须添加,用于监控,不然监控不到数据,后续是无法上架的。

3513de46b5f14704a18c0328b53e5e21.png

 5、前端页面加载 open-data 中的数据。在页面初始化时,需要调用 DTOpenData.init 方法初始化SDK,入参是开通应用企业的corpId。该方法会返回一个boolean值,标识初始化成功或失败。如果初始化失败,一般说明当前用户未登录,需要自动跳转到上面提到的“统一登录”的url进行登录操作。

  1. <script>
  2. if (window.DTOpenData.init('$CORPID$')) {
  3. // 入参是开通应用企业的corpId
  4. // SDK初始化成功,继续执行页面逻辑
  5. } else {
  6. // 说明当前用户未登录,需要跳转到钉钉统一登录
  7. window.location.href = '$统一登录链接url$';
  8. }
  9. </script>

6、大概的意思就是,你原来是直接在自己的onload事件里面调用了登录接口,现在把那个登录接口放在这个if里面就可以了。可以参照下图

f9b871d9bf834b8da3924de536024254.png

7、如果在PC上开发,模拟手机端,console控制台会报错,自己把它注释掉就行。或者如下图所示,如果它检测不到自己的环境,就会输出文字【这不是钉钉的环境,报错啦】,而不是不错。

e8620d690f2740b3883798ff80bb2c30.png 8、pom中依赖的jar。

  1. <!-- dingtalk第三方企业应用 -->
  2. <dependency>
  3. <groupId>org.apache.httpcomponents</groupId>
  4. <artifactId>httpclient</artifactId>
  5. <version>4.5.1</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.apache.httpcomponents</groupId>
  9. <artifactId>httpcore</artifactId>
  10. <version>4.4.4</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.apache.httpcomponents</groupId>
  14. <artifactId>httpmime</artifactId>
  15. <version>4.3.5</version>
  16. </dependency>
  17. <dependency>
  18. <groupId>commons-io</groupId>
  19. <artifactId>commons-io</artifactId>
  20. <version>2.4</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>com.aliyun</groupId>
  24. <artifactId>alibaba-dingtalk-service-sdk</artifactId>
  25. <version>2.0.0</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>com.aliyun</groupId>
  29. <artifactId>dingtalk</artifactId>
  30. <version>1.3.77</version>
  31. <scope>system</scope>
  32. <systemPath>${pom.basedir}/lib/dingtalk-1.3.77.jar</systemPath>
  33. </dependency>
  34. <dependency>
  35. <groupId>com.aliyun</groupId>
  36. <artifactId>dingtalk-shaded</artifactId>
  37. <version>1.3.77</version>
  38. <scope>system</scope>
  39. <systemPath>${pom.basedir}/lib/dingtalk-1.3.77-shaded.jar</systemPath>
  40. </dependency>

9、pom中build的配置

  1. <build>
  2. <finalName>dingtalkd3f</finalName>
  3. <plugins>
  4. <!-- 指定编译java版本 -->
  5. <plugin>
  6. <groupId>org.apache.maven.plugins</groupId>
  7. <artifactId>maven-compiler-plugin</artifactId>
  8. <configuration>
  9. <source>1.8</source>
  10. <target>1.8</target>
  11. <encoding>UTF-8</encoding>
  12. </configuration>
  13. </plugin>
  14. <!-- mvn jar 打包 -->
  15. <!-- 必须指定1.4.2.RELEASE启动,否则jsp页面无法访问 -->
  16. <plugin>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-maven-plugin</artifactId>
  19. <version>1.4.2.RELEASE</version>
  20. <configuration>
  21. <mainClass>cn.renkai721.Dingtalkd3fApplication</mainClass>
  22. <!-- 包含本地自己引入的jar-->
  23. <includeSystemScope>true</includeSystemScope>
  24. </configuration>
  25. </plugin>
  26. </plugins>
  27. <resources>
  28. <resource>
  29. <directory>src/main/java</directory>
  30. <includes>
  31. <include>**/**</include>
  32. </includes>
  33. <filtering>false</filtering>
  34. </resource>
  35. <resource>
  36. <directory>src/main/resources</directory>
  37. <!-- 加载resources下所有的文件,配置文件和资源文件-->
  38. <includes>
  39. <include>**/**</include>
  40. </includes>
  41. <filtering>false</filtering>
  42. </resource>
  43. <resource>
  44. <directory>src/main/webapp</directory>
  45. <!-- 如果不配置,jsp无法访问 -->
  46. <targetPath>META-INF/resources</targetPath>
  47. <includes>
  48. <include>**/**</include>
  49. </includes>
  50. <filtering>false</filtering>
  51. </resource>
  52. <resource>
  53. <directory>lib</directory>
  54. <includes>
  55. <include>**/*.jar</include>
  56. </includes>
  57. </resource>
  58. </resources>
  59. </build>

10,系统用到的【dingtalk-1.3.77.jar】和【dingtalk-1.3.77-shaded.jar】,阿里官网nexus下载的地址如下,

alibaba Nexus jar包下载icon-default.png?t=N7T8https://s01.oss.sonatype.org/?spm=ding_open_doc.document.0.0.5283b670U93ous#nexus-search;quick~dingtalk网站打开较慢,多等待,多刷新即可。

d1a5ff54add047e7af4f1f11ffb05917.png

 11、核心加解密的时候,使用的参数如下

  1. @PostMapping(value = "/dingCallback")
  2. public Object dingCallback(
  3. @RequestParam(value = "signature") String signature,
  4. @RequestParam(value = "timestamp") Long timestamp,
  5. @RequestParam(value = "nonce") String nonce,
  6. @RequestBody(required = false) JSONObject body,
  7. HttpServletRequest request) throws DingTalkEncryptException {
  8. log.info("接收d3f post请求:[signature=[{}], timestamp=[{}], nonce=[{}] ]",
  9. signature, timestamp, nonce);
  10. // 这里的token是登录管理后台-第三方企业应用-应用详情-应用功能-事件与回调
  11. // id 说明:
  12. // 1、开发者后台配置的订阅事件为应用级事件推送,
  13. // 此时OWNER_KEY为应用的APP_KEY(企业内部应用)或SUITE_KEY(三方应用)。
  14. // 2、调用订阅事件接口订阅的事件为企业级事件推送,
  15. // 此时OWNER_KEY为:企业的CORP_ID(企业内部应用)或SUITE_KEY(三方应用)
  16. return dingTalkEncryptor.getEncryptedMap("failure", timestamp, nonce);
  17. }

 12、官网的事件订阅地址

配置事件订阅 - 钉钉开放平台钉钉会向应用推送订阅的事件,例如部门变更、签到通知、打卡通知等。通过订阅这些事件,可以更好地与钉钉集成。你只需告诉钉钉当某个事件发生时,钉钉需要推送消息到哪个URL,钉钉会以HTTPicon-default.png?t=N7T8https://open.dingtalk.com/document/orgapp-server/configure-event-subcription13、API Explorer,这个工具可以很快的找到自己需要的API,然后可以点击测试,也可以很快的导航到对应的DOC文档中去,很实用。记得进入页面后选择【第三方企业应用】。API Explorer企业注册并上传企业通讯录后,手机端随时随地找人不再难,与同事和客户免费电话多方通话,重要事DING一下电话使命必达。还可以申请免费企业云邮箱和请假系统、财务报销系统,以及自有OA的移动化管理使用icon-default.png?t=N7T8https://open-dev.dingtalk.com/apiExplorer?spm=ding_open_doc.document.0.0.717f722fyXp9c3#/?devType=isv&api=oauth2_1.0%23CreateJsapiTicket

14、钉钉的授权事件,也就是需要解密知道当前监听事件的消息是哪种操作,请看下面的文档。

授权事件 - 钉钉开放平台本文介绍了授权的RDS和SyncHTTP推送的数据格式。icon-default.png?t=N7T8https://open.dingtalk.com/document/isvapp-server/authorization-event15、这些事件中biz_type=2,4的时候,关键信息,一定要保存下来。比如2的时候,需要保存【suite_ticket】,接收到【tmp_auth_code】时候,需要激活应用。接收到4的时候,关键信息一定要保存下来,后面会用到agentId,等。

  1. /**
  2. * 激活应用授权
  3. * tmp_auth_code
  4. */
  5. public Boolean suiteActive(JSONObject activeNode) throws ApiException {
  6. Boolean isActive = false;
  7. return isActive;
  8. }
  9. public String getSuiteToken() {
  10. String url_suite_token = "https://oapi.dingtalk.com/service/get_suite_token";
  11. return accessToken;
  12. }
  13. public String getPermanentCode(String suiteAccessToken, String tempCode) {
  14. String url_permanent_code = "https://oapi.dingtalk.com/service/get_permanent_code";
  15. return permanentCode;
  16. }
  17. public Boolean activateSuite(String suiteAccessToken, String corpId, String permanentCode) {
  18. String url_activate_suite = "https://oapi.dingtalk.com/service/activate_suite";
  19. log.debug("激活应用的企业授权, corpId={}, permanentCode={}, isActive={}", corpId, permanentCode, isActive);
  20. return isActive;
  21. }
  22. public void getCorpAuthInfoByActive(String corpId) {
  23. String corpToken = get_access_token(corpId);
  24. }
  25. public JsonNode getCorpAuthInfo(String corpId) {
  26. String url_get_auth_info = "https://oapi.dingtalk.com/service/get_auth_info";
  27. return result;
  28. }
  29. public String get_access_token(String corp_id) {
  30. // 调用服务端API获取应用资源时,需要通过access_token来鉴权调用者身份进行授权
  31. String suiteId = MsgUtil.val("dingtalkd3f.suiteId");
  32. return corp_token;
  33. }

16、【部署与发布】-【版本管理与发布】,选择要授权的体验组织,然后点击【授权】,后台应该就会收到授权的事件了,如果授权成功,过一会刷新页面就能看到了,如果确认自己的代码没有问题,前端提示授权失败,或其它的没有展示,都是钉钉自己的问题,过一会再试试就OK了。自己也可以生成二维码,让其它的组织加入进来。

17、到此开发的后台基本完毕。

第四章 应用上架

1、上面开发完毕后,就是上架的流程,这个比较难搞,官方写的不清楚。请按照下面的流程来做。

2、点击【部署与发布】-【应用部署】-部署方式选择,计算巢部署。

3、然后关键的操作来了,一定要使用阿里云超管RAM帐号操作,不是普通的子账号或有权限的人的帐号来操作。然后超管需要绑定自己的钉钉号。操作步骤是,登录阿里云控制台

阿里云控制台首页欢迎登录阿里云,全球领先的云计算及人工智能科技公司,阿里云为200多个国家和地区的企业、开发者和政府机构提供云计算基础服务及解决方案。阿里云云计算、安全、大数据、人工智能、企业应用、物联网等云计算服务。icon-default.png?t=N7T8https://home.console.aliyun.com/home/dashboard/ProductAndService然后,点击右上角的小图标,然后选择【安全信息管理】

038e3d6c71794e709dc3160af80e2929.png

 然后去绑定钉钉帐号,

ec4db6f10b934bdfbc40eca82a79b371.png

4、接下来,点击【资源管理】

99bd9830d0fa4ad28a8236a92380cfa4.png

 5、进去以后,主要导入ECS,自己的后台服务器;RDS,自己的数据库,注意代码上线不能使用外网地址,必须使用内网链接地址;SLB负载均衡的机器,如果没有SLB,必须要购买一台。这里的ECS和RDS就不多说了。主要说一下SLB。

6ff528baaf734afea387c0d8a6cfbd90.png

 6、我们随便找一台有nginx的ECS机器,然后在上面装好nginx,在nginx里面转发到自己的后台服务中去,然后SLB负载这里只配置一个http80的端口和一个https443的端口,注意443必须使用公司以及域名的SSL证书。

7、这样配置好了后,回到钉钉的页面,点击【安全与监控】-【钉钉安全域名】,然后就能看到刚才生成的安全域名了。这时候点击提交,去自己的代码里面把以前自己监听的http地址或自定义域名改成这个域名,注意nginx里面要监听这个安全域名,不然你还是访问不到。

8、把自己的以前配置的页面,首页或后台http push的地址都改成这个安全域名就可以了。至于那个页面中一直显示的出口IP未配置,不用去管。直接去点击自检,然后提交上线,这时候有一堆的文件或截图要弄,需要耐心,一步一步去操作。没有的话去网上找些资料改一改。

9、然后需要【安全验收】,【产品验收】,【稳定性验收】,也可以参照下面的几个官网教程

应用部署 - 钉钉开放平台计算巢为服务商提供了一套环境管理应用,一键云资源与应用诊断,一体化监控事件收集和预警体系icon-default.png?t=N7T8https://open.dingtalk.com/document/isv/deploy-applications-1计算巢应用导入资源 - 钉钉开放平台本文档介绍了如何访问计算巢关联应用以及资源导入。icon-default.png?t=N7T8https://open.dingtalk.com/document/isv/create-a-compute-nest-application安全准入评估指南 - 钉钉开放平台本文介绍了安全准入指南,包括应用基础信息、安全技术、安全管理和其他钉钉自检评估项的安全准入评估要求。icon-default.png?t=N7T8https://open.dingtalk.com/document/operation-specification/security-access-evaluation-guide安全性认证 - 钉钉开放平台本文介绍了安全测试报告相关内容,包括常见问题、安全测试用例、安全测试结果等。icon-default.png?t=N7T8https://open.dingtalk.com/document/operation-specification/Security-certification10、上面的【安全准入评估指南 - 钉钉开放平台】和【安全性认证 - 钉钉开放平台】很重要,其中的工作量也很大。

11、到此需要完成的基本差不多,只需要完成对应的指标即可申请上架和付款。其中的ISV上架的保证金是10万元。

7ace26ec830b49a8b19307beb3f3410e.png

50c810343cab4ff8b516a433ff0699cb.png

 12、等待审核。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/617212
推荐阅读
相关标签
  

闽ICP备14008679号