记录自己做的一个签名生成方法,
签名方法是
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() ;
}