钉钉提供的免登功能

如下

  1. 企业应用免登
  2. ISV应用免登
  3. 微应用后台管理员免登
  4. 第三方WEB网站免登
  5. 第三方WEB网站扫码登录

这里要讲解的是4,5;即第三方Web网站免登:点击网站上登录页面的钉钉图标,显示二维码,然后扫码登录功能;
钉钉Web网站扫码登录文档

一.前期准备
  1. 第三方网站的网址
  2. 第三方网站logo的网址
  3. 操作:

    创建要填写的一些相关信息。授权LOGO地址,建议就放你网站的logo好啦。

    确定之后就会生成APPID和appSecret,先放着。appSecret后面拿取钉钉的用户信息会用到。

通过以上步骤得到:appId,appSecret ,后面会用到(必须值)

二.流程说明

1.流程图

2.流程文字说明

  1. 用户点击Web网站上钉钉图标,展示二维码
  2. 用户使用钉钉app,扫码授权
  3. 钉钉服务器往回调地址发送code和state
  4. 在回调地址的action中,由appid,appSecret获取accessToken
  5. 由3中的code和4中的accessToken获取持久授权码persistent_code
  6. 由accessToken和5中得到的persistent_code和openid获取用户授权的sns_token
  7. 再由6中的sns_token获取钉钉用户信息

详情请参考官方文档

三.编码实现

下面的代码因为项目需要除了免登以外,还有一些通讯录的操作,使用者自行选取
注:免登(appid,appsecret)获取的AccessToken与用CorpID和CorpSecret来换取AccessToken不同

