开发者社区> 问答> 正文

“服务端开发文档-注册事件回调接口”让人困惑


角度:我是一名企业内部的开发者,隶属XX企业的IT开发部,看到钉钉想把公司的部分业务的部分功能放在钉钉上跑。使用VB.NET开发,接触钉钉快一周了,除了文件上传花了点时间,其他的都很顺利。


问题:服务端开发文档中的注册事件回调接口究竟是给 企业自己的服务端使用还是给套件的开发者使用?


如果只是提供给套件的开发者使用,那么建议将其移动到"ISV接入指南"下(ISV下面已经有“回调接口相关内容”但并没有提到内容为“check_url”的事件类型)


如果都可以注册回调,那么问题来了...


下面是我注册回调的过程:


string CorpID=钉钉后台查看到的数据
string token =xxx //文档中说普通企业可以随机填写,后面貌似只有验证签名的时候用到
string aes_key=43位字符串


1、POST  {call_back_tag,token,aes_key,url}等数据


2、收到服务器传来的数据 {"encrypt":"8kL6Ohqsdp+gvkMg9v0j4s8lycFcrUj6ll4XohSPMHmMl6ZDnXU4cFj/BYtGBLno9Ty0wiWyX9JEGx0DUGSHsSFf2YmDZQmxLP1Ys66cNvHP6FFp3ji3vcWPb+nix2de"}


3、解密服务器传来的数据  Cryptography.AES_decrypt(xxxx,aes_key,CorpID)得到服务器JSON 字符串 {"EventType" : "check_url"}


4、按要求加密字符串"success"  
      string jm= Cryptography.AES_encrypt("success", aes_key, CorpID)


5、按要求组合成JSON字符串
string str ={"msg_signature":"7a599a542cdc4eb99dd5e8f37967362c5bd55174","encrypt":"1ImNyZAkKDIKogVog9FhxcIT/fl8m3ttvKdYO/Ez+qP8tIl+GoBC5h72B0+I9Sp9Q9WrqIPHjZLw6cPqpCQw==","timeStamp":"1461729798","nonce":"835adeca"}


然后返回这段 retunr str


最后....第一步POST返回的结果是 '{"errcode":71009,"errmsg":"返回文本非success"}




