接口地址
接口鏈接:https://api.mch.weixin.qq.com/secapi/pay/refund
是否需要證書
請求需要雙向證書。
請求參數
| 字段名 |
變量名 |
必填 |
類型 |
示例值 |
描述 |
|---|---|---|---|---|---|
| 公眾賬號ID |
appid |
是 |
String(32) |
wx8888888888888888 |
微信分配的公眾賬號ID |
| 商戶號 |
mch_id |
是 |
String(32) |
1900000109 |
微信支付分配的商戶號 |
| 設備號 |
device_info |
否 |
String(32) |
013467007045764 |
終端設備號 |
| 隨機字符串 |
nonce_str |
是 |
String(32) |
5K8264ILTKCH16CQ2502SI8ZNMTM67VS |
隨機字符串,不長於32位。推薦隨機數生成算法 |
| 簽名 |
sign |
是 |
String(32) |
C380BEC2BFD727A4B6845133519F3AD6 |
簽名,詳見簽名生成算法 |
| 微信訂單號 |
transaction_id |
是 |
String(28) |
1217752501201407033233368018 |
微信訂單號 |
| 商戶訂單號 |
out_trade_no |
是 |
String(32) |
1217752501201407033233368018 |
商戶系統內部的訂單號, transaction_id、out_trade_no二選一,如果同時存在優先級:transaction_id> out_trade_no |
| 商戶退款單號 |
out_refund_no |
是 |
String(32) |
1217752501201407033233368018 |
商戶系統內部的退款單號,商戶系統內部唯一,同一退款單號多次請求只退一筆 |
| 總金額 |
total_fee |
是 |
Int |
100 |
訂單總金額,單位為分,只能為整數,詳見支付金額 |
| 退款金額 |
refund_fee |
是 |
Int |
100 |
退款總金額,訂單總金額,單位為分,只能為整數,詳見支付金額 |
| 貨幣種類 |
refund_fee_type |
否 |
String(8) |
CNY |
貨幣類型,符合ISO 4217標准的三位字母代碼,默認人民幣:CNY,其他值列表詳見貨幣類型 |
| 操作員 |
op_user_id |
是 |
String(32) |
1900000109 |
操作員帳號, 默認為商戶號 |
返回結果
| 字段名 |
變量名 |
必填 |
類型 |
示例值 |
描述 |
|---|---|---|---|---|---|
| 返回狀態碼 |
return_code |
是 |
String(16) |
SUCCESS |
SUCCESS/FAIL |
| 返回信息 |
return_msg |
否 |
String(128) |
簽名失敗
|
返回信息,如非空,為錯誤原因 簽名失敗 參數格式校驗錯誤 |
以下字段在return_code為SUCCESS的時候有返回
| 字段名 |
變量名 |
必填 |
類型 |
示例值 |
描述 |
|---|---|---|---|---|---|
| 業務結果 |
result_code |
是 |
String(16) |
SUCCESS |
SUCCESS/FAIL SUCCESS退款申請接收成功,結果通過退款查詢接口查詢 FAIL 提交業務失敗 |
| 錯誤代碼 |
err_code |
否 |
String(32) |
SYSTEMERROR |
列表詳見第6節 |
| 錯誤代碼描述 |
err_code_des |
否 |
String(128) |
系統超時 |
結果信息描述 |
| 公眾賬號ID |
appid |
是 |
String(32) |
wx8888888888888888 |
微信分配的公眾賬號ID |
| 商戶號 |
mch_id |
是 |
String(32) |
1900000109 |
微信支付分配的商戶號 |
| 設備號 |
device_info |
否 |
String(32) |
013467007045764 |
微信支付分配的終端設備號,與下單一致 |
| 隨機字符串 |
nonce_str |
是 |
String(32) |
5K8264ILTKCH16CQ2502SI8ZNMTM67VS |
隨機字符串,不長於32位 |
| 簽名 |
sign |
是 |
String(32) |
5K8264ILTKCH16CQ2502SI8ZNMTM67VS |
簽名,詳見簽名算法 |
| 微信訂單號 |
transaction_id |
是 |
String(28) |
1217752501201407033233368018 |
微信訂單號 |
| 商戶訂單號 |
out_trade_no |
是 |
String(32) |
1217752501201407033233368018 |
商戶系統內部的訂單號 |
| 商戶退款單號 |
out_refund_no |
是 |
String(32) |
1217752501201407033233368018 |
商戶退款單號 |
| 微信退款單號 |
refund_id |
是 |
String(28) |
1217752501201407033233368018 |
微信退款單號 |
| 退款渠道 |
refund_channel |
否 |
String(16) |
ORIGINAL |
ORIGINAL—原路退款 BALANCE—退回到余額 |
| 退款金額 |
refund_fee |
是 |
Int |
100 |
退款總金額,單位為分,可以做部分退款 |
| 訂單總金額 |
total_fee |
是 |
Int |
100 |
訂單總金額,單位為分,只能為整數,詳見支付金額 |
| 訂單金額貨幣種類 |
fee_type |
否 |
String(8) |
CNY |
訂單金額貨幣類型,符合ISO 4217標准的三位字母代碼,默認人民幣:CNY,其他值列表詳見貨幣類型 |
| 現金支付金額 |
cash_fee |
是 |
Int |
100 |
現金支付金額,單位為分,只能為整數,詳見支付金額 |
| 現金退款金額 |
cash_refund_fee |
否 |
Int |
100 |
現金退款金額,單位為分,只能為整數,詳見支付金額 |
| 代金券或立減優惠退款金額 |
coupon_refund_fee |
否 |
Int |
100 |
代金券或立減優惠退款金額=訂單金額-現金退款金額,注意:立減優惠金額不會退回 |
| 代金券或立減優惠使用數量 |
coupon_refund_count |
否 |
Int |
1 |
代金券或立減優惠使用數量 |
| 代金券或立減優惠ID |
coupon_refund_id |
否 |
String(20) |
10000 |
代金券或立減優惠ID |
后台代碼:
/// <summary> /// 退款申請接口 /// </summary> /// <returns></returns> public JsonResult Refund(TRADE_Model trade) { string nonceStr = Senparc.Weixin.MP.TenPayLibV3.TenPayV3Util.GetNoncestr(); Senparc.Weixin.MP.TenPayLibV3.RequestHandler packageReqHandler = new Senparc.Weixin.MP.TenPayLibV3.RequestHandler(null); //設置package訂單參數 packageReqHandler.SetParameter("appid", AppId); //公眾賬號ID packageReqHandler.SetParameter("mch_id", MchId); //商戶號 packageReqHandler.SetParameter("out_trade_no", trade.TRADE_NO); //填入商家訂單號 packageReqHandler.SetParameter("out_refund_no", ""); //填入退款訂單號 packageReqHandler.SetParameter("total_fee", ""); //填入總金額 packageReqHandler.SetParameter("refund_fee", ""); //填入退款金額 packageReqHandler.SetParameter("op_user_id", MchId); //操作員Id,默認就是商戶號 packageReqHandler.SetParameter("nonce_str", nonceStr); //隨機字符串 string sign = packageReqHandler.CreateMd5Sign("key", Key); packageReqHandler.SetParameter("sign", sign); //簽名 //退款需要post的數據 string data = packageReqHandler.ParseXML(); //退款接口地址 string url = "https://api.mch.weixin.qq.com/secapi/pay/refund"; //本地或者服務器的證書位置(證書在微信支付申請成功發來的通知郵件中) string cert = @"D:\apiclient_cert.p12"; //私鑰(在安裝證書時設置) string password = ""; ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); //調用證書 X509Certificate2 cer = new X509Certificate2(cert, password, X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet); #region 發起post請求 HttpWebRequest webrequest = (HttpWebRequest)HttpWebRequest.Create(url); webrequest.ClientCertificates.Add(cer); webrequest.Method = "post"; byte[] postdatabyte = Encoding.UTF8.GetBytes(data); webrequest.ContentLength = postdatabyte.Length; Stream stream; stream = webrequest.GetRequestStream(); stream.Write(postdatabyte, 0, postdatabyte.Length); stream.Close(); HttpWebResponse httpWebResponse = (HttpWebResponse)webrequest.GetResponse(); StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream()); string responseContent = streamReader.ReadToEnd(); #endregion var res = System.Xml.Linq.XDocument.Parse(responseContent); string return_code = res.Element("xml").Element("return_code").Value; Hashtable hashtable = new Hashtable(); hashtable.Add("return_code", return_code); return Json(hashtable); }
private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
if (errors == SslPolicyErrors.None)
return true;
return false;
}
