工作需求,开发钉钉微应用和小程序,之前有接触过支付宝小程序和生活号的开发,流程没有很大的差别,这里记录下我用asp.net mvc实现钉钉微应用的开发,并实现获取用户的userid。小弟我技术有限,本文中的一些命名或方法写的不好的,还请指点。

钉钉开发者平台上有各个平台的sdk,我也有下载对应的.net版本的sdk,但是还没有全搞懂,我先用最土的办法:直接发起http请求,来获取我需要的数据,后面如果有时间我会把.net的也补上。

1、注册钉钉微应用:

注册完成之后,继续完善下应用配置,如ip白名单等。

在基本信息>开发信息(旧版)中,可以看到有一个corpid,官方文档中“获取微应用免登授权码”,就是需要这个id。

 

 

 2、获取code:

首先需要根据corpid获取免登授权码。按照官方文档中的写法,这个步骤很简单,我直接写在按钮事件中,返回的resuld中就带有我需要的code了。

 1  //获取免登授权码
 2         $("#getauthorcode").click(function () {
 3             dd.ready(function () {
 4                 // dd.ready参数为回调函数,在环境准备就绪时触发,jsapi的调用需要保证在该回调函数触发后调用,否则无效。
 5                 dd.runtime.permission.requestauthcode({
 6                     corpid: "这里填写corpid",
 7                     onsuccess: function (result) {
 8                         alert("succeed");
 9                         alert(result.code);
10                     },
11                     onfail: function (err) {
12                         alert("fail");
13                     }
14                 });
15             });
16             var arr = [];
17             arr.push({ "authorcode": authorcode });
18             ajax("/home/getauthorcode", arr, "text", false);
19         });

 

 3、获取access_token:

先看官方文档是怎么写的。

嗯,对,其实我主要是看这里的“请求地址”,只要在后台中把参数赋上就可以了,相应的后端代码如下。最后我在获取到钉钉返回的数据后,将数据遍历出来并通过字符串截取来获取token值,这么做是不严谨的!

 1  /// <summary>
 2         /// 获取授权访问令牌
 3         /// </summary>
 4         /// <returns></returns>
 5         public jsonresult getaccesstoken()
 6         {
 7             string appkey = "后台提供的key";
 8             string appsecret = "后台提供的secret";
 9             string url = "https://oapi.dingtalk.com/gettoken?appkey=" + appkey + "&appsecret=" + appsecret;
10             webrequest request = webrequest.create(url);
11             webresponse response = request.getresponse();
12             streamreader reader = new streamreader(response.getresponsestream(),encoding.ascii);
13             string responsedata = reader.readtoend();
14             string[] arr = responsedata.split(',');
15             arraylist arrlist = new arraylist();
16             foreach (string i in arr)
17             {
18                 arrlist.add(i);
19             }
20             string token = arrlist[1].tostring();
21             token = token.substring(16, 32);
22             return json(new { result = true, token }, jsonrequestbehavior.allowget);
23         }

4、获取userid:

根据官方文档,获取userid需要使用code和token。

当我在后台将几分钟前获取到的code和token,直接作为参数并发起http请求时,这时候报了错误码40078,

 

 

 也就是说前面获取到的code需要重新进入鉴权,这里的鉴权机制可以仔细查看官方文档,我也不是非常清楚,有用到的时候才会去看文档。 那么我就重新获取codeh和token就好了:

 1 /// <summary>
 2         /// 获取userid
 3         /// </summary>
 4         /// <returns></returns>
 5         public jsonresult getuserid()
 6         {
 7             //重新获取code
 8             string authorcode = request.form[0];
 9             javascriptserializer js = new javascriptserializer();
10             commonmodel selectlistss = new commonmodel();
11             var data = js.deserialize<list<commonmodel>>(authorcode);
12             string code = data[0].authorcode;
13             
14             //获取token
15             string appkey = "后台提供的key";
16             string appsecret = "后台提供的secret";
17             string url = "https://oapi.dingtalk.com/gettoken?appkey=" + appkey + "&appsecret=" + appsecret;
18             webrequest request = webrequest.create(url);
19             webresponse response = request.getresponse();
20             streamreader reader = new streamreader(response.getresponsestream(), encoding.ascii);
21             string responsedata = reader.readtoend();
22             string[] arr = responsedata.split(',');
23             arraylist arrlist = new arraylist();
24             foreach (string i in arr)
25             {
26                 arrlist.add(i);
27             }
28             string token = arrlist[1].tostring();
29             token = token.substring(16, 32);
30             
31             //获取userid
32             string getuserid_url = "https://oapi.dingtalk.com/user/getuserinfo?access_token=" + token + "&code=" + code;
33             webrequest getuserid_request = webrequest.create(getuserid_url);
34             webresponse getuserid_response = getuserid_request.getresponse();
35             streamreader getuserid_reader = new streamreader(getuserid_response.getresponsestream(), encoding.ascii);
36             string getuserid_responsedata = getuserid_reader.readtoend();
37             string[] getuserid_arr = getuserid_responsedata.split(',');
38             arraylist getuserid_arrlist = new arraylist();
39             foreach (string i in getuserid_arr)
40             {
41                 getuserid_arrlist.add(i);
42             }
43             string username = getuserid_arrlist[3].tostring();
44             string userid = getuserid_arrlist[6].tostring();
45             return json(new { result = true, getuserid_responsedata, username,userid }, jsonrequestbehavior.allowget);
46         }

以上,将写好的项目打包并发布到我的iis服务器上,pc端(手机也行)钉钉打开应用看看效果: