最近在做一個功能需要用到簽名,看了一下之前已有的簽名寫法代碼量太多了,于是想着是不是可以把對象轉成 Dictionary,然後直接生成簽名不就可以少寫很多代碼嗎?于是說幹就幹,在查了相關資料參考了别人的代碼之後,我寫了這些代碼。
我們先來看一下調用的對比,這是之前的:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL9smaNhXSU5UNNRVT3V1MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLykzM4ADM0cTM2IjNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
這是之後的:
通過對比我們看到節省了很多代碼,而且對象屬性越多,使用簽名工具類的優勢越明顯,廢話不多說,我們直接看代碼:
/// <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# 版
https://blog.csdn.net/chanball/article/details/83370531