接口地址
接口链接: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;
}