欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.NET平台下,钉钉微应用开发之:工作消息通知

程序员文章站 2022-07-22 20:54:40
首先看下官方文档,为我们提供了POST请求地址,和几个必传参数的列表以及参数示例,写的都挺详细的。 无奈提供的SDK请求示例是JAVA的,而我用的是.NET的,所以还是摸了一些坑出来,其实也就是不同平台的部分方法或者语法不同而已,调试好一个接口后,后面再调试其他接口就会快很多了。 调用淘宝接口,我看 ......

 

.NET平台下,钉钉微应用开发之:工作消息通知

 

首先看下官方文档,为我们提供了post请求地址,和几个必传参数的列表以及参数示例,写的都挺详细的。

无奈提供的sdk请求示例是java的,而我用的是.net的,所以还是摸了一些坑出来,其实也就是不同平台的部分方法或者语法不同而已,调试好一个接口后,后面再调试其他接口就会快很多了。

 调用淘宝接口,我看到的几个哥们,用的都是这个url地址:https://eco.taobao.com/router/rest

相应代码如下:

 1         /// <summary>
 2         /// 工作通知消息(淘宝url)
 3         /// </summary>
 4         /// <returns></returns>
 5         public jsonresult sendworkmessage()
 6         {
 7             //判断缓存中是否有access_token,否则重新获取
 8             var access_token = cachehelper.getcache("access_token");
 9             if (access_token == null)
10             {
11                 dingdevelopsdk developsdk = new dingdevelopsdk();
12                 access_token = developsdk.get_access_token_by_appkey_and_appsecret(models.dingdingconfig.appkey, models.dingdingconfig.appsecret);
13             }
14             idingtalkclient client = new defaultdingtalkclient("https://eco.taobao.com/router/rest");
15             corpmessagecorpconversationasyncsendrequest req = new corpmessagecorpconversationasyncsendrequest();
16             req.msgtype = "oa";                                                     //发送消息是以oa的形式发送的,其他的还有text,image等形式
17             req.agentid = models.dingdingconfig.agentid;
18             req.useridlist = "manager1805";
19             req.toalluser = false;                                                  //是否发给所有人,很重要,为true的时候,一天只能调用3次该接口
20             req.msgcontent = "{\"message_url\": \"http://dingtalk.com\",\"head\": {\"bgcolor\": \"ffbbbbbb\",\"text\": \"头部标题\"},\"body\": {\"title\": \"测试文本\",\"form\": [{\"key\": \"姓名:\",\"value\": \"张三\"},{\"key\": \"爱好:\",\"value\": \"打球、听音乐\"}],\"rich\": {\"num\": \"15.6\",\"unit\": \"元\"},\"content\": \"淘宝url\",\"image\": \"@ladoadmawmzazqka\",\"file_count\": \"3\",\"author\": \"李四 \"}}";
21             corpmessagecorpconversationasyncsendresponse rsp = client.execute(req, access_token.tostring());//发送消息
22             string result = rsp.body;
23            // debuglog.writelog(result);
24             return json(new { result = true, result }, jsonrequestbehavior.allowget);
25         }

调用结果:

.NET平台下,钉钉微应用开发之:工作消息通知

 

 

接下来是调用官方文档里写的接口:https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2?access_token=access_token。

这里的参数access_token不用写在url里,方法asyncsend_v2是示例代码里调用的,但是在.net平台下方法和java有些差异,在试过几个类和方法之后,我用的方法是asyncsend,后面没有带"_v2",

所以接口地址就是:https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend。

上代码:

 1         /// <summary>
 2         /// 工作通知消息(钉钉url)
 3         /// </summary>
 4         /// <returns></returns>
 5         public jsonresult sendmessage_bydingdingurl()
 6         {
 7             try {
 8                 //判断缓存中是否有access_token,否则重新获取
 9                 var access_token = cachehelper.getcache("access_token");
10                 if (access_token == null)
11                 {
12                     dingdevelopsdk developsdk = new dingdevelopsdk();
13                     access_token = developsdk.get_access_token_by_appkey_and_appsecret(models.dingdingconfig.appkey, models.dingdingconfig.appsecret);
14                 }
15                 //官网post地址为https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2,根据方法的不同,下文的url采用的是asyncsend而不是asyncsend_v2
16                 idingtalkclient client = new defaultdingtalkclient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend");
17                 oapimessagecorpconversationasyncsendrequest req = new oapimessagecorpconversationasyncsendrequest();
18                 req.sethttpmethod("post");
19                 req.toalluser = false;
20                 req.agentid = models.dingdingconfig.agentid;
21                 req.useridlist = "manager1805";
22                 req.msgtype = "oa";
23                 req.msgcontent = "{\"message_url\": \"http://dingtalk.com\",\"head\": {\"bgcolor\": \"ffbbbbbb\",\"text\": \"测试001\"},\"body\": {\"title\": \"测试文本\",\"form\": [{\"key\": \"姓名:\",\"value\": \"张三\"},{\"key\": \"爱好:\",\"value\": \"打球、听音乐\"}],\"rich\": {\"num\": \"15.6\",\"unit\": \"元\"},\"content\": \"钉钉url\",\"image\": \"@ladoadmawmzazqka\",\"file_count\": \"3\",\"author\": \"admin \"}}";
24                 oapimessagecorpconversationasyncsendresponse response = client.execute(req, access_token.tostring());
25                 debuglog.writelog(response.body);
26                 return json(new { result = true }, jsonrequestbehavior.allowget);
27             }
28             catch (exception ex)
29             {
30                 debuglog.writelog(ex);
31                 return json(new { result = false }, jsonrequestbehavior.allowget);
32             }
33         }    

结果和上面的是一样的。

这里获取ccess_token的方法我就不累述了,我是直接从缓存里获取的,其他参数的使用要点,要结合文档去使用:

发送工作通知消息需要注意以下事项:

  • 同一个微应用相同消息的内容同一个用户一天只能接收一次。
  • 同一个微应用给同一个用户发送消息,企业内部开发方式一天不得超过500次。
  • 通过设置to_all_user参数全员推送消息,一天最多3次。
  • 详细的限制说明,请参考“”。
  • 该接口是异步发送消息,接口返回成功并不表示用户一定会收到消息,需要通过“”接口查询是否给用户发送成功。
  • 消息类型和样例可参考文档。

 以上。