C#解决“因为算法不同,客户端和服务器无法通信”的问题

 更新时间:2024年12月24日 09:36:17   作者:初九之潜龙勿用  
实现微信退款功能,我们需要在微信支付商户后台申请安全证书,并调用退款API URL,在调试过程中为增添返回调试信息属性,调试一切正常,但再次覆盖的时候,调用显示为 “ 因为算法不同,客户端和服务器无法通信,” ,本文介绍了C#解决因为算法不同,客户端和服务器无法通信的问题

故障现象

实现微信退款功能,我们需要在微信支付商户后台申请安全证书,并调用退款API URL。在调试过程中为增添返回调试信息属性,重新对.net FrameWorkd 类库进行编译并部署,调试一切正常,但再次覆盖的时候,调用显示为 “ 因为算法不同,客户端和服务器无法通信。” ,系统返回错误:

类似调用如下代码:

string cert = @"D:\wxpay\apiclient_cert.p12";
 
string password = "14302";
 
string post_data = getRefundOrderXml(refundorder, key);
string request_data = PostXmlAndCertToUrl(RefundOrderUrl, post_data,cert,password);

问题出在 PostXmlAndCertToUrl 调用上,cert 为申请证书的存放位置,passwrd 为证书密码。

开发运行环境

操作系统: Windows Server 2019 DataCenter

.net版本: .netFramework4.7.2 

开发工具:VS2019  C#

解决

System.Net.ServicePointManager.SecurityProtocol 属性可选择安全套接字层 (SSL) 或传输层安全 (TLS) 协议的版本,可能是由于协议版本不匹配造成的此原因,通过在Page_Load 服务器事件添加如下语句,问题解决:

void Page_Load(Object sender, EventArgs e)
{
     System.Net.ServicePointManager.SecurityProtocol = 
System.Net.SecurityProtocolType.Tls | 
System.Net.SecurityProtocolType.Tls11 | 
System.Net.SecurityProtocolType.Tls12;
 
}  

实现携带证书的 API URL调用

PostXmlAndCertToUrl 实现了携带安全证书访问 API 的能力,说明见下表:

序号参数名类型说明
1urlstring要访问的 API URL 地址
2post_datastring要 POST 的指定规则内容 
3certstringAPI 安全证书存放存储的全路径地址
4passwordstring证书密码

实现代码如下:

public string PostXmlAndCertToUrl(string url, string postData,string cert,string password)
{
     string resp = string.Empty;
     ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
System.Security.Cryptography.X509Certificates.X509Certificate2 cer = new System.Security.Cryptography.X509Certificates.X509Certificate2(cert, password, System.Security.Cryptography.X509Certificates.X509KeyStorageFlags.PersistKeySet | System.Security.Cryptography.X509Certificates.X509KeyStorageFlags.MachineKeySet);
 
     HttpWebRequest webrequest = (HttpWebRequest)HttpWebRequest.Create(url);
     webrequest.ClientCertificates.Add(cer);
     webrequest.Method = "post";
     webrequest.ContentType = "application/x-www-form-urlencoded";
     webrequest.ContentLength = postData.Length;
     HttpWebResponse response = null;
     try
     {
        StreamWriter swRequestWriter = new StreamWriter(webrequest.GetRequestStream());
        swRequestWriter.Write(postData);
 
        if (swRequestWriter != null)
            swRequestWriter.Close();
 
            response = (HttpWebResponse)webrequest.GetResponse();
            using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
            {
              resp = reader.ReadToEnd();
            }
     }
     catch (Exception exp)
     {
           throw exp;
                    
     }
     finally
     {
           if (response != null)
               response.Close();
     }
     return resp;
}
 
private static bool CheckValidationResult(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors errors)
{
       if (errors == System.Net.Security.SslPolicyErrors.None)
           return true;
       return false;
}

到此这篇关于C#解决“因为算法不同,客户端和服务器无法通信”的问题的文章就介绍到这了,更多相关C#客户端和服务器无法通信内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C# 控件属性和InitializeComponent()关系案例详解

    C# 控件属性和InitializeComponent()关系案例详解

    这篇文章主要介绍了C# 控件属性和InitializeComponent()关系案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C#中的Lazy如何使用详解

    C#中的Lazy如何使用详解

    这篇文章主要给大家介绍了C#中Lazy如何使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • C#读取本地网络配置信息全攻略分享

    C#读取本地网络配置信息全攻略分享

    在当今数字化时代,网络已深度融入我们生活与工作的方方面面,对于软件开发而言,掌握本地计算机的网络配置信息显得尤为关键,而在 C# 编程的世界里,我们又该如何巧妙地读取这些至关重要的本地网络配置信息呢?接下来,就让我们一同踏上探索之旅
    2025-01-01
  • WPF ComboBox获取当前选择值的实例详解

    WPF ComboBox获取当前选择值的实例详解

    这篇文章主要介绍了WPF ComboBox获取当前选择值的实例详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • c#入门之类型转换详解

    c#入门之类型转换详解

    这篇文章主要介绍了c#的类型转换详解,类型转换分两种形式:隐式转换、显示转换,下面是详细介绍
    2014-04-04
  • C# 9.0 特性全面总结

    C# 9.0 特性全面总结

    这篇文章主要介绍了C# 9.0 特性的相关资料,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-02-02
  • C# using 关键字用法以及容易踩的坑

    C# using 关键字用法以及容易踩的坑

    using​关键字是C#中资源管理的基石,从指令到语句再到声明,每一次改进都在简化代码的同时强化了确定性释放,本文介绍using的关键用法、经典场景以及容易踩的坑,感兴趣的朋友一起看看吧
    2026-05-05
  • C#中高效的多线程并行处理实现方式详解

    C#中高效的多线程并行处理实现方式详解

    在处理大型数据集时,单线程处理往往成为性能瓶颈,所以本文将详细介绍几种高效的多线程并行处理实现方式,帮助开发者优化数据处理流程,有需要的可以了解下
    2025-04-04
  • 使用c#+IMap实现收取163邮件

    使用c#+IMap实现收取163邮件

    本文给大家推荐的是使用c#+IMap实现收取163邮件的具体方法和示例代码,并附上了smtp邮箱发送邮件的代码,有需要的小伙伴可以参考下
    2018-02-02
  • Unity自定义编辑器界面(Inspector界面)

    Unity自定义编辑器界面(Inspector界面)

    这篇文章主要为大家详细介绍了Unity自定义编辑器界面,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09

最新评论