当前位置: 首页 > news >正文

钉钉扫码登陆第三方网站

一、钉钉开放平台文档参考

https://open.dingtalk.com/document/orgapp-server/tutorial-obtaining-user-personal-information

二、登陆钉钉开发者后台,创建H5微应用

在这里插入图片描述

三、点击第二步创建的H5应用,设置回调域名

在这里插入图片描述

四、添加接口权限

这一步是为了扫码时,能获取到扫码人的信息

在这里插入图片描述

五、 前台代码

<div  id="login_container">
</div>
 <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="https://g.alicdn.com/dingding/dinglogin/0.0.5/ddLogin.js"></script>
<script>
  $(function () {
      var ding = {
          "appid": "",
          "agentid": "",
          "corpid": "",
          " uri": "",
          "redirect_uri": "",
          "code": "",
          "accesstoken": ""
    };
     //这里的appid是设置H5应用的AppKey
     ding.appid = "12345546";
     //设置重定向地址,重定向地址要与步骤三中的回调地址一致
     ding.redirect_uri = window.document.location.origin + '/admin/login.aspx';
     ding.uri = "https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=" + ding.appid + "&response_type=code&scope=snsapi_login&state=bind&redirect_uri=" + ding.redirect_uri;
    //2.2.扫码触发事件
     var obj = DDLogin({
         id: "login_container",
         goto: encodeURIComponent(ding.uri),
         style: "border:none;background-color:#FFFFFF;",
         width: "240",
         height: "300",
     });
     
      //监听钉钉扫码获取loginTmpCode
      var getcode = function (event) {
          var origin = event.origin;
          console.log("origin", event.origin);
          if (origin == "https://login.dingtalk.com") { //判断是否来自ddLogin扫码事件。
              var loginTmpCode = event.data; //拿到loginTmpCode后就可以在这里构造跳转链接进行跳转了
              ding.code = loginTmpCode;
              console.log("获取到code", loginTmpCode);
              window.parent.postMessage(loginTmpCode, '*');
              //1.跳转到主页面,微应用自身截取code比对用户信息
              var redirect_uri_check = "https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=" + ding.appid + "&response_type=code&scope=snsapi_login&state=bind&redirect_uri=" + ding.redirect_uri + "&loginTmpCode=";
              console.log("获取到redirect_uri_check", redirect_uri_check);
              window.location.href = redirect_uri_check + loginTmpCode;
          };
      };
      //2.4.钉钉扫码监听
      if (typeof window.addEventListener != 'undefined') {
          window.addEventListener('message', getcode, false);
      } else if (typeof window.attachEvent != 'undefined') {
          window.attachEvent('onmessage', getcode);
      };

  })
</script>

六、后台处理

