钉钉的回调事件怎么接入?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
接入钉钉的回调事件需要进行以下步骤:
创建服务器接收回调: 在您的服务器上,创建一个能够接收和处理钉钉回调事件的接口。
配置服务器回调地址: 在钉钉开放平台的管理后台中,找到相应的应用设置页面,将第一步创建的接口的URL填写到回调URL或服务器回调地址的选项中。确保该URL可以被钉钉访问到。
验证回调URL有效性(可选): 验证回调URL的有效性是一个可选步骤,但强烈建议进行验证以确保回调URL的正确性。在钉钉开放平台的应用设置页面,您可以点击“验证回调URL”按钮来确认回调URL是否正确。
编写处理回调事件的逻辑: 在您的服务器接口中,根据接收到的回调事件类型,编写相应的逻辑处理代码。根据不同的事件类型,您可能需要处理用户授权、消息推送、审批状态变更等不同的业务逻辑。
返回回调结果: 在处理完回调事件后,根据钉钉开放平台的要求,返回特定的响应结果。通常是返回success
字符串表示成功接收并处理了回调事件。
要接入钉钉的回调事件,您需要按照以下步骤进行操作:
创建回调URL:首先,在您的应用服务器上创建一个用于接收回调事件的URL。确保此URL是公网可访问的,并且使用HTTPS协议。
配置回调地址:登录到钉钉开放平台,选择您的应用,并进入"回调管理"模块。在回调管理中,配置您刚刚创建的回调URL作为接收回调事件的地址。同时,选择您希望监听的具体事件类型。
验证回调地址:在配置回调地址后,钉钉会向您的回调URL发送一个验证请求,以确保该URL可以正确处理回调事件。您需要在服务器端接收并处理此验证请求。根据钉钉开放平台的要求,在处理验证请求时,返回特定的字符串值以表示验证成功。
处理回调事件:一旦回调地址通过验证,钉钉将开始向您的回调URL发送实际的回调事件。在您的应用服务器上,根据接收到的回调事件进行相应的处理。根据不同的事件类型,您可能需要解析事件数据、更新应用状态、发送通知等。
1.使用官方接口进行调用
1.注册业务接口
监听事件在官方的说明中可以看见地址:https://ding-doc.dingtalk.com/doc#/serverapi2/skn8ld
监听事件参数位置,下面以审批事件做个说明:
在这里插入图片描述
2.编写url校验业务代码
下面采用钉钉官方写的方法:
官方代码地址:https://github.com/opendingtalk/eapp-isv-quick-start-java/blob/master/src/main/java/com/controller/CallbackController.java
官方架包:
3个都给予给出
链接:https://pan.baidu.com/s/140donn7UW5vzlHeR1Ct20Q
提取码:le56
将架包加入lib中,引用
<groupId>com.taobao.top</groupId>
<artifactId>top-api-sdk-dev</artifactId>
<version>dingtalk-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${pom.basedir}/src/main/resources/lib/taobao-sdk-java-auto_1479188381469-20180525.jar</systemPath>
</dependency>
<dependency>
<groupId>com.taobao.top</groupId>
<artifactId>lippi-oapi-encrpt</artifactId>
<version>dingtalk-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${pom.basedir}/src/main/resources/lib/lippi-oapi-encrpt.jar</systemPath>
</dependency>
官方代码
```import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.config.Constant;
import com.dingtalk.oapi.lib.aes.DingTalkEncryptException;
import com.dingtalk.oapi.lib.aes.DingTalkEncryptor;
import com.dingtalk.oapi.lib.aes.Utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
/**
ISV 小程序回调信息处理
*/
@RestController
public class CallbackController {
private static final Logger bizLogger = LoggerFactory.getLogger("BIZ_CALLBACKCONTROLLER");
private static final Logger mainLogger = LoggerFactory.getLogger(CallbackController.class);
/**
创建应用,验证回调URL变更有效事件(第一次保存回调URL之后)
*/
private static final String EVENT_CHECK_UPADTE_SUITE_URL = "check_update_suite_url";
/**
@RequestMapping(value = "/callback", method = RequestMethod.POST)
@ResponseBody
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 json) {
String params = " signature:"+signature + " timestamp:"+timestamp +" nonce:"+nonce+" json:"+json;
try {
bizLogger.info("begin /callback"+params);
DingTalkEncryptor dingTalkEncryptor = new DingTalkEncryptor(Constant.TOKEN, Constant.ENCODING_AES_KEY,
Constant.SUITE_KEY);
//从post请求的body中获取回调信息的加密数据进行解密处理
String encryptMsg = json.getString("encrypt");
String plainText = dingTalkEncryptor.getDecryptMsg(signature, timestamp, nonce, encryptMsg);
JSONObject obj = JSON.parseObject(plainText);
//根据回调数据类型做不同的业务处理
String eventType = obj.getString("EventType");
if (EVENT_CHECK_CREATE_SUITE_URL.equals(eventType)) {
bizLogger.info("验证新创建的回调URL有效性: " + plainText);
} else if (EVENT_CHECK_UPADTE_SUITE_URL.equals(eventType)) {
bizLogger.info("验证更新回调URL有效性: " + plainText);
} else if (EVENT_SUITE_TICKET.equals(eventType)) {
//suite_ticket用于用签名形式生成accessToken(访问钉钉服务端的凭证),需要保存到应用的db。
//钉钉会定期向本callback url推送suite_ticket新值用以提升安全性。
//应用在获取到新的时值时,保存db成功后,返回给钉钉success加密串(如本demo的return)
bizLogger.info("应用suite_ticket数据推送: " + plainText);
} else if (EVENT_TMP_AUTH_CODE.equals(eventType)) {
//本事件应用应该异步进行授权开通企业的初始化,目的是尽最大努力快速返回给钉钉服务端。用以提升企业管理员开通应用体验
//即使本接口没有收到数据或者收到事件后处理初始化失败都可以后续再用户试用应用时从前端获取到corpId并拉取授权企业信息,
// 进而初始化开通及企业。
bizLogger.info("企业授权开通应用事件: " + plainText);
} else {
// 其他类型事件处理
}
// 返回success的加密信息表示回调处理成功
return dingTalkEncryptor.getEncryptedMap(CALLBACK_RESPONSE_SUCCESS, System.currentTimeMillis(), Utils.getRandomStr(8));
} catch (Exception e) {
//失败的情况,应用的开发者应该通过告警感知,并干预修复
mainLogger.error("process callback failed!"+params,e);
return null;
}
}
}
```
您好,如果是企业内部应用,有相应的业务事件回调,如通讯录相关事件、审批相关事件等,您可以点击此处参考文档HTTP回调概述;https://open.dingtalk.com/document/orgapp-server/callback-overview%E3%80%82
如果是第三方企业应用开发,目前推送类型分为:RDS推送和HTTP推送和SyncHttp推送。
RDS推送在保障数据安全的前提下,极大的简化了推送协议,减少了数据传输次数,提高了数据传输速度,提升了推送的稳定性,您可以点击此处了解更多。https://open.dingtalk.com/document/isv/rds-push-overview-3
HTTP推送是使用回调地址推送数据的方式,开发者提供HTTP回调服务,钉钉服务器会向此回调地址推送数据,数据需要经过加解密的处理,您可以点击此处了解更多。SyncHttp推送SyncHTTP推送方式适用于本地部署的情况。与HTTP推送方式比,SyncHTTP推送的是业务数据的最终状态,开发者可以直接使用推送的数据。您可以点击此处查看。https://open.dingtalk.com/document/isvapp/configure-http-push
如果是业务事件回调,如通讯录相关事件、审批相关事件等,可以参考文档HTTP回调概述。https://open.dingtalk.com/document/orgapp/callback-overview
如果是第三方企业应用开发,目前推送类型分为:RDS推送和HTTP推送。
RDS推送在保障数据安全的前提下,极大的简化了推送协议,减少了数据传输次数,提高了数据传输速度,提升了推送的稳定性,了解更多。https://open.dingtalk.com/document/app/rds-push-overview
HTTP推送是使用回调地址推送数据的方式,开发者提供HTTP回调服务,钉钉服务器会向此回调地址推送数据,数据需要经过加解密的处理,了解更多。https://open.dingtalk.com/document/orgapp/callback-overview
此回答整理自钉群“钉钉开发者社区(互助群)”