/*說明:
iisweb應用使用X509Certificate2加載證書時需要設置應用程序池的“允許加載用戶配置文件”為True,切記!
證書的商戶中文名采用正則表達式截取
*/
/// <summary>
/// 微信退款申請
/// </summary>
/// <param name="enterpriseId">企業id</param>
/// <param name="mchId">商戶號</param>
/// <param name="refundXmlStr">退款請求的xml實體</param>
/// <returns></returns>
public OperationResult Refund(string enterpriseId, string mchId, string refundXmlStr)
{
OperationResult response = new OperationResult
{
Code = OperationResultType.Error
};
try
{
//string certificationPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", "Certification", "WeiXin", enterpriseId);
string certificationPath = $"D:\\Certification\\WeiXin\\{enterpriseId}";
LogHelper.Info($"certificationPath={ certificationPath}");
if (!Directory.Exists(certificationPath))
{
response.Message = $"不存在企業{enterpriseId}的有效證書";
return response;
}
var files = Directory.GetFiles(certificationPath, "*.p12");
if (files.Length <= 0)
{
response.Message = $"不存在企業{enterpriseId}的有效證書";
return response;
}
certificationPath = files[0];
//, X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet
X509Certificate2 certificate = new X509Certificate2(certificationPath, mchId);
X509Store store1 = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store1.Open(OpenFlags.ReadWrite);
store1.Add(certificate);
if (string.IsNullOrWhiteSpace(certificate.SubjectName.Name) || !certificate.SubjectName.Name.Contains("CN"))
{
LogHelper.Error($"企業{enterpriseId}證書無效:{certificate.SubjectName.Name}", "WxRefundDomain", "Refund");
}
Regex rg = new Regex("(?<=(CN=))[.\\s\\S]*?(?=(,))", RegexOptions.Multiline | RegexOptions.Singleline);
var subjectName = rg.Match(certificate.SubjectName.Name).Value;
store1.Close();
HttpWebResponse webreponse;
//系統必須已經導入cert指向的證書
string url = "https://api.mch.weixin.qq.com/secapi/pay/refund";
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
X509Certificate2Collection certs = store.Certificates.Find(X509FindType.FindBySubjectName, subjectName,
false);
if (certs.Count > 0)
{
X509Certificate2 cert = certs[0];
HttpWebRequest webrequest = (HttpWebRequest)HttpWebRequest.Create(url);
webrequest.ClientCertificates.Add(cert);
webrequest.Method = "post";
webrequest.KeepAlive = true;
byte[] bdata = Encoding.UTF8.GetBytes(refundXmlStr);
webrequest.ContentType = "application/xml;charset=utf-8";
webrequest.ContentLength = bdata.Length;
Stream streamOut = webrequest.GetRequestStream();
streamOut.Write(bdata, 0, bdata.Length);
streamOut.Close();
webreponse = (HttpWebResponse)webrequest.GetResponse();
Stream stream = webreponse.GetResponseStream();
string resp = string.Empty;
using (StreamReader reader = new StreamReader(stream))
{
resp = reader.ReadToEnd();
}
if (!string.IsNullOrWhiteSpace(resp))
{
LogHelper.Info($"微信退款返回:{resp}", "WxRefundDomain", "Refund");
try
{
var res = WxXmlHelper.DESerializer<WxRefundResponse>(resp);
//簽名校驗
if (res.return_code.Equals("SUCCESS"))//接口響應成功
{
if (res.result_code.Equals("SUCCESS"))//申請成功
{
response.Code = OperationResultType.Success;
response.Message = res.return_msg;
return response;
}
//申請失敗
response.Code = OperationResultType.IllegalOperation;
response.Message = res.err_code_des;
return response;
}
//接口異常
response.Message = res.return_msg;
LogHelper.Error($"微信退款失敗:{resp}", "WxRefundDomain", "Refund");
return response;
}
catch (Exception)
{
throw;
}
}
}
}
catch (Exception ex)
{
response.Message = ex.Message;
LogHelper.Error("微信退款失敗", ex, "WxRefundDomain", "Refund");
}
return response;