前言
现在第三方支付的接口签名机制都是模仿微信签名方式,把参数按ascii码进行排序后再加上key进行md5的加密,前两天因为做Delphi的接口,所以写了一篇《Delphi对TStrings进行排序》,这次我们写一个C#把类结构生成的签名字符串。
视频效果
代码语言:javascript复制核心代码
/// <summary>
/// 获取签名
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <param name="otype">0-不排序 1-按名称ASCII排序</param>
/// <returns></returns>
public string GetSign<T>(T t, int otype=1)
{
string retstr = "";
//定义PropertyInfo的List
List<PropertyInfo> proplist = new List<PropertyInfo>();
//遍历泛型类的每个属性加入到List里面
Array.ForEach<PropertyInfo>(typeof(T).GetProperties(),
p => proplist.Add(p));
//根据参数进行排序 0-不排序 1-按名称ASCII码排序
if (otype == 1)
proplist = proplist.OrderBy(k => k.Name).ToList();
//遍历List泛型生成我们要签名的字符串
proplist.ForEach(p =>
{
retstr = retstr p.Name "=" p.GetValue(t, null) "&";
});
//把字符串最后一位截断
retstr = retstr.Substring(0, retstr.Length - 1);
//输出字符串
return retstr;
}
因为我们的类不同可以都传进来通用,所以我们用到了泛形,要读取每个类的属性和值我们又用到了PropertyInfo(这个的用法我们就不在这介绍了,大家可以搜一下),其实 PropertyInfo里的Name就是我们的类里属性的名称,GetValue就是我们获取的属性的值。
代码里的实现步骤:
- 定义生成的List<PropertyInfo>(new List<PropertyInfo>())
- 把传入进来的泛型类的属性生数组,然后再插入到我们的List里面(List.add())
- 根据输入的参数进行List属性名的排序(List.Orderby())
- 遍历我们的Listr属性和值进行字符串的拼接(List.Foreach())
- 输出字符串
代码编写
我们新建好一个C#的Winform程序,起名为ClassToSign,然后在里面新建了两个类,一个商品资料类,一个用户信息类
商品资料类
用户信息类
然后我们在Form窗体里面加入左边加入一个TextBox,起名为tbShow用于显示生成的结果,再设置商品资料和用户信息对应的输入文本框,加上两个生成的签名按钮
在Form1.cs里面先把我们转换的核心代码写进去
然后Button1事件写商品资料生成的方法
Button2写用户信息生成的方法
运行结果
DEMO下载地址
链接:https://pan.baidu.com/s/1UuPo7GV31ggKk6Ze4nHAWw 密码:wde8
-END-