微信支付中申请退款的接口不太一样。其他的接口用普通的post请求就可以,但是申请退款的接口必须加上证书。一开始我以为只要安装了证书就行,经过尝试后发现会报基础连接已经关闭的错误,最终经过查资料解决了这个问题,在post请求中添加证书就能解决这个问题
public static string PostWebRequest(string postUrl, string paramData)
{
string ret = string.Empty;
try
{
X509Certificate2 certificate = new X509Certificate2(@"E:\工作项目\apiclient_cert.p12", "1519238551", X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet); //初始化证书
byte[] byteArray = Encoding.Default.GetBytes(paramData); //转化
HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(postUrl));
webReq.Method = "POST";
webReq.ContentType = "application/x-www-form-urlencoded";
webReq.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
webReq.ClientCertificates.Add(certificate); //添加证书
webReq.ContentLength = byteArray.Length;
Util.SetCertificatePolicy();
Stream newStream = webReq.GetRequestStream(); //
newStream.Write(byteArray, 0, byteArray.Length);//写入参数
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;
HttpWebResponse response = (HttpWebResponse)webReq.GetResponse(); //这里报错
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
ret = sr.ReadToEnd();
newStream.Close();
sr.Close();
response.Close();
newStream.Close();
}
catch (Exception ex)
{
return ex.Message;
}
return ret;
}
最重要的是两行代码:初始化证书和添加证书。这样问题就解决了。