---------------------------------------------------------------------------------------
仔细看了下文档
测试回调url(http://ddtalk.github.io/dingTalkDoc/?spm=a3140.7785475.0.0.0tSvEP#测试回调url)
例子中的返回值
{
  "msg_signature":"111108bb8e6dbce3c9671d6fdb69d15066227608",
  "timeStamp":"1783610513",
  "nonce":"123456",
  "encrypt":"1ojQf0NSvw2WPvW7LijxS8UvISr8pdDP+rXpPbcLGOmIBNbWetRg7IP0vdhVgkVwSoZBJeQwY2zhROsJq/HJ+q6tp1qhl9L1+ccC9ZjKs1wV5bmA9NoAWQiZ+7MpzQVq+j74rJQljdVyBdI/dGOvsnBSCxCVW0ISWX0vn9lYTuuHSoaxwCGylH9xRhYHL9bRDskBc7bO0FseHQQasdfghjkl"
  }




这个和套件的返回值非常相似,不过要生成类似是不是需要用套件的方式生成?如果是的话那么用DingTalkCrypt就会少个参数suiteKey,这个貌似只有创建了套件才会有。用这个suite4xxxxxxxxxxxxxxx试了下也不行。
如果 Cryptography.AES_encrypt ("success", aes_key, CorpID) 可以使用的话,为什么返回JSON中会有msg_signature、timeStamp、nonce这些信息,如果要用套件的方式生成返回值有没有参数suiteKey,貌似我进入死循环了...
那么究竟要怎样才能返回符合要求的字符串了?请指点!!!!

展开
收起
new佳佳 2016-04-27 16:28:46 12264 0
9 条回答
写回答
取消 提交回答
  • Re“服务端开发文档-注册事件回调接口”让人困惑
    我想问一下,有没有出现过注册回调接口成功后,再删除回调接口,无法再注册成功这种情况。(内网穿透工具使用的是花生壳,使用ngrok一直会有“系统繁忙”错误,demo中使用的是ngrok没有问题)
    demo里面是可以反复注册、删除没问题的。


    log:{"errmsg":"url地址访问异常,错误原因为:java.net.SocketTimeoutException: Read timed out","errcode":71012}

    solution.auto.util.cms2.OApiException: error code: 71012, error message: url地址访问异常,错误原因为:java.net.SocketTimeoutException: Read timed out
        at solution.auto.util.cms2.HttpHelper.httpPost(HttpHelper.java:117)
        at solution.auto.service.cms2.eventChangeHelper.registerEventChange(eventChangeHelper.java:30)
    2018-09-20 12:37:24
    赞同 展开评论 打赏
  • 回 13楼wangzhigangandy的帖子
    并不能。
    2017-08-30 12:10:28
    赞同 展开评论 打赏
  • Re“服务端开发文档-注册事件回调接口”让人困惑
    问题来了,我只想注册事件回调接口,监控钉钉中的审批流程,在钉钉中发起流程,不要自己发起流程,不知道能不能实现?
    2017-08-23 11:10:53
    赞同 展开评论 打赏
  • Re“服务端开发文档-注册事件回调接口”让人困惑
    遇到同样的问题,我的返回内容是:{"msg_signature":"411c8a224ccff4faa8ef233a2686f88a243255c8","timeStamp":"1503296132","nonce":"s9psbfYd","encrypt":"kuaShC+LOwtDYotihRDRW56GFmX8QZ8FOAY+J0jsDP/FqwUJaHDfzs3HsfX/R6oAVqatwIW3yAgNQCCxjVywYQ=="}
    但是一直提示{"errcode":71009,"errmsg":"返回文本非success"},请问最后是怎么解决的呢?

    -------------------------

    Re“服务端开发文档-注册事件回调接口”让人困惑
    C#版本的, 下载C#的sdk,企业调用,回调使用下面的代码,有个地方改了, 终于调试通了,坑死我了。

                   string msgSignature = Request["signature"];//消息签名
                   string timestamp = Request["timestamp"];//时间戳
                   string nonce = Request["nonce"];//随机号

                    string mToken = ConfigurationManager.AppSettings["DingTalkToken"];
                    string mSuiteKey = "dingcxxxxxxxxxxxxxxxxxxxxxx";//更换key
                    string mEncodingAesKey = ConfigurationManager.AppSettings["DingTalkEncodingAESKey"];

                    //post数据包数据中的加密数据
                    var encryptStr = GetPostParam();

                    string newSignature = "";
                    DingTalkCrypt.GenerateSignature(mToken, timestamp, nonce, encryptStr, ref newSignature);
                    if (msgSignature != newSignature)
                    {
                        LogHelper.Info("消息有可能被篡改!签名验证错误! ");
                        return “”;
                    }

                    var sReplyEchoStr = "";
                    DingTalkCrypt suiteAuth = new DingTalkCrypt(mToken, mEncodingAesKey, mSuiteKey);
                    var ret = suiteAuth.VerifyURL(msgSignature, timestamp, nonce, encryptStr, ref sReplyEchoStr);
                    if (ret != 0)
                    {
                        LogHelper.Info("ERR: VerifyURL fail, ret: " + ret);
                        return “”;
                    }

                    DingTalkCrypt dingTalk = new DingTalkCrypt(mToken, mEncodingAesKey, mSuiteKey);
                    string plainText = "";
                    dingTalk.DecryptMsg(msgSignature, timestamp, nonce, encryptStr, ref plainText);
                    Hashtable tb = (Hashtable)JsonConvert.DeserializeObject(plainText, typeof(Hashtable));
                    string eventType = tb["EventType"].ToString();
                    string result = "";
                    switch (eventType)
                    {
                        case "bpms_task_change"://审批通知
                            break;
                        case "bpms_instance_change"://审批通知
                            break;
                        case "check_url"://测试url
                            string encrypt = "";
                            string signature = "";
                            dingTalk = new DingTalkCrypt(mToken, mEncodingAesKey, mSuiteKey);
                            dingTalk.EncryptMsg("success", timestamp, nonce, ref encrypt, ref signature);
                            Hashtable json = new Hashtable
                            {
                                {"msg_signature", signature},
                                {"timeStamp", timestamp},
                                {"nonce", nonce},
                                {"encrypt", encrypt}
                            };
                            result = JsonConvert.SerializeObject(json);
                            return result;
                            break;
                    }
    2017-08-21 14:23:43
    赞同 展开评论 打赏
  • 回 9楼(phperlili) 的帖子
    请查看文档 https://open-doc.dingtalk.com/doc2/detail.htm?spm=a219a.7629140.0.0.Aw36ap&treeId=172&articleId=104975&docType=1中描述:
    在接收到推送之后,**需要返回字符串success(代表了你收到了推送),返回的数据也需要做加密处理**
    需要注意:
    1.返回字符串success,返回的数据也需要做加密处理
    2.加密方法及加解密库,见: https://open-doc.dingtalk.com/doc2/detail.htm?spm=a219a.7629140.0.0.nbOC0G&treeId=175&articleId=104945&docType=1#s10
    2016-07-17 23:38:40
    赞同 展开评论 打赏
  • 您好,您的问题是什么呢

    -------------------------

    你好,
    1.注册回调事件,是可以用套件的身份来注册,也可以用企业的身份来注册
        如果一个套件,有N家企业使用了这个套件,那么这个套件可以注册N个回调,来监听每家企业的数据变化
        如果一家企业关心自己的数据在钉钉平台的变化,那么企业是可以用企业的身份来注册回调信息

    2.关于加解密
         如果是用套件身份来注册回调,那么加解密的参数Cryptography.AES_decrypt(xxxx,aes_key,CorpID),对应的CorpID就是suiteKey
         如果用企业的身份来注册回调,那么加解密的参数Cryptography.AES_decrypt(xxxx,aes_key,CorpID),对应的CorpID就是企业的corpid
        
    3.关于套件身份和企业身份的解释
         套件身份来注册。就是调用register_call_back接口的时候,传入的accesstoken是企业授权的token
         企业身份来注册,就是调用register_call_back接口的时候,传入的accesstoken是用企业corpid和corpsecret换取的token

    2016-07-15 16:32:51
    赞同 展开评论 打赏
  • Re“服务端开发文档-注册事件回调接口”让人困惑
    楼主在吗。跟你遇到相同的问题,能否帮助一下

    -------------------------

    回 6楼赵挺1的帖子
    跟楼主的问题一样,最后....第一步POST返回的结果是 '{"errcode":71009,"errmsg":"返回文本非success"}别的什么也没有了。不要让我看文档,看俩天了

    -------------------------

    回 8楼赵挺1的帖子
    加解密那的问题。能否不COPY.详解一下
    2016-07-15 14:50:34
    赞同 展开评论 打赏
  • 丫丫丫丫丫丫丫丫丫
    Re“服务端开发文档-注册事件回调接口”让人困惑
    你好,
    1.注册回调事件,是可以用套件的身份来注册,也可以用企业的身份来注册
        如果一个套件,有N家企业使用了这个套件,那么这个套件可以注册N个回调,来监听每家企业的数据变化
        如果一家企业关心自己的数据在钉钉平台的变化,那么企业是可以用企业的身份来注册回调信息

    2.关于加解密
         如果是用套件身份来注册回调,那么加解密的参数Cryptography.AES_decrypt(xxxx,aes_key,CorpID),对应的CorpID就是suiteKey
         如果用企业的身份来注册回调,那么加解密的参数Cryptography.AES_decrypt(xxxx,aes_key,CorpID),对应的CorpID就是企业的corpid
        
    3.关于套件身份和企业身份的解释
         套件身份来注册。就是调用register_call_back接口的时候,传入的accesstoken是企业授权的token
         企业身份来注册,就是调用register_call_back接口的时候,传入的accesstoken是用企业corpid和corpsecret换取的token
    2016-04-28 22:21:11
    赞同 展开评论 打赏
  • Re“服务端开发文档-注册事件回调接口”让人困惑
    看来这个问题无解了........

    -------------------------

    回 2楼蛋蛋oo蛋蛋的帖子
    我目前就是这样做的,但是每次调用注册回调时钉钉返回值都是{"errcode":71009,"errmsg":"返回文本非success"},能不能让我联系到开发人员,我想知道到底错在那里!!!!

    -------------------------

    回 2楼蛋蛋oo蛋蛋的帖子
    好了,我知道问题出在那里了,应该是我对加密类掌握的问题,非常感谢
    2016-04-28 13:10:15
    赞同 展开评论 打赏
滑动查看更多
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载