1、概述
基于企业级事件开放平台,提供标准的事件开放能力。
2、集成步骤
序号 | 步骤名称 | 责任方 | 描述 |
---|---|---|---|
1 | 事件查看 | 致远 | 非必须,查看可用的事件清单 |
2 | UDC发布自定义事件 | 致远 | 非必须,UDC-规则-自定义服务,可以配置开放事件, 在应用成功发布后,事件可以发布到开放平台,遵循开放平台授权管理规范 |
3 | 启用事件 | 致远 | 必须,API一级授权,只有启用API,接入应用才可以选择到对应的API。 |
4 | 新建接入应用 | 致远 | 必须,承载事件配置 |
5 | 启用接入应用 | 致远 | 必须,未启用时,事件无法正常回调 |
6 | 开启加密因子 | 致远 | 非必须,开启后事件内容会加密传输 |
7 | 开启回调令牌 | 致远 | 非必须,开启后,事件回调会携带配置的eventToken, 用于接入应用验证事件来源。 |
8 | 请求网址验证 | 致远 | 事件直接回调请求网址模式模式:必须实现回调接口模式:非必须 |
9 | 添加事件 | 致远 | 必须,事件二级授权 |
10 | 配置数据范围 | 致远 | 非必须,需要对事件内容进行筛选过滤时配置 |
11 | 提供回调接口定义和规范 | 三方系统 | 事件直接回调请求网址模式模式:非必须实现回调接口模式:必须 |
12 | 新建三方集成应用 | 致远 | 事件直接回调请求网址模式模式:非必须实现回调接口模式:必须 |
13 | 接口封装 | 致远 | 事件直接回调请求网址模式模式:非必须实现回调接口模式:必须 |
14 | 发布三方集成应用 | 致远 | 事件直接回调请求网址模式模式:非必须实现回调接口模式:必须 |
15 | 设置回调方式 | 致远 | 事件直接回调请求网址模式模式:非必须实现回调接口模式:必须 ,需要选择三方集成应用、接口,并配置字段映射和成功标识 |
3、集成步骤配置说明
3.1. 进入管理后台
3.2. 事件查看
3.3. UDC发布自定义事件
3.4. 启用事件
3.5. 新建接入应用
3.6. 启用接入应用
3.7. 开启加密因子
3.8. 开启回调令牌
3.9. 请求网址验证
3.10. 添加事件
3.11. 配置数据范围
3.12. 提供回调接口定义和规范
注意:由三方系统线下提供
3.13. 新建三方集成应用
3.14. 接口封装,发布应用
3.15. 设置回调方式
4、事件订阅说明
收到事件通知请求后,需要返回200HTTP响应。其余响应码表示失败,开放平台会自动重发。重发的间隔越来越长,最多尝试10次。事件通知数据使用application/json格式发送。
事件通知的HTTP请求头中,包含回调令牌(需在接入应用的事件订阅中配置开启,默认不开启),用于接入应用验证事件来源。
若开启加密因子(需在接入应用的事件订阅中配置开启,默认不开启),将对事件通知的JSON内容进行加密,只有一个属性encrypt,需要进行解密处理。
4.1、解密示例(Java)
@SuppressWarnings("rawtypes")
@PostMapping("open-event-map")
@ResponseBody
public String openEventCallBack(HttpServletRequest request, @RequestBody Map map) {
// 事件发生时间
String createTime = request.getHeader("createTime");
// 事件的流水号
String eventId = request.getHeader("eventId");
// 如果订阅事件时设置了回调token,可以获取token进行校验
String eventToken = request.getHeader("eventToken");
if (!OpenApiGlobalConfig.EVENT_CALL_BACK_TOKEN.equals(eventToken)) {
System.err.println("token不匹配,这是非法的请求!");
return "error";
}
// eventName:事件名称,解码处理
try {
String eventName = URLDecoder.decode(request.getHeader("eventName"), StandardCharsets.UTF_8.displayName());
System.err.println("收到事件:" + eventName);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
// 事件标识,可以用此字段区分是什么事件发生了
String eventKey = request.getHeader("eventKey");
if (!"".equals(OpenApiGlobalConfig.EVENT_CALL_BACK_KEY)) {
// 如果设置了加密key,那么返回的数据是加密的,需要解密。加解密算法是AES算法。
String encryptContent = (String) map.get("encrypt");
String realContent = OpenApiClient.decrypt(encryptContent, OpenApiGlobalConfig.EVENT_CALL_BACK_KEY);
System.err.println("原始的JSON数据是:" + realContent);
// 拿到原始的json串以后,可以json串转map或者转对应的DTO,继续处理
Map dataMap = OpenApiUtil.fromJson(realContent, Map.class);
// 后续处理
System.err.println("事件真实数据:" + dataMap);
} else {
// 如果没有配置加密,那么是明文传输的,收到的Map就是真实的数据
Map dataMap = map;
// 后续处理
System.err.println("事件真实数据:" + dataMap);
}
return "OK";
}