c# 对接第三方接口实现签名

官网文档要求如下:

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";
}
相关推荐
逊嘘7 分钟前
【Java语言】抽象类与接口
java·开发语言·jvm
Half-up9 分钟前
C语言心型代码解析
c语言·开发语言
Source.Liu31 分钟前
【用Rust写CAD】第二章 第四节 函数
开发语言·rust
monkey_meng31 分钟前
【Rust中的迭代器】
开发语言·后端·rust
余衫马34 分钟前
Rust-Trait 特征编程
开发语言·后端·rust
monkey_meng37 分钟前
【Rust中多线程同步机制】
开发语言·redis·后端·rust
Jacob程序员39 分钟前
java导出word文件(手绘)
java·开发语言·word
小白学大数据1 小时前
正则表达式在Kotlin中的应用:提取图片链接
开发语言·python·selenium·正则表达式·kotlin
VBA63371 小时前
VBA之Word应用第三章第三节:打开文档,并将文档分配给变量
开发语言
半盏茶香1 小时前
【C语言】分支和循环详解(下)猜数字游戏
c语言·开发语言·c++·算法·游戏