官网文档要求如下:
Sign算法说明
举例:假设请求参数键值对如下
|-------------------------------------------------------------------------------------------------------------------------------------------------|
| appkey : test2-xx page_no : 0 end_time : 2016-08-01 13:00:00 start_time : 2016-08-01 12:00:00 page_size : 40 sid : test2 timestamp : 1470042310 |
- 第一步 对数所有请求参数按照键名进行正序排序,排序结果如下,注意要保持键值对的对应关系且appsecret不参与运算。
|-------------------------------------------------------------------------------------------------------------------------------------------------|
| appkey : test2-xx end_time : 2016-08-01 13:00:00 page_no : 0 page_size : 40 sid : test2 start_time : 2016-08-01 12:00:00 timestamp : 1470042310 |
- 第二步 循环对每个键值进行处理:
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1.处理 appkey 1.1 appkey 采用utf8编码格式的字符长度并保留两位,不够的位数补0,计算结果为:06 1.2 将1.1计算的长度 06 和 appkey 用 - 作为分隔符进行拼接,拼接结果为 06-appkey 1.3 test2-xx 采用utf8编码格式的字符长度不足四位,保留四位,不够的位数补0,计算结果为:0008,如果超过4位,保留实际结果,如:10000 1.4 将1.3计算的长度 0008 和 test2-xx 用 - 作为分隔符进行拼接,拼接结果为 0008-test2-xx 1.5 将1.2 和 1.4 的拼接结果用 : 进行拼接 ,拼接结果为 06-appkey:0008-test2-xx 1.6 将1.5的结果最后拼接上分号 ; 拼接结果为 06-appkey:0008-test2-xx; 2.处理 end_time 同1处理 3.处理 page_no 同1处理 4.处理 page_size 同1处理 5.处理 sid 同1处理 6.处理 start_time 同1处理 7.处理 timestamp 注意前五步和1处理方法相同,因为 timestamp 是最后一个请求参数,所以不需要 1.6步骤 最后的处理结果为: 06-appkey:0008-test2-xx;08-end_time:0019-2016-08-01 13:00:00;07-page_no:0001-0;09-page_size:0002-40;03-sid:0005-test2;10-start_time:0019-2016-08-01 12:00:00;09-timestamp:0010-1470042310 注意:示例中的参数为查询类接口请求参数,创建类接口中的参数包含json串,比如:创建原始订单:trade_list = [] 这里是订单的json数据,json串当作正常的字符串进行处理 |
- 第三步 计算sign
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1.获取appsecret 假如当前实例中的 appsecret 为 12345 2.将appsecret拼接在第二步的结果后面,注意没有任何拼接符,结果如下:06-appkey:0008-test2-xx;08-end_time:0019-2016-08-01 13:00:00;07-page_no:0001-0;09-page_size:0002-40;03-sid:0005-test2;10-start_time:0019-2016-08-01 12:00:00;09-timestamp:0010-147004231012345 3.将上述字符串进行md5加密后即可得到sign,要求MD5方法返回的是32位小写的MD5值,计算结果如下: ad4e6fe037ea6e3ba4768317be9d1309 4.将计算的sign作为一个请求参数放到参数列表中 sid : test2 appkey : test2-xx timestamp : 1470042310 start_time : 2016-08-01 12:00:00 end_time : 2016-08-01 13:00:00 page_no : 0 page_size : 40 sign : ad4e6fe037ea6e3ba4768317be9d1309 |
cs
using System.Drawing;
using System.Text;
using System;
using static System.Net.Mime.MediaTypeNames;
using System.Reflection;
using System.Xml;
using System.Collections.Generic;
using System.Xml.Linq;
using System.Linq;
Console.Write("开始:");
UTF8LengthPadding.Main();
Console.ReadLine();
public class UTF8LengthPadding
{
public static void Main()
{
//秘钥
string appsecret = "12345";
//参数类
Parm parm = new Parm();
//存放参数数据的集合
Dictionary<string, string> dic = new Dictionary<string, string>();
//循环类 添加到集合中
Type myEntityType = parm.GetType();
PropertyInfo[] properties = myEntityType.GetProperties();
foreach (PropertyInfo property in properties)
{
string propertyName = property.Name;
object propertyValue = property.GetValue(parm);
dic.Add(propertyName, propertyValue.ToString());
}
//对key进行排序
var sortedKeys = dic.OrderBy(kvp => kvp.Key).ToDictionary(kvp => kvp.Key);
//拼接结果
string prestr = "";
//最终结果
string finalStr = "";
foreach (var item in sortedKeys.Keys)
{
//key的长度
int keyLength = item.Length;
//不足两位补0
string key = keyLength.ToString("00");
//拼接
prestr = prestr + key;
//组装key值
prestr = prestr + "-" + item + ":";
//组装value长度
string valueStr = dic[item];
//value长度
int valueLength = valueStr.Length;
//不足四位补0
string value = valueLength.ToString("0000");
//拼接
prestr = prestr + value;
//组装value
prestr = prestr + "-" + valueStr + ";";
}
//去掉最后一个;
if (prestr.Length > 0)
{
prestr = prestr.Substring(0, prestr.Length - 1);
}
//第三步 计算sign md5加密后,返回的是32位小写的MD5值
finalStr = prestr + appsecret;
Console.WriteLine(finalStr); // 输出
Console.WriteLine(GetMD5_32(finalStr)); // 输出
}
/// <summary>
/// 获得32位的MD5加密
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string GetMD5_32(string input)
{
System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
byte[] data = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(input));
StringBuilder sb = new StringBuilder();
for (int i = 0; i < data.Length; i++)
{
sb.Append(data[i].ToString("x2"));
}
return sb.ToString();
}
}
public class Parm
{
public string appkey { get; set; } = "test2-xx";
public string page_no { get; set; } = "0";
public string end_time { get; set; } = "2016-08-01 13:00:00";
public string start_time { get; set; } = "2016-08-01 12:00:00";
public string page_size { get; set; } = "40";
public string sid { get; set; } = "test2";
public string timestamp { get; set; } = "1470042310";
}