1.后台操作代码
using EClaim.Common;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;namespace EClaim.Service.DingDingHelper
{public class DingDingHelper{//免登必需参数private static string appid = "";//免登必需参数private static string appsecret = "";//其他操作必需参数(例如:通讯录)private static string corpid = "";//其他操作必需参数(例如:通讯录)private static string corpsecret = "";//由corpid和corpsecret获取accessTokenpublic static AccessTokenResult GetAccessToken0(){string url = "https://oapi.dingtalk.com/gettoken?corpid="+corpid+"&corpsecret="+corpsecret;try{var response = HttpGet(url);//Log.LogMsg("DingDing_GetAccessToken0", DateTime.Now, response);var result = Newtonsoft.Json.JsonConvert.DeserializeObject<AccessTokenResult>(response);return result;}catch (Exception ex){//Log.LogMsg("DingDing_GetAccessToken0_Exception", DateTime.Now, ex.Message);throw new Exception(ex.Message);}}/// <summary>/// 获取钉钉开放应用的ACCESS_TOKEN(免登功能使用)/// </summary>/// <returns></returns>public static AccessTokenResult GetAccessToken(){string url = "https://oapi.dingtalk.com/sns/gettoken?appid=" + appid + "&appsecret=" + appsecret;try{var response = HttpGet(url);//Log.LogMsg("DingDing_GetAccessToken", DateTime.Now, response);var result = Newtonsoft.Json.JsonConvert.DeserializeObject<AccessTokenResult>(response);return result;}catch (Exception ex){//Log.LogMsg("DingDing_GetAccessToken_Exception", DateTime.Now, ex.Message);throw new Exception(ex.Message);}}/// <summary>/// 获取用户授权的持久授权码(免登功能使用)/// </summary>/// <param name="accessToken"></param>/// <param name="code"></param>/// <returns></returns>public static PersistentCodeResult GetPersistentCode(string accessToken, string code){string url = "https://oapi.dingtalk.com/sns/get_persistent_code?access_token=" + accessToken;string param = "{ \"tmp_auth_code\": \""+code+"\"}";try{//Log.LogMsg("进入HttpPost之前", DateTime.Now, "[url:"+url+"]--[param:"+param+"]");var response = HttpPost(url, param);//var response = PostHttp(url, param, Encoding.GetEncoding("utf-8"));//Log.LogMsg("DingDing_GetPersistentCode", DateTime.Now, response);var result = Newtonsoft.Json.JsonConvert.DeserializeObject<PersistentCodeResult>(response);return result;}catch (Exception ex){//Log.LogMsg("DingDing_GetPersistentCode_Exception", DateTime.Now, ex.Message);throw new Exception(ex.Message);}}/// <summary>/// 获取用户授权的SNS_TOKEN(免登功能使用)/// </summary>/// <param name="accessToken"></param>/// <param name="openId"></param>/// <param name="persistentCode"></param>/// <returns></returns>public static Sns_tokenResult GetSnsToken(string accessToken, string openId, string persistentCode){string url = "https://oapi.dingtalk.com/sns/get_sns_token?access_token=" + accessToken;string param = "{\"openid\": \""+openId+"\",\"persistent_code\": \""+persistentCode+"\"}";try{var response = HttpPost(url, param);//Log.LogMsg("DingDing_GetSnsToken", DateTime.Now, response);var result = Newtonsoft.Json.JsonConvert.DeserializeObject<Sns_tokenResult>(response);return result;}catch (Exception ex){//Log.LogMsg("DingDing_GetSnsToken_Exception", DateTime.Now, ex.Message);throw new Exception(ex.Message);}}/// <summary>/// 获取用户授权的个人信息(免登功能使用)/// </summary>/// <param name="sns_token"></param>/// <returns></returns>public static UserInfoResult GetUserInfo(string sns_token){string url = "https://oapi.dingtalk.com/sns/getuserinfo?sns_token=" + sns_token;try{var response = HttpGet(url);//Log.LogMsg("DingDing_GetUserInfo", DateTime.Now, response);var result = Newtonsoft.Json.JsonConvert.DeserializeObject<UserInfoResult>(response);return result;}catch (Exception ex){//Log.LogMsg("DingDing_GetUserInfo_Exception", DateTime.Now, ex.Message);throw new Exception(ex.Message);}}/// <summary>/// 根据unionid获取userId/// </summary>/// <param name="accessToken"></param>/// <param name="unionid"></param>/// <returns></returns>public static UserIdResult GetUserIdByUnionId(string unionid){var accessToken = GetAccessToken0();string url = "https://oapi.dingtalk.com/user/getUseridByUnionid?access_token=" + accessToken.access_token + "&unionid=" + unionid;try{var response = HttpGet(url);//Log.LogMsg("DingDing_GetUserId", DateTime.Now, response);var result = Newtonsoft.Json.JsonConvert.DeserializeObject<UserIdResult>(response);return result;}catch (Exception ex){//Log.LogMsg("DingDing_GetUserId_Exception", DateTime.Now, ex.Message);throw new Exception(ex.Message);}}/// <summary>/// 获取成员详情/// </summary>/// <param name="accessToken"></param>/// <param name="userid"></param>/// <returns></returns>public static UserDetailResult GetUserDetail(string userid){var accessToken = GetAccessToken0();string url = "https://oapi.dingtalk.com/user/get?access_token="+ accessToken.access_token + "&userid="+userid;try{var response = HttpGet(url);//Log.LogMsg("DingDing_GetUserDetail", DateTime.Now, response);var result = Newtonsoft.Json.JsonConvert.DeserializeObject<UserDetailResult>(response);return result;}catch(Exception ex){//Log.LogMsg("DingDing_GetUserDetail_Exception", DateTime.Now, ex.Message);throw new Exception(ex.Message);}}#region 发送请求方法/// <summary>/// get方式发送请求/// </summary>/// <param name="url"></param>/// <returns></returns>public static string HttpGet(string url){HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);request.Method = "GET";request.ContentType = "text/html;charset=UTF-8";HttpWebResponse response = (HttpWebResponse)request.GetResponse();Stream myResponseStream = response.GetResponseStream();StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));string retString = myStreamReader.ReadToEnd();myStreamReader.Close();myResponseStream.Close();return retString;}public static string HttpPost(string url, string body){//ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);Encoding encoding = Encoding.UTF8;HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);request.Method = "POST";request.Accept = "text/html, application/xhtml+xml, */*";request.ContentType = "application/json";byte[] buffer = encoding.GetBytes(body);request.ContentLength = buffer.Length;request.GetRequestStream().Write(buffer, 0, buffer.Length);HttpWebResponse response = (HttpWebResponse)request.GetResponse();using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)){return reader.ReadToEnd();}}#endregion}public class AccessTokenResult{public string access_token { get; set; }public int errcode { get; set; }public string errmsg { get; set; }}public class PersistentCodeResult{public int errcode { get; set; }public string errmsg { get; set; }public string openid { get; set; }public string persistent_code { get; set; }public string unionid { get; set; }}public class Sns_tokenResult{public int errcode { get; set; }public string errmsg { get; set; }public int expires_in { get; set; }public string sns_token { get; set; }}public class UserInfoResult{public int errcode { get; set; }public string errmsg { get; set; }public UserInfo user_info { get; set; }}public class UserInfo{public string maskedMobile { get; set; }public string nick { get; set; }public string openid { get; set; }public string unionid { get; set; }}public class UserIdResult{public int errcode { get; set; }public string errmsg { get; set; }public int contactType { get; set; }public string userid { get; set; }}public class UserDetailResult{public int errcode { get; set; }public string unionid { get; set; }public string openId { get; set; }public string roles { get; set; }public string remark { get; set; }public string userid { get; set; }public string isLeaderInDepts { get; set; }public bool isBoss { get; set; }public string hiredDate { get; set; }public bool isSenior { get; set; }public string tel { get; set; }public int[] department { get; set; }public string workPlace { get; set; }public string email { get; set; }public string orderInDepts { get; set; }public string mobile { get; set; }public string errmsg { get; set; }public bool active { get; set; }public string avatar { get; set; }public bool isAdmin { get; set; }public bool isHide { get; set; }public string jobnumber { get; set; }public string name { get; set; }public object extattr { get; set; }public string stateCode { get; set; }public string position { get; set; }}
}
2.前台代码实现
<p class="dingdinglogin" onclick="dingdingLogin();">钉钉扫码登录</p><script src="//g.alicdn.com/dingding/dinglogin/0.0.5/ddLogin.js"></script><script>var appid = "必填值";var redirect_uri = "必填值";var dingurl="https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid="+appid+"&response_type=code&scope=snsapi_login&state=STATE&redirect_uri="+redirect_uri;function dingdingLogin() {debugger;//$(".login-content-2").hide();//$("#login_container").show();var obj = DDLogin({id: "login_container",//这里需要你在自己的页面定义一个HTML标签并设置id,例如<div id="login_container"></div>或<span id="login_container"></span>goto: encodeURIComponent(dingurl),width: "365",height: "400",});var hanndleMessage = function (event) {var origin = event.origin;console.log("origin", event.origin);if (origin == "https://login.dingtalk.com") { //判断是否来自ddLogin扫码事件。var loginTmpCode = event.data; //拿到loginTmpCode后就可以在这里构造跳转链接进行跳转了console.log("loginTmpCode", loginTmpCode);window.location.href = dingurl+"&loginTmpCode=" + loginTmpCode;}};if (typeof window.addEventListener != 'undefined') {window.addEventListener('message', hanndleMessage, false);} else if (typeof window.attachEvent != 'undefined') {window.attachEvent('onmessage', hanndleMessage);}}</script>

c#实现钉钉免登功能相关推荐

  1. PHP项目接入钉钉企业免登,企业应用钉钉免钉流程(附代码)

    本篇文章的主要内容是企业应用钉钉的免钉流程介绍,感兴趣的朋友可以了解一下,希望能够对你有所帮助. 大概流程如下: 1.注册账号和创建第三方应用:该过程直接按照提示流程操作即可,略过 2.获取corpI ...

  2. 钉钉实现免登第三方平台

    先在钉钉开放平台,创建应用. 应用信息内有AgentId,AppKey,AppSecret 开发管理内配置服务器出口IP,应用首页地址等. 说明 第三方企业应用可以在微应用的首页URL中使用$CORP ...

  3. 钉钉获取免登授权码 php_php代码如何加域名授权?开源php项目如何保护版权 商业授权?...

    php在web开发领域是最热门的语言,也是开发项目的不二选择,许多PHP开发者说它是当今世界上最好的开发语言,php开发项目效率高,是因为开源项目太多了,不管是国内,还是国外,开源的框架,开源的CMS ...

  4. 钉钉获取免登用户信息

    大家好,这里是一口八宝周

  5. php钉钉企业微应用免登demo,钉钉微应用免登实现

    用户在使用软件应用的过程中,第一步往往都是登录.输入账号密码,进行登录,登录的目的就是让应用识别张三是张三,而不是李四.相对应,如果能够不用输账号密码,应用就知道你是你,就叫做免登. 免登的源头还是需 ...

  6. 钉钉扫码免登-钉钉应用内免登的实现(附仓库及Demo)

    新版钉钉扫码免登及钉钉应用内免登的一次实现 (附仓库及Demo) Vue2, JDK1.8, SpringBoot2.x.x, 钉钉模块, 钉钉模块Demo, 钉钉开放平台 目录 新版钉钉扫码免登及钉 ...

  7. 浙政钉(专有钉钉)门户免登(超详细)

    钉钉家族 介绍浙政钉门户免登之前,首先搞清楚几个软件的关系,软件分别是:钉钉,专有钉钉,浙政钉 钉钉 是阿里巴巴集团专为中小企业打造的沟通和协同的多端平台. 专有钉钉 原名 政务钉钉,有更开放的设计能 ...

  8. 40079 钉钉_钉钉获取免登陆授权码CODE,返回:不存在的临时授权码40078

    [官方正版]给孩子看的编程少儿读物 55.2元 (需用券) 去购买 > 最近在踩基于钉钉开放平台进行开发的坑,然后在进行身份认证时遇到了"钉钉获取免登陆授权码CODE,返回:不存在的临 ...

  9. 钉钉开放平台-小程序开发实战(钉钉小程序客户端)

    文章目录 钉钉小程序客户端 关于钉钉开放平台 一.小程序基础 1. 基本概念 2. 小程序页面基础 页面运行机制 页面生命周期 页面栈 页面跳转 怎么使用小程序的data-*属性? 3. 小程序常用布 ...

最新文章

  1. 带参数的方法;导入包
  2. 归并排序-python
  3. 关于正点原子STM32的MDK例程移植到IAR中遇到的错误解决方法 __use_no_semihosting
  4. 《C++程序设计原理与实践》读书笔记(二)
  5. springboot thymeleaf 引入jquery_超详细实战:SpringBoot高级之autoconfigure自动化配置
  6. 相似基因(洛谷-P1140)
  7. c语言115写成16进制,西安电子科技大学计算机导论与C语言程序设计 计算机文化概论.pdf...
  8. STM32Cube_FW_F1_V1.0.0固件库学习(四)外部中断 中
  9. 图形学必备!斯坦福图形学几何处理算法课程2——Shape Matching Correspondence
  10. SQL:postgresql修改某字段的部分内容
  11. 拓端tecdat|使用R语言进行Metroplis-in-Gibbs采样和MCMC运行分析
  12. Java初学者也可以实现的图书系统小练习
  13. R语言——R和RStudio软件下载及安装
  14. 突破Dr.com校园网客户端对于热点和路由器的限制
  15. 南邮计算机考研复试经验,我的一点建议——南京邮电大学考研经验_跨考网
  16. 自己搭建虚拟服务器,如何自己搭建虚拟主机
  17. Java六种异常处理的陋习
  18. 苹果上网本报价_买水果“送”水泥?无良商家昧良心!苹果纸箱灌水泥,商户坦言:“赚箱子钱”|水泥|水果箱|水泥浆|水果...
  19. java基础,进阶(二)
  20. 【观察】英特尔:视频行业最佳“合伙人”

热门文章

  1. 解决猫眼自定义字体的问题-获取影院实时电影拍片或实时票房等
  2. excel打开2个独立窗口_10个提高黑五网一独立站营销邮件打开率,点击率和转化率的策略...
  3. 杰里之 打开混响通话有回音【篇】
  4. java程序员从笨鸟到菜鸟(八)泛型
  5. 安装tensorflow 2.5
  6. ELK8.1从零搭建以及基本使用
  7. 一个专科生的程序员之路
  8. TypeScript报错Object is possibly ‘undefined‘
  9. 换天空的几个方式技巧
  10. CSS查漏补缺(一)—页面内容不足铺满屏幕高度和有滚动条时,footer始终保持底部显示