以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  求助钉钉回调地址验证设置办法  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=170278)

--  作者:gudao123456
--  发布时间:2021/7/20 11:40:00
--  求助钉钉回调地址验证设置办法
在关于回调验证,foxtable的帮助文档只是针对了微信开发举例,而且对其逻辑说得不是很细,不是很理解。现要对钉钉接口进行回调验证,无法模仿,特求助老师。
钉钉开发文档的示例代码如下:
      @RequestMapping(value = "dingCallback", method = RequestMethod.POST)
    public Object dingCallback(
        @RequestParam(value = "signature") String signature,
        @RequestParam(value = "timestamp") Long timestamp,
        @RequestParam(value = "nonce") 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 encrypt = json.getString("encrypt");
            String plainText = dingTalkEncryptor.getDecryptMsg(signature, timestamp.toString(), nonce, encrypt);
            JSONObject callBackContent = JSON.parseObject(plainText);

            // 根据回调事件类型做不同的业务处理
            String eventType = callBackContent.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("success", timestamp, nonce);
        } catch (Exception e) {
            //失败的情况,应用的开发者应该通过告警感知,并干预修复
            mainLogger.error("process callback fail." + params, e);
            return "fail";
        }
    }
开发文档链接:验证和更新回调URL事件 - 钉钉开放平台  https://developers.dingtalk.com/document/app/validating-and-updating-callback-url-events-1
麻烦老师能给出这个钉钉接口验证的示例代码,谢谢!

--  作者:有点蓝
--  发布时间:2021/7/20 13:45:00
--  
有点像公众号,大概这样:http://www.foxtable.com/mobilehelp/topics/0175.htm,开发一个服务端,代码大概

Select Case e.path
    Case "
dingCallback"

            Dim signature As String = e.GetValues("signature")
            Dim timestamp As String = e.GetValues("timestamp")
            Dim nonce As String = e.GetValues("nonce")
            dim 
dingTalkEncryptor as new DingTalkEncryptor("TOKEN", "ENCODING_AES_KEY", "SUITE_KEY")
dim plainText as string = dingTalkEncryptor.getDecryptMsg(signature, timestamp.toString(), nonce, e.PlainText)
……把上面代码转换为vb代码放进来使用
End Select

回调地址设置为:http://www.xxx.com/dingCallback
--  作者:gudao123456
--  发布时间:2021/7/20 16:00:00
--  
谢谢!  dim dingTalkEncryptor as new DingTalkEncryptor("TOKEN", "ENCODING_AES_KEY", "SUITE_KEY") 中的 dingTalkEncryptor 就是解密函数吧?

与foxtable 帮助文档中的 strTmp = Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(strTmp, "SHA1")   
中的  Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile 作用一样,都是用来加密解密用的吗?
[此贴子已经被作者于2021/7/20 16:04:09编辑过]

--  作者:有点蓝
--  发布时间:2021/7/20 16:23:00
--  
是的
--  作者:gudao123456
--  发布时间:2021/7/20 16:48:00
--  
但是提示错误:没有“dingTalkEncryptor没有定义类型
--  作者:有点蓝
--  发布时间:2021/7/20 16:50:00
--  
没有把dll复制到foxtable的安装目录

没有添加引用

--  作者:gudao123456
--  发布时间:2021/7/20 17:02:00
--  
是topsdk.ll 吧?已经拷贝进去了的 也引用了,还命名了空间
[此贴子已经被作者于2021/7/20 17:04:48编辑过]

--  作者:有点蓝
--  发布时间:2021/7/20 17:06:00
--  
没有添加引用

使用代码的时候自己补全命名空间,比如DefaultDingTalkClient命名空间是DingTalk.Api

Dim client As DingTalk.Api.IDingTalkClient = New DingTalk.Api.DefaultDingTalkClient("https://oapi.dingtalk.com/department/list")

--  作者:gudao123456
--  发布时间:2021/7/20 18:11:00
--  
经过反复尝试,都没有成功,显示的错误都是未定义类。在之前的模块中,只要补全命名空间:在头添加DingTalk.Api. 或添加:DingTalk.Api.Request. 就能解决。现在不行,不知问题在哪。已经重新引用和命名空间了(在引用和空间命名里都有东西了应该是引用成功了吧)。就是搞不定
--  作者:有点蓝
--  发布时间:2021/7/20 20:37:00
--  
不同的类型的命名空间是不一样的。这个请下载sdk源码查看