当前位置: 首页 > article >正文

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

目录

故障现象

开发运行环境

解决

实现携带证书的 API URL调用

其它


故障现象

实现微信退款功能,我们需要在微信支付商户后台申请安全证书,并调用退款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;
}

其它

关于微信支付申请的API证书一般有效期为5年,最多可同时申请9个证书,请注意证书的更新。其它可参阅我的文章

《C# 实现微信退款及对帐》

《C# 解决访问 API 显示基础连接已经关闭的问题》

如果对于可直接访问的 API URL ,可参阅我的文章:

《C# 关于“您与该网站的连接不是私密连接...”的问题》

《C# 实现访问 Web API Url 提交数据并获取处理结果》

感谢您的阅读,希望本文能够对您有所帮助。


http://www.kler.cn/a/501196.html

相关文章:

  • [ Spring ] Install MongoDB on Ubuntu24
  • 反转链表题目
  • Mysql--运维篇--空间管理(表空间,索引空间,临时表空间,二进制日志,数据归档等)
  • PL/SQL语言的文件操作
  • 【API】免费调用Qwen-vl2对图像打标
  • LKT4304新一代算法移植加密芯片,守护物联网设备和云服务安全
  • vue3+ts+element-plus 对话框el-dialog设置圆角
  • Java基础面试题day02——数据类型
  • 【非常详细】TCP/IP协议详解
  • Unity3d 基于Barracuda推理库和YOLO算法实现对象检测功能
  • 采用GPT生成的Python 的 2048 游戏
  • 一些计算机零碎知识随写(25年1月)-1
  • Observability:将 OpenTelemetry 添加到你的 Flask 应用程序
  • 深入学习Fanout Exchange交换机
  • Java列表示例
  • 于交错的路径间:分支结构与逻辑判断的思维协奏
  • IP vs 子系统 Vs SoC 验证
  • import语句详解
  • C#中收发QQ邮箱电子邮件
  • 负载均衡服务器要怎么配置?
  • 计算机网络 笔记 数据链路层3(局域网,广域网,网桥,交换机)
  • 【数据库】Unity 使用 Sqlite 数据库
  • 上手体验微软全新整合的王炸平台Fabric
  • Python爬虫-汽车之家各车系周销量榜数据
  • 网络原理(1)—— 初识
  • 【Linux系列】`find / -name cacert.pem` 文件搜索