每次打开微应用时,需要登录,根据接口文档做免登录处理.
获取 AccessToken 根据 AccessToken去获取免登录 Ticket 然后签名,部分字段返回前台交给钉钉效验,通过之后则返回 code 根据 code 获取用户编码 通过用户编码获取用户信息.
唯一碰到的坑就是 签名的结果需要小写.
贴代码 前面的也贴出来好了 这个是钉钉demo接口的实现代码
public static class DdHelper
{
private static String dd_autoaddress = ConfigurationManager.AppSettings["DD_autoaddress"];
private static String dd_host = ConfigurationManager.AppSettings["DD_host"];
private static String dd_corpid = ConfigurationManager.AppSettings["DD_corpid"];
private static String dd_corpsecret = ConfigurationManager.AppSettings["DD_corpsecret"];
private static String dd_accesstoken = string.Empty;
private static DateTime dd_accesstokentime;
public static String jsTicket = string.Empty;
public static String nonce = string.Empty;
public static String jsUrl = string.Empty;
public static int timeStamp = 0;
/// <summary>
/// 免登录签名
/// </summary>
/// <returns></returns>
public static String GetSign() {
jsTicket = GetTicket();
nonce = "ERFGYHSKHSGHERUTH56460srteh60846dagh=G";
timeStamp = Convert.ToInt32((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds);
jsUrl = dd_autoaddress;
String plainTex = "jsapi_ticket=" + jsTicket + "&noncestr=" + nonce + "&timeStamp=" + timeStamp + "&url=" + jsUrl;
return BLL.Lib.EncryptUtil.Sha1(plainTex).ToLower();
}
/// <summary>
/// 发起请求
/// </summary>
/// <param name="url">地址</param>
/// <param name="data">数据</param>
/// <param name="reqtype">请求类型</param>
/// <returns></returns>
private static String Request(string url,string data,string reqtype) {
GetAccessToken();
if (url.IndexOf('?') == -1 && url != "gettoken")
url += ("?access_token=" + dd_accesstoken);
else if (url.IndexOf('?') > -1 && url.IndexOf("gettoken") == -1)
url += ("&access_token=" + dd_accesstoken);
HttpWebRequest web = (HttpWebRequest)HttpWebRequest.Create(dd_host + url);
web.ContentType = "application/json";
web.Method = reqtype;
if (data.Length > 0 && reqtype.Trim().ToUpper() == "POST")
{
byte[] postBytes = Encoding.UTF8.GetBytes(data);
web.ContentLength = postBytes.Length;
using (Stream reqStream = web.GetRequestStream())
{
reqStream.Write(postBytes, 0, postBytes.Length);
}
}
string html = string.Empty;
using (HttpWebResponse response = (HttpWebResponse)web.GetResponse())
{
Stream responseStream = response.GetResponseStream();
StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8);
html = streamReader.ReadToEnd();
}
return html;
}
/// <summary>
/// 更新AccessToken
/// </summary>
public static void GetAccessToken()
{
if (dd_accesstokentime == null || (DateTime.Now.Ticks - dd_accesstokentime.Ticks) >= 5000)
{
dd_accesstokentime = DateTime.Now;
dd_accesstoken = JsonConvert.DeserializeObject<AccessTokenMod>(Request("gettoken?corpid=" + dd_corpid + "&corpsecret=" + dd_corpsecret, "", "GET")).Access_Token;
}
}
/// <summary>
/// 获取免登录令牌
/// </summary>
/// <returns></returns>
public static String GetTicket() {
string json = Request("get_jsapi_ticket?type=jsapi", "", "GET");
JObject jo = JsonConvert.DeserializeObject<JObject>(json);
if (Convert.ToInt32(jo["errcode"]) == 0)
return jo["ticket"].Value<String>();
return "";
}
/// <summary>
/// 获取部门列表
/// </summary>
/// <param name="id">上级部门编号 允许为空</param>
/// <returns></returns>
public static String GetDeptList(String id="") {