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.42k stars 4.35k forks source link

.net core在linux运行时,微信支付退款报错 #350

Closed zhougangnj closed 5 years ago

zhougangnj commented 7 years ago

.net core在扫码支付后,微信退款操作,httpclient需要证书,类似代码如下: X509Certificate cert = new X509Certificate(byteArr.ToArray(), password); handler.ClientCertificates.Add(cert);

在linux下会报 The libcurl library in use (7.29.0) and its SSL backend ("NSS/3.19.1 Basic ECC") do not support custom handling of certificates. A libcurl built with OpenSSL is required.

在windows下没有问题

请问是什么问题

JeffreySu commented 7 years ago

1、看一下是不是证书访问权限的问题?需要微信提供的p12(pfx)证书。 2、看提示是不是OpenSSL有这个强制的需求? 3、建议多换几个不同环境的Linux系统(网络环境、系统环境都不一样),看一下是否还有问题。

JeffreySu commented 7 years ago

对了,顺便看一下企业支付是否也有同样的问题。

jonechenug commented 7 years ago

我是在.net core的docker中执行过支付和退款,共同有的问题是随机字符串报错,再说说退款吧,我是自己实现的,基于httpclient

string data = packageReqHandler.ParseXML();
 var cer = new X509Certificate2(mchsetting.CertPath, mchsetting.Password,X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet);
  var handler = new HttpClientHandler();
 handler.ClientCertificates.Add(cer);
 HttpClient client = new HttpClient(handler);
var content = new StringContent(data, Encoding.UTF8);
var request = await client.PostAsync($"https://api.mch.weixin.qq.com/secapi/pay/refund", content);
var response = await request.Content.ReadAsStreamAsync();
var xmlDoc = new XmlDocument();
xmlDoc.Load(response);
return xmlDoc;
JeffreySu commented 7 years ago

@jonechenug 上述代码时可用的?

jonechenug commented 7 years ago

可以用,已经测试过了,退过很多次款了

zhougangnj commented 7 years ago

@jonechenug 你上面代码,是docker容器的linux(centos)下运行的吗?我们的代码好像跟你的类似,不行

jonechenug commented 7 years ago

@zhougangnj 官方的docker是在debian8下执行的(也就是说ubuntu系也可以),在windows环境的vs中也测试过,所以不可能是系统的原因,检查证书的路径是否正确,证书的密码是否正确

JeffreySu commented 7 years ago

@zhougangnj 上面 @jonechenug 的代码你试过了吗?

JeffreySu commented 7 years ago

@lishewen 这个问题你那边有测试过吗?

wangsijun1986 commented 6 years ago

我们现在也遇见了相同的问题,为已经尝试了重新编译curl版本,在centos7下使用curl -V查看到的是 curl 7.56.1 (x86_64-pc-linux-gnu) libcurl/7.56.1 OpenSSL/1.0.2l zlib/1.2.7 Release-Date: 2017-10-23 Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp Features: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP UnixSockets HTTPS-proxy

本以为这样就可以将NSS改为Openssl,但当我重试时,系统依然提示 The handler does not support client authentication certificates with this combination of libcurl (7.56.1) and its SSL backend ("NSS/3.28.4"). 很昏

JeffreySu commented 6 years ago

@wangsijun1986 上面 @jonechenug 提供的代码有事过吗?

string data = packageReqHandler.ParseXML();
 var cer = new X509Certificate2(mchsetting.CertPath, mchsetting.Password,X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet);
  var handler = new HttpClientHandler();
 handler.ClientCertificates.Add(cer);
 HttpClient client = new HttpClient(handler);
var content = new StringContent(data, Encoding.UTF8);
var request = await client.PostAsync($"https://api.mch.weixin.qq.com/secapi/pay/refund", content);
var response = await request.Content.ReadAsStreamAsync();
var xmlDoc = new XmlDocument();
xmlDoc.Load(response);
return xmlDoc;
wuball commented 6 years ago

@JeffreySu @jonechenug 实测centos7不可用,netcore 2.0. var request = await client.PostAsync($"https://api.mch.weixin.qq.com/secapi/pay/refund", content); 这句一样报相同错误

lishewen commented 6 years ago

https://q.cnblogs.com/q/91351/

https://stackoverflow.com/questions/46178308/how-to-ignore-ssl-certificate-validation-in-net-core-2-on-centos

wuball commented 6 years ago

@lishewen 我已经将curl切换到安装的最新版了,也对服务进行了重启,但是dotnet还是使用的老版本 image

dotnet依然报错 The handler does not support client authentication certificates with this combination of libcurl (7.29.0) and its SSL backend ("NSS/3.28.4").

lishewen commented 6 years ago

@wuball 你的错误信息显示还在使用 7.29.0 的lib so,就是说你bash下的cli指令是更新了,但dotnet调用的还是老的lib,一般这个是path问题

wuball commented 6 years ago

@lishewen 对呀,这个问题我搜不到dotnet跟这个path的关联处在哪,不知道从哪下手更改

lishewen commented 6 years ago

@wuball 去翻下源码吧,net core是开源的

lishewen commented 6 years ago

或者直接拉取官方的docker环境配置,省心

wuball commented 6 years ago

@lishewen 好的谢谢你的参考