C# 微支付退款申請介面 V3.3.6

來源:互聯網
上載者:User

標籤:blog   http   io   ar   os   sp   for   on   資料   

/// <summary>
/// 微支付退款申請
/// </summary>
/// <param name="context"></param>
/// <param name="returnMsg"></param>
/// <returns></returns>
public bool Refund(HttpContext context, ref string returnMsg)
{
int UID = 0;
string WXO_Remark = "";//退款說明
if (string.IsNullOrEmpty(context.Session["UID"] as string))
{
returnMsg = "請登入!";
return false;
}
UID = Convert.ToInt32(context.Session["UID"]); //目前使用者

int Oid = Convert.ToInt32(context.Request["OID"].Trim()); //訂單ID
model = modelBll.GetModel(Oid); //訂單實體
Decimal refund;
if (context.Request["Refund"].Length > 0)
{
bool state = Decimal.TryParse(context.Request["Refund"].Trim(), out refund);
if(!state)
{
returnMsg = "請輸入正確的退款金額!";
return false;
}
}
else
{
returnMsg = "請輸入退款金額!";
return false;
}
if(refund > model.WXO_PRealPrice)
{
returnMsg = "輸入錯誤,退款金額不得大於總金額!";
return false;
}

string Nonce = CreateRandomCode(15).ToLower(); //產生15個隨機字元
string sign1 = "appid=" + CommonApi.AppID.ToString()+ //公眾號的APPID
"&mch_id=" + CommonApi.MechID.ToString() + //商戶號
"&nonce_str=" + Nonce + //隨機字串
"&op_user_id=" + CommonApi.MechID.ToString() + //使用者(預設商戶號)
"&out_refund_no=" + model.WXO_ORefundCode + //商戶退款單號
"&out_trade_no=" + model.WXO_OCode + //商戶單號
"&refund_fee=" + Convert.ToInt32(( refund*100 )) + //退款金額
"&total_fee=" + Convert.ToInt32((model.WXO_PRealPrice * 100)); //訂單總金額
string sign2 = sign1 + "&key="+ CommonApi.PayKey.ToString(); //商戶的Key
string sign = T9.Util.EncryptUtil.md5(sign2, 32).ToUpper(); //MD5加密

string URL = "https://api.mch.weixin.qq.com/secapi/pay/refund";
string RequstContext = "<xml>" +
"<appid><![CDATA["+CommonApi.AppID.ToString()+"]]></appid>" +
"<mch_id><![CDATA["+CommonApi.MechID.ToString()+"]]></mch_id>" +
"<nonce_str><![CDATA["+Nonce+"]]></nonce_str>" +
"<sign><![CDATA["+sign+"]]></sign>" +
"<out_trade_no><![CDATA["+model.WXO_OCode+"]]></out_trade_no>" +
"<out_refund_no><![CDATA["+model.WXO_ORefundCode+"]]></out_refund_no>" +
"<total_fee>"+ Convert.ToInt32((model.WXO_PRealPrice * 100 )) +"</total_fee>" +
"<refund_fee>"+ Convert.ToInt32((refund * 100 )) +"</refund_fee>" +
"<op_user_id><![CDATA["+CommonApi.MechID.ToString()+"]]></op_user_id>" +
"</xml>";
string WXRefund = SendInfoWithCa(URL, RequstContext); //調用發送方法

XmlDocument doc = new XmlDocument();
doc.LoadXml(WXRefund);
XmlElement rootElement = doc.DocumentElement;
string Code = rootElement.SelectSingleNode("return_code").InnerText; //協議級判斷
if (Code == "SUCCESS") //協議級驗證
{
string result_code = rootElement.SelectSingleNode("result_code").InnerText;
if (result_code == "SUCCESS")//業務級驗證
{
return true;
}
else
{
returnMsg = "出現未知的錯誤,請聯絡管理員!";
return false;
}
}
else
{
returnMsg = "出現未知的錯誤,請聯絡管理員!";
return false;
}
}
/// <summary>
/// 產生隨機字串
/// </summary>
/// <param name="codeCount"></param>
/// <param name="allChar"></param>
/// <returns></returns>
public static string CreateRandomCode(int codeCount)
{
//驗證碼中的出現的字元,避免了一些容易混淆的字元。
string allChar = "3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,M,N,P,Q,R,S,T,U,W,X,Y";
string[] allCharArray = allChar.Split(‘,‘);
string randomCode = "";
int temp = -1;
bool breCreate = (codeCount < 6 && allCharArray.Length > 15);

Random rand = new Random();
for (int i = 0; i < codeCount; i++)
{
if (temp != -1)
{
rand = new Random(i * temp * ((int)DateTime.Now.Ticks));
}
int t = rand.Next(allCharArray.Length);
if (temp == t && breCreate)
{
return CreateRandomCode(codeCount);
}
temp = t;
randomCode += allCharArray[t];
}
return randomCode;
}
#region 向伺服器發送資訊通過認證認證
/// <summary>
/// 向伺服器發送資訊通過認證認證
/// </summary>
/// <param name="posturl">請求路徑</param>
/// <param name="postData">請求參數</param>
/// <returns>返回資訊</returns>
public string SendInfoWithCa(string posturl, string postData)
{
Stream outstream = null;
Stream instream = null;
StreamReader sr = null;
HttpWebResponse response = null;
HttpWebRequest request = null;
Encoding encoding = Encoding.UTF8;
byte[] data = encoding.GetBytes(postData);
// 準備請求...
try
{
string cert = @"D:\***\**\apiclient_cert.p12"; //憑證路徑(此認證必須安裝)
string password = "***"; //認證密碼
ServicePointManager.ServerCertificateValidationCallback=new RemoteCertificateValidationCallback(CheckValidationResult);
X509Certificate cer = new X509Certificate(cert, password);
// 設定參數
request = WebRequest.Create(posturl) as HttpWebRequest;
request.ClientCertificates.Add(cer);
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
outstream = request.GetRequestStream();
outstream.Write(data, 0, data.Length);
outstream.Close();
//發送請求並擷取相應回應資料
request.KeepAlive = false;
response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程式才開始向目標網頁發送Post請求
instream = response.GetResponseStream();
sr = new StreamReader(instream, encoding);
//返回結果網頁(html)代碼
string content = sr.ReadToEnd();
string err = string.Empty;
return content;
}
catch (Exception ex)
{
T9.Util.LogUtil.WriteLog(ex.Message + "\r\n" + ex.StackTrace, "WebLog");
return string.Empty;
}
}
#region CheckValidationResult的定義
/// <summary>
/// CheckValidationResult的定義
/// </summary>
/// <param name="sender"></param>
/// <param name="certificate"></param>
/// <param name="chain"></param>
/// <param name="errors"></param>
/// <returns></returns>
private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
if (errors == SslPolicyErrors.None)
{
return true;
}
return false;
}

C# 微支付退款申請介面 V3.3.6

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.