天天看點

C# 通用簽名工具

最近在做一個功能需要用到簽名,看了一下之前已有的簽名寫法代碼量太多了,于是想着是不是可以把對象轉成 Dictionary,然後直接生成簽名不就可以少寫很多代碼嗎?于是說幹就幹,在查了相關資料參考了别人的代碼之後,我寫了這些代碼。

我們先來看一下調用的對比,這是之前的:

C# 通用簽名工具

 這是之後的:

C# 通用簽名工具

通過對比我們看到節省了很多代碼,而且對象屬性越多,使用簽名工具類的優勢越明顯,廢話不多說,我們直接看代碼:

/// <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