JeffreySu / WeiXinMPSDK

微信全平台 .NET SDK, Senparc.Weixin for C#,支持 .NET Framework 及 .NET Core、.NET 8.0。已支持微信公众号、小程序、小游戏、微信支付、企业微信/企业号、开放平台、JSSDK、微信周边等全平台。 WeChat SDK for C#.
https://weixin.senparc.com
Apache License 2.0
8.43k stars 4.35k forks source link

sha1签名算法中编码不对,导致算出的签名与微信官网不一致 #253

Closed zheast closed 7 years ago

zheast commented 8 years ago

经验证: 原代码Senparc.Weixin.MP.Helpers.SHA1UtilHelper中采用ASCII编码进行加密,的到签名串与官网 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 中结果不一致,修改为UTF8编码后结果一致,请验证!

JeffreySu commented 8 years ago

我测试的结果是一样的,你可以再看一下,官方要求的就是ASCII编码。 下面是官网debug截图: image

下面是SDK的单元测试: image

zheast commented 8 years ago

需填入正确的参数后测试! 根据官网说法“字段名和字段值都采用原始值”,用ASCII编码应该没问题才对,但结果确实不一致。 实际验证用UTF8计算出来的与官网完全一致 参数样例: ticket:kgt8ON7yVITDhtdwci0qefK1QvDlwsAPwMnZOO_J0MxaUpuHtIU_IltC7zs3kfNOYTHEqeIEvEXZHbS3xXNx3g nonce: B7EE6F5F9AA5CD17CA1AEA43CE848496 timestamp:1474350784 url: https://www.baidu.com

JeffreySu commented 8 years ago

"需填入正确的参数后测试!"这个只是提示,包括已过期什么的,不牵扯到算法,换了之后仍然是一样的。 image

image

zheast commented 8 years ago

这是我这边的调试信息,参数都是一样的,sh1str是我用UFT8编码的,signatureStrOri是原本的,另外现在客户端目前用UTF8生成后与微信通信已经正常了,之前一直提示signature错误 20160921155726 0921161128

JeffreySu commented 8 years ago

你有没有发现timestamp和noceStr被你输错位置了? 正确的顺序是:public static string GetSignature(string ticket, string noncestr, string timestamp, string url)

JeffreySu commented 8 years ago

参考:https://github.com/JeffreySu/WeiXinMPSDK/blob/master/src/Senparc.Weixin.MP/Senparc.Weixin.MP/Helpers/JSSDK/JSSDKHelper.cs#L121

zheast commented 8 years ago

Ok,确实是我这边参数输入错误了,竟然一直没有发现,(⊙﹏⊙)b囧就一个! 修正后验证果然是一致的,看来编码不影响最终结果。多谢你的耐心回应。 另外我问下TenPay跟TenPayV3有什么区别,也是针对不同的微信版本吗? 官方支付这块的资料要么找不到,要么打不开

JeffreySu commented 8 years ago

TenPay是旧的微信支付版本(只有你在非常早的时候申请了微信支付才可能需要使用到这个接口),TenPayV3是第三版最新的,现在都只用这个就行了。和客户端没关系。