钉钉云第三方企业H5微应用开发(二)

准备工作上一篇已经完成,接下来开始开发后台代码。

在创建微应用的时候,推送类型有「HTTP」和「钉钉云」两种方式,「HTTP」这种方式只能在测试的时候使用,到生产环境只能使用「钉钉云」的服务。

搭建微应用服务端

首先创建一个springboot工程

如上图标示,服务端要用到这些参数。

钉钉回调地址

application.yml

程序启动的配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
server:
port: 8080
servlet:
context-path: /dingtalk

spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
hikari:
maximum-pool-size: 500
minimum-idle: 1
idle-timeout: 60000
url: jdbc:mysql://127.0.0.1:3306/ding_cloud_push?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8
username: root
password: root
redis:
database: 0
host: 127.0.0.1
port: 6379
password:
timeout: 5000
jedis:
pool:
max-active: 8
max-wait: 1
max-idle: 8
min-idle: 0

# 这里需要把你自己的对应参数填入
env:
suiteId:
appId:
suiteKey:
suiteSecret:
token:
encodingAesKey:
corpId:
corpSecret:

PortalController.java

HTTP推送接收服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package club.itwork.dingtalk.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import club.itwork.dingtalk.dto.EventMsg;
import club.itwork.dingtalk.handler.EventHandler;
import club.itwork.dingtalk.handler.HandlerManager;
import club.itwork.dingtalk.properties.EnvProperties;
import com.dingtalk.oapi.lib.aes.DingTalkEncryptor;
import com.dingtalk.oapi.lib.aes.Utils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.Map;

import static club.itwork.dingtalk.constant.Constants.*;

/**
* http 推送接收类
* - 该服务只有在测试环境下可用。
* - 正在上线的应用应该对接钉钉云的相关逻辑
*
* @author dgb8901
*/
@Slf4j
@RestController
@RequestMapping("portal")
public class PortalController {

@Resource
private EnvProperties env;

@Resource
private HandlerManager handlerManager;


/**
* http 回调方法
*
* @return
*/
@PostMapping("/callback")
public Map<String, String> callback(@RequestParam(value = "signature", required = false) String signature,
@RequestParam(value = "timestamp", required = false) String timestamp,
@RequestParam(value = "nonce", required = false) String nonce,
@RequestBody(required = false) JSONObject body) {

log.info("begin /callback: 【signature】:{},【timestamp】:{},【nonce】:{}", signature, timestamp, nonce);

try {

String encryptMsg = body.getString(ENCRYPT_KEY);
DingTalkEncryptor encrypt = new DingTalkEncryptor(env.getToken(), env.getEncodingAesKey(), env.getSuiteKey());
String decryptMsg = encrypt.getDecryptMsg(signature, timestamp, nonce, encryptMsg);
EventMsg eventMsg = JSON.parseObject(decryptMsg, EventMsg.class);
String eventType = eventMsg.getEventType();

EventHandler handler = handlerManager.getHandler(eventType);
handler.handle(eventMsg);

return encrypt.getEncryptedMap(CALLBACK_RESPONSE_SUCCESS, System.currentTimeMillis(), Utils.getRandomStr(RANDOM_COUNT));
} catch (Exception e) {
log.error("处理推送事件异常:", e);
e.printStackTrace();
}

return null;
}

}

这个类就是接收HTTP回调设置的接口。以上程序运行起来,下面开始配置回调地址。

配置回调地址

钉钉云请求回调地址是需要外网IP或者域名,测试阶段我这里使用的是ngrok外网穿透工具。

因为回调地址会推送一个suite_ticket,我把这个保存到了redis中,所以还得起一个redis服务。

所需要的服务都已经启动,开始配置回调地址:

如上图填入回调地址,点「验证有效性」按钮,会请求到我的后台服务,以上显示结果为验证成功。

应用主页https://www.genwxue.com?corpId=$CORPID$是H5微应用的访问地址,这样配置钉钉云会自动把$CORPID$替换成功具体是哪个企业在访问微信应用。

Ticket推送

回调地址配置成功,会收到一个sutite_ticket推送事件,也可以在应用的详情页面点击「重新推送」按钮获取。

好,到这里回调地址就配置完成了。接下来写各个事件的处理

获取源码

关注微信公众号「特想学英语」,回复:「钉钉」

原文作者: dgb8901,yinxing

原文链接: https://www.itwork.club/2020/05/11/dingtalk-corp-2/

版权声明: 转载请注明出处

为您推荐

体验小程序「简易记账」

关注公众号「特想学英语」

钉钉云第三方企业H5微应用开发(三)