2021-09-18

记录自己做的一个签名生成方法,
签名方法是
MD5(所有字段按字符排序后取对应的值(不含引号)和API密钥进行拼接转换成大写)

string jopList = "";
            SqlConnection sSqlCnt = null;
            string dbCntString = "";
            string Autograph = "";
            string a = jop.ToString();
            string sign = "";
            Dictionary<string, string> codeDictioary = new Dictionary<string, string>();
            Dictionary<string, string> codes = new Dictionary<string, string>();
            string [] StrList = a.Split(',');
            
            foreach (var item in jop)
            {
                codeDictioary.Add(item.Key.ToString(), item.Value.ToString());
            }
            //因为不要把签名放进去比较所以在这把签名删除
            sign = codeDictioary["sign"];
            codeDictioary.Remove("sign");
            //如果有data数组,对数组进行排序取值
            if (codeDictioary.ContainsKey("data"))
            {
                JToken[] jar = jop["data"].ToArray();
                string dataKeys = "";
                
                foreach (JObject item in jar)
                {
                    Dictionary<string, string> dataDictioary = new Dictionary<string, string>();
                    Dictionary<string, string> dataCodes = new Dictionary<string, string>();
                    foreach (var items in item)
	                {
		                dataDictioary.Add(items.Key.ToString(),items.Value.ToString());
	                }
                    var result1 = from pair in dataDictioary orderby pair.Key select pair;
                    foreach (KeyValuePair<string, string> pair in result1)
                    {
                        dataCodes.Add(pair.Key.ToString(), pair.Value.ToString());
                    }
                    foreach (string value in dataCodes.Values)
                    {
                        dataKeys += value;
                    }
                }
                codeDictioary["data"] = dataKeys.Trim();
            }
            //把接收的参数按照kye排序
            var result = from pair in codeDictioary orderby pair.Key select pair;
            foreach (KeyValuePair<string, string>pair in result)
            {
               codes.Add(pair.Key.ToString(), pair.Value.ToString());
            }

            foreach (string values in codes.Values)
            {
                Autograph += values;
            }
            DateTime nowTime = DateTime.Now;
            DateTime startTime = TimeZoneInfo.ConvertTime(new DateTime(1970, 1, 1, 8, 0, 0, 0), TimeZoneInfo.Local);
            long XTdate = (nowTime.Ticks - startTime.Ticks) / 10000;   //除10000调整为13位   
            long jsDate = long.Parse(codeDictioary["timestamp"]);
            //时间验证,超时十分钟返回超时连接
            if (XTdate - jsDate > 10 * 60 * 1000)
            {
                return "{\"status_code\":\"1\", \"error_msg\":\"连接已超时\"}";
            }

            if (!string.IsNullOrEmpty(codeDictioary["companyno"]))
            {

                dbCntString = Getstr(codeDictioary["companyno"]);//获取连接参数
                //得到数据库连接对象
                sSqlCnt = new SqlConnection(dbCntString);
                sSqlCnt.Open();
            }
            //获取系统参数
            string XTcompanyno = pubObj.ReadIniKeys("Key", codeDictioary["companyno"], "", yCommon.pubObj.sServerPath + "\\GlobalParm.ini");//系统编号
            string XTkey = PublicBll.GetXTKeyByCompanyno(codeDictioary["companyno"], dbCntString);//系统key
            long XtTimestamp = (System.DateTime.UtcNow.Ticks - Jan1st1970Ms) / 10000;//1970-1-1到此时的毫秒数


            //判断接收参数是否符合条件
            if (codeDictioary["key"] != XTkey)//秘钥
            {
                return "{\"status_code\":\"1\", \"error_msg\":\"登录编号或授权秘钥有误\"}";
            }
            //生成签名
            string p = yCommon.ExPub.GetMd5Hash(Autograph).ToUpper();//签名
            if (sign == p)
            {
                switch (codeDictioary["function"])
                {
                    default:
                        jopList = "{\"status_code\":\"1\",\"error_msg\":\"参数不正确\"}";
                        break;
                }
            }
            else
            {
                return "{\"status_code\":\"1\", \"error_msg\":\"签名有误\"}";
            }
            return jopList.ToString() ;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值