钉钉的开发接口中,目前没有在服务端直接获取chatid的接口,但提供了客户端获取chatid的接口。所以有需要获取该接口的,我们可以暂时使用客户端的方式获取。为了能够使用jsapi,我们还需要利用jsticket来得到签名包,具体代码如下。

#region FetchSignPackage Function 
        /// <summary>
        /// 获取签名包
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public static SignPackage FetchSignPackage(String url, JSTicket jsticket)
        {
            int unixTimestamp = SignPackageHelper.ConvertToUnixTimeStamp(DateTime.Now);
            string timestamp = Convert.ToString(unixTimestamp);
            string nonceStr = SignPackageHelper.CreateNonceStr();
            if (jsticket == null)
            {
                return null;
            }

            // 这里参数的顺序要按照 key 值 ASCII 码升序排序 
            string rawstring = $"{Keys.jsapi_ticket}=" + jsticket.ticket
                             + $"&{Keys.noncestr}=" + nonceStr
                             + $"&{Keys.timestamp}=" + timestamp
                             + $"&{Keys.url}=" + url;
            string signature = SignPackageHelper.Sha1Hex(rawstring).ToLower();

            var signPackage = new SignPackage()
            {
                agentId = ConfigHelper.FetchAgentID(),//取配置文件中的agentId,可依据实际配置而作调整
                corpId = ConfigHelper.FetchCorpID(),//取配置文件中的coprId,可依据实际配置而作调整
                timeStamp = timestamp,
                nonceStr = nonceStr,
                signature = signature,
                url = url,
                rawstring = rawstring,
                jsticket = jsticket.ticket
            };
            return signPackage;
        }

        /// <summary>
        /// 获取签名包
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public static SignPackage FetchSignPackage(String url)
        {
            int unixTimestamp = SignPackageHelper.ConvertToUnixTimeStamp(DateTime.Now);
            string timestamp = Convert.ToString(unixTimestamp);
            string nonceStr = SignPackageHelper.CreateNonceStr();
            var jsticket = FetchJSTicket();
            var signPackage = FetchSignPackage(url, jsticket);
            return signPackage;
        }
        #endregion



/// <summary>
    /// 签名包
    /// </summary>
    public class SignPackage
    {
        public String agentId { get; set; }
        
        public String corpId { get; set; }
        
        public String timeStamp { get; set; }
        
        public String nonceStr { get; set; }
        
        public String signature { get; set; }
        
        public String url { get; set; }
        
        public String rawstring { get; set; }
        
        public string jsticket { get; set; }
    }


using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;

namespace DDSDK
{
    public class SignPackageHelper
    {
        #region Sha1Hex
        public static string Sha1Hex(string value)
        {
            SHA1 algorithm = SHA1.Create();
            byte[] data = algorithm.ComputeHash(Encoding.UTF8.GetBytes(value));
            string sh1 = "";
            for (int i = 0; i < data.Length; i++)
            {
                sh1 += data[i].ToString("x2").ToUpperInvariant();
            }
            return sh1;
        }
        #endregion

        #region CreateNonceStr
        /// <summary>
        /// 创建随机字符串
        /// </summary>
        /// <returns></returns>
        public static string CreateNonceStr()
        {
            int length = 16;
            string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            string str = "";
            Random rad = new Random();
            for (int i = 0; i < length; i++)
            {
                str += chars.Substring(rad.Next(0, chars.Length - 1), 1);
            }
            return str;
        }
        #endregion

        #region ConvertToUnixTimeStamp      
        /// <summary>  
        /// 将DateTime时间格式转换为Unix时间戳格式  
        /// </summary>  
        /// <param name="time">时间</param>  
        /// <returns>double</returns>  
        public static int ConvertToUnixTimeStamp(DateTime time)
        {
            int intResult = 0;
            System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
            intResult = Convert.ToInt32((time - startTime).TotalSeconds);
            return intResult;
        }
        #endregion
    }
}
在界面上我们可以使用json的方式来获取数据,为了方便后续的使用,这里定义了一个global.js。

其中"/api/Auth/GetSignPackage"是WebApi的方式,这将在后续中说到。这里需要引用zepto.min.js。

下面调用的结果

钉钉开发系列(五)生成签名包

欢迎打描左侧二维码打赏。

转载请注明出处。






相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-03
  • 2021-12-30
  • 2021-07-03
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-08
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案