经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
微信支付 统一下单 字段 body 为中文时 报【签名错误】解决方案(C# SDK)
来源:cnblogs  作者:HilaryHe  时间:2018/11/8 9:57:18  对本文有异议

方案一

如果你是从微信支付官网下载的 .NET C#【微信支付】API对应的SDK 调用示例

查看源码,会发现这个SDK中的 WxPayData 的类的 CalcHMACSHA256Hash 签名方法采用的是  Encoding.Default 编码,如果要编码的字符串为中文,则会出现签名错误

所有需要修改SDK中这个方法的代码:将编码改为UTF8

  1. private string CalcHMACSHA256Hash(string plaintext, string salt)
  2. {
  3. string result = "";
  4. var enc = Encoding.UTF8; //修改Default为UTF8
  5. byte[]
  6. baText2BeHashed = enc.GetBytes(plaintext),
  7. baSalt = enc.GetBytes(salt);
  8. System.Security.Cryptography.HMACSHA256 hasher = new HMACSHA256(baSalt);
  9. byte[] baHashedText = hasher.ComputeHash(baText2BeHashed);
  10. result = string.Join("", baHashedText.ToList().Select(b => b.ToString("x2")).ToArray());
  11. return result;
  12. }

方案二

在签名的类型使用 SIGN_TYPE_MD5 方式:

这个时候需要修改下单方法中的 WxPayApi 类 UnifiedOrder 方法

  1. inputObj.SetValue("sign_type", WxPayData.SIGN_TYPE_MD5);//签名类型
  2.  
  3. //签名
  4. inputObj.SetValue("sign", inputObj.MakeSign(WxPayData.SIGN_TYPE_MD5));

注意客户端中的签名方式也需要跟服务端保持一直,如果下单用的是 SIGN_TYPE_MD5,则客户端用SIGN_TYPE_MD5,如果客户端用SIGN_TYPE_HMAC_SHA256,则服务端用SIGN_TYPE_HMAC_SHA256

 

最后:建议使用方案一,个人觉得 256 签名更难破解,更安全一些!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号