.NET微信公众号开发系列 - 签名算法

在下目前已经无力吐槽签名算法这事了,现在贴上自己写的代码。希望可以节省各位同学的实际开发以及阅读开发文档的时间。

当然主要的还是阅读官方开发文档的时间,反正在下不再想看见那些东西。

PS:对于本人写的代码,请尽管在评论里喷,谁知道我会不会回呢。

 

首先,.NET开发的同学可以使用 SortedDictionary<string, object>保存需要签名的键值对,添加进的数据会根据 key自动排序。

 

        /// <summary>
        /// 获取Dictionary
        /// </summary>
        public SortedDictionary<string, object> DataDictionary { get; }

其他方法:

        /// <summary>
        /// Dictionary格式转化成url参数格式
       
/// </summary>
        /// <returns>url格式串, 该串不包含sign字段值</returns>
        public string ToUrl()
        {
          
var buff = "";
          
foreach (var pair in DataDictionary)
            {
              
if (pair.Value == null)
                   throw new WxPayException("ToUrl WxPayData内部含有值为null的字段!");
              
              
if (pair.Key != "sign" && pair.Value.ToString() != "")
                    buff
+= pair.Key + "=" + pair.Value + "&";
            }
          

          
return buff.Trim('&');
        }

MD5签名:

/// <summary>
        /// 生成签名,详见签名生成算法
        /// </summary>
        /// <returns>签名, sign字段不参加签名</returns>
        public string Sign()
        {
            //转url格式
              var str = ToUrl();
//在string后加入API KEY
            str += "&key=" + _wxPayConfig.KEY;
            
//MD5加密
              var md5 = MD5.Create();
            var bs = md5.ComputeHash(str.ToBytes(Encoding.UTF8));
            var sb = new StringBuilder();
            foreach (byte b in bs)
            {
                sb.Append(b.ToString("x2"));
            }
//所有字符转为大写
              return sb.ToString().ToUpper();
        }

 

SHA1签名:

public string Sha1Sign()
{
    //转url格式
     var str = ToUrl();
//sha1加密
     var sha1 = SHA1.Create();
    var bs = sha1.ComputeHash(str.ToBytes(Encoding.UTF8));
    var sb = new StringBuilder();
    foreach (var b in bs)
    {
        sb.AppendFormat("{0:x2}", b);
    }
//所有字符转为大写
    return sb.ToString().ToLower();
}
posted @ 2016-01-29 18:02  Kuningasic  阅读(1025)  评论(0编辑  收藏  举报