ASP.NET MVC开发之——钉钉微应用:获取userid
程序员文章站
2022-04-14 21:58:37
工作需求,开发钉钉微应用和小程序,之前有接触过支付宝小程序和生活号的开发,流程没有很大的差别,这里记录下我用ASP.NET MVC实现钉钉微应用的开发,并实现获取用户的userid。小弟我技术有限,本文中的一些命名或方法写的不好的,还请指点。 钉钉开发者平台上有各个平台的SDK,我也有下载对应的.N ......
工作需求,开发钉钉微应用和小程序,之前有接触过支付宝小程序和生活号的开发,流程没有很大的差别,这里记录下我用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端(手机也行)钉钉打开应用看看效果: