最近在做一个功能需要用到签名,看了一下之前已有的签名写法代码量太多了,于是想着是不是可以把对象转成 Dictionary,然后直接生成签名不就可以少写很多代码吗?于是说干就干,在查了相关资料参考了别人的代码之后,我写了这些代码。
我们先来看一下调用的对比,这是之前的:
这是之后的:
通过对比我们看到节省了很多代码,而且对象属性越多,使用签名工具类的优势越明显,废话不多说,我们直接看代码:
/// <summary>
/// 将对象属性转换为字典
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static SortedDictionary<String, Object> ObjectToDictionary(Object obj)
{
SortedDictionary<String, Object> dic = new SortedDictionary<string, object>();
Type t = obj.GetType();
PropertyInfo[] pi = t.GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (PropertyInfo p in pi)
{
MethodInfo mi = p.GetGetMethod();
if (mi != null && mi.IsPublic)
{
dic.Add(p.Name, mi.Invoke(obj, new Object[] { }));
}
}
return dic;
}
/// <summary>
/// 组装待签名字符串
/// </summary>
/// <param name="m_values"></param>
/// <returns></returns>
private static string ToUrl(SortedDictionary<string, object> m_values)
{
string buff = "";
foreach (KeyValuePair<string, object> pair in m_values)
{
if (pair.Value == null)
{
SysLogHelper.Error("创建签名错误", "字典内部含有值为null的字段!");
return "";
}
if (pair.Key != "sign" && pair.Value.ToString() != "")
{
buff += pair.Key + "=" + pair.Value + "&";
}
}
buff = buff.Trim('&');
return buff;
}
/// <summary>
/// 创建签名
/// </summary>
/// <param name="m_values"></param>
/// <returns></returns>
public static string MakeSign(SortedDictionary<string, object> m_values)
{
//转url格式
string str = ToUrl(m_values);
//在string后加入API KEY
str += "&key=" + ConfigHelper.GetStringValue("secretKey");
var md5 = MD5.Create();
var bs = md5.ComputeHash(Encoding.UTF8.GetBytes(str));
var sb = new StringBuilder();
foreach (byte b in bs)
{
sb.Append(b.ToString("x2"));
}
//所有字符转为大写
return sb.ToString().ToUpper();
}
签名工具类可用于对接微信支付和微信 JSSDK等业务生成签名。
好了,今天的分享就到这里了,如果你觉得我的文章对你有帮助欢迎转评赞三连,咱们下次再会。
资料参考:
微信支付官方 SDK C# 版