zoukankan      html  css  js  c++  java
  • 钉钉开发系列(五)生成签名包

    钉钉的开发接口中,目前没有在服务端直接获取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。

    /// <reference path="zepto.min.js" />
    var global = {
        corpId: '',
        configJsSdk: function (jsApiList, fnReady, fnError) {
            /// <summary>配置微信的JSSDK</summary>
            /// <param name="jsApiList" type="function">要请求的api列表,以['biz.chat.chooseConversationByCorpId','biz.chat.toConversation']的形式</param>
            /// <param name="fnReady" type="function">dd.ready调用的函数</param>
            /// <param name="fnError" type="function">dd.error调用的函数</param>  
            var url = window.location.href;
            $.getJSON("/api/Auth/GetSignPackage", "url=" + window.location.href, function (response, textStatus, jqXHR) {
                try {
                    var signPackage = response;
                    global.corpId = signPackage.corpId;
                    dd.config(
                           {
                               agentId: signPackage.agentId,
                               corpId: signPackage.corpId,
                               timeStamp: signPackage.timeStamp,
                               nonceStr: signPackage.nonceStr,
                               signature: signPackage.signature,
                               jsApiList: jsApiList 
                           });
                    dd.ready(function () {
                        if (fnReady != null) {
                            fnReady();
                        }
                    });
    
                    dd.error(function (err) {
                        if (err == null) {
                            alert('dd error: ' + JSON.stringify(err));
                        }
                        else {
                            fnError();
                        }
                    });
                }
                catch (e) {
    
                }
            });
        }
    }
    
    其中"/api/Auth/GetSignPackage"是WebApi的方式,这将在后续中说到。这里需要引用zepto.min.js。

    下面调用的结果


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

    转载请注明出处。






  • 相关阅读:
    xls与csv文件的区别
    青音,经典爱情语录
    win7用户账户自动登录方法汇总
    How to using Procedure found Lead Blocker
    FTS(3) BSD 库函数手册 遍历文件夹(二)
    FTS(3) BSD 库函数手册 遍历文件夹(一)
    DisplayMetrics类 获取手机显示屏的基本信息 包括尺寸、密度、字体缩放等信息
    About App Distribution 关于应用发布
    FTS(3) 遍历文件夹实例
    OpenCV 2.1.0 with Visual Studio 2008
  • 原文地址:https://www.cnblogs.com/sparkleDai/p/7604931.html
Copyright © 2011-2022 走看看