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";
}
相关推荐
DreamByte13 分钟前
Python Tkinter小程序
开发语言·python·小程序
覆水难收呀22 分钟前
三、(JS)JS中常见的表单事件
开发语言·前端·javascript
阿华的代码王国26 分钟前
【JavaEE】多线程编程引入——认识Thread类
java·开发语言·数据结构·mysql·java-ee
__water28 分钟前
『功能项目』QFrameWork框架重构OnGUI【63】
c#·unity引擎·重构背包框架
繁依Fanyi32 分钟前
828 华为云征文|华为 Flexus 云服务器部署 RustDesk Server,打造自己的远程桌面服务器
运维·服务器·开发语言·人工智能·pytorch·华为·华为云
Crazy Struggle1 小时前
C# + WPF 音频播放器 界面优雅,体验良好
c#·wpf·音频播放器·本地播放器
weixin_486681141 小时前
C++系列-STL容器中统计算法count, count_if
开发语言·c++·算法
基德爆肝c语言1 小时前
C++入门
开发语言·c++
怀九日1 小时前
C++(学习)2024.9.18
开发语言·c++·学习·面向对象·引用·
一道秘制的小菜1 小时前
C++第七节课 运算符重载
服务器·开发语言·c++·学习·算法