钉钉提供的免登功能
如下
- 企业应用免登
- ISV应用免登
- 微应用后台管理员免登
- 第三方WEB网站免登
- 第三方WEB网站扫码登录
这里要讲解的是4,5;即第三方Web网站免登:点击网站上登录页面的钉钉图标,显示二维码,然后扫码登录功能;
钉钉Web网站扫码登录文档
一.前期准备
- 第三方网站的网址
- 第三方网站logo的网址
- 操作:
创建要填写的一些相关信息。授权LOGO地址,建议就放你网站的logo好啦。
确定之后就会生成APPID和appSecret,先放着。appSecret后面拿取钉钉的用户信息会用到。
通过以上步骤得到:appId,appSecret ,后面会用到(必须值)
二.流程说明
1.流程图
2.流程文字说明
- 用户点击Web网站上钉钉图标,展示二维码
- 用户使用钉钉app,扫码授权
- 钉钉服务器往回调地址发送code和state
- 在回调地址的action中,由appid,appSecret获取accessToken
- 由3中的code和4中的accessToken获取持久授权码persistent_code
- 由accessToken和5中得到的persistent_code和openid获取用户授权的sns_token
- 再由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获取accessToken
public 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>
///