我用的C# 编写的代码,其中用到了钉钉提供的TopSdk.dll,且需要在web.config中配置DingDing:QrAppId及DingDing:QrAppSecret

  var code = Request.QueryString["code"];
  //通过登陆code获取钉钉用户信息
  public static string getDDUserInfo(string code)
  {
      try
      {
          DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/sns/getuserinfo_bycode");
          OapiSnsGetuserinfoBycodeRequest req = new OapiSnsGetuserinfoBycodeRequest();
          req.TmpAuthCode = code;
          req.Validate();
          string qrAppId = ConfigurationManager.AppSettings.Get("DingDing:QrAppId");
          string qrAppSecret = ConfigurationManager.AppSettings.Get("DingDing:QrAppSecret");
          OapiSnsGetuserinfoBycodeResponse response = client.Execute(req, qrAppId, qrAppSecret);
          if (response.Errcode == 0)
          {
              return response.UserInfo.Unionid;
          }
          else
          {
              baseLog.warn("code:"+ code + ",response.Errcode:"+ response.Errcode + ",response.ErrCode:"+ response.ErrCode + "请求用户信息失败" + response.Body);
              return null;
          }
      }
      catch (Exception e)
      {
          baseLog.error("请求用户信息异常msg= " + e.Message + ",stack=" + e.StackTrace);
          return null;
      }

  }
   
   //通过unionid获取用户信息
   public static string getDDUserid(string unionid)
    {
        try
        {
            DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/user/getbyunionid");
            OapiUserGetbyunionidRequest req = new OapiUserGetbyunionidRequest();
            req.Unionid = unionid;
            req.Validate();
            //string qrAppId = ConfigurationManager.AppSettings.Get("DingDing:QrAppId");
            //string qrAppSecret = ConfigurationManager.AppSettings.Get("DingDing:QrAppSecret");
            OapiUserGetbyunionidResponse response = client.Execute(req, getAccessToken());
            if (response.Errcode == 0)
            {
                return response.Result.Userid;
            }
            else
            {
                baseLog.warn("通过登陆unionid:" + unionid + ",请求用户信息失败" + response.Body);
                return null;
            }
        }
        catch (Exception e)
        {
            baseLog.error("请求用户信息异常msg= " + e.Message + ",stack=" + e.StackTrace);
            return null;
        }
    }


       /// <summary>
      /// 获取钉钉用户的详细信息
      /// </summary>
      /// <param name="userid"></param>
      /// <returns></returns>
      public static OapiV2UserGetResponse getDDUserDetailInfo(string userid)
      {

          try
          {
              DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");
              OapiV2UserGetRequest req = new OapiV2UserGetRequest();
              req.Userid = userid;
              req.Language = "zh_CN";
              OapiV2UserGetResponse response = client.Execute(req,getAccessToken());
              baseLog.info("到这一步就成功了" + response.Body);
              if(response.Errcode == 0)
              {
                  return response;
              }
              else
              {
                  baseLog.warn("通过登陆userid:" + userid + ",请求用户信息失败" + response.Body);
                  return null;
              }
          }
          catch (Exception e)
          {
              baseLog.error("请求用户详细信息异常msg=" + e.Message + ",stack=" + e.StackTrace);
              return null;
          }
      }

相关文章:

  • Python 自动化测试(三): pytest 参数化测试用例构建
  • Java通过Zxing生成和解析二维码
  • 如何在手机浏览器中打开安卓APP
  • Postgresql 解决pg掉电后无法重启的问题
  • Git下载安装vue-antd-admin教程
  • dubbo服务暴露流程
  • 人老了才明白,走到最后,身边能依靠的不是老伴,也不是子女
  • PySpark SQL模块官方文档
  • 独立三方数据源!数据宝国有大数据为金融机构及物流企业提供双向赋能
  • Vuehtml2pdf的使用
  • java计算机毕业设计图书馆管理系统源码+系统+数据库+lw文档+mybatis+运行部署
  • 南京国家农创聚功能性农业主导产业 国稻种芯百团计划行动
  • A. Balance the Bits (思维构造)
  • k8s系列(二)——云计算相关概念
  • 数据挖掘学习笔记01——数据挖掘的基本流程
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • classpath对获取配置文件的影响
  • css系列之关于字体的事
  • C学习-枚举(九)
  • Django 博客开发教程 8 - 博客文章详情页
  • gf框架之分页模块(五) - 自定义分页
  • Java读取Properties文件的六种方法
  • Java-详解HashMap
  • 大主子表关联的性能优化方法
  • 动态规划入门(以爬楼梯为例)
  • 全栈开发——Linux
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 7行Python代码的人脸识别
  • 整理一些计算机基础知识!
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​一些不规范的GTID使用场景
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (python)数据结构---字典
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .Net FrameWork总结
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • [APIO2012] 派遣 dispatching
  • [bzoj1324]Exca王者之剑_最小割
  • [C++] 默认构造函数、参数化构造函数、拷贝构造函数、移动构造函数及其使用案例
  • [ffmpeg] 定制滤波器
  • [LitCTF 2023]Http pro max plus
  • [paddle]ModuleNotFoundError: No module named ‘paddle.nn.layer.layers
  • [POJ2446] Chessboard(二分图最大匹配-匈牙利算法)
  • [Power Query] 数据的拆分、提取与合并