在下目前已经无力吐槽签名算法这事了,现在贴上自己写的代码。希望可以节省各位同学的实际开发以及阅读开发文档的时间。
当然主要的还是阅读官方开发文档的时间,反正在下不再想看见那些东西。
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(); }