最近在做微信的网页相关开发,在调用JS-SDK时,总是时不时出现 invalid signature 的报错。
查了N多方法,后来排除到签名的生成上。在微信的文档(微信JSSDK签名生成)里仅是提到使用SHA1加密。
在.Net Core 中,可以用 System.Security.Cryptography里的SHA1进行加密,不过得到的是byte类型,而微信验证需要的是字符类的签名,所以需要转一下。
在转换时踩了个坑,利用的是16进制转换,如下
采用url为 http://127.0.0.1的进行构造
jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=4f6c95eae451473cb731c8df62ae9ffe×tamp=1601287681&url=http://127.0.0.1/
/* 16进制转换生成的 签名*/
public static string 16ToSignature(string sting1)
{SHA1 sha = SHA1.Create();byte[] bytResult = sha.ComputeHash(System.Text.Encoding.UTF8.GetBytes(string1));string errSignature="";for (int i = 0; i < bytResult.Length; i++){//16进制转换errSignature = errSignature + bytResult[i].ToString("X");}Console.WriteLine("错误生成:"+errSignature);}
/* 使用BitConverter生成签名*/
public static string BitToSignature(string sting1)
{SHA1 sha = SHA1.Create();byte[] bytResult = sha.ComputeHash(System.Text.Encoding.UTF8.GetBytes(string1));Console.WriteLine("正确生成:"+BitConverter.ToString(bytResult).Replace("-", "")); Console.ReadKey();
}
输出的结果:
貌似16进制直接转换的,和BitConvert 转的都一样
但是当签名构造里的URL地址变化时,url变成 http://127.0.0.1/WX
jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=4f6c95eae451473cb731c8df62ae9ffe×tamp=1601287681&url=http://127.0.0.1/WX";
输出结果:
那这两个如何验证哪个正确那?即微信的sha1生成的是哪一个? 可以使用微信校验签名算法工具,进行校验下