【干货】C#根据类生成签名字符串(附DEMO下载地址)

2019-07-25 11:15:01 浏览数 (1)

前言

现在第三方支付的接口签名机制都是模仿微信签名方式,把参数按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就是我们获取的属性的值。

代码里的实现步骤:

  1. 定义生成的List<PropertyInfo>(new List<PropertyInfo>())
  2. 把传入进来的泛型类的属性生数组,然后再插入到我们的List里面(List.add())
  3. 根据输入的参数进行List属性名的排序(List.Orderby())
  4. 遍历我们的Listr属性和值进行字符串的拼接(List.Foreach())
  5. 输出字符串

代码编写

我们新建好一个C#的Winform程序,起名为ClassToSign,然后在里面新建了两个类,一个商品资料类,一个用户信息类

商品资料类

用户信息类

然后我们在Form窗体里面加入左边加入一个TextBox,起名为tbShow用于显示生成的结果,再设置商品资料和用户信息对应的输入文本框,加上两个生成的签名按钮

在Form1.cs里面先把我们转换的核心代码写进去

然后Button1事件写商品资料生成的方法

Button2写用户信息生成的方法

运行结果

DEMO下载地址

链接:https://pan.baidu.com/s/1UuPo7GV31ggKk6Ze4nHAWw 密码:wde8


-END-

0 人点赞