微信JSAPI支付 申请退款
接口地址
接口链接:https://api.mch.weixin.qq.com/secapi/pay/refund
请求需要双向证书。 详见证书使用
字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
---|---|---|---|---|---|
公众账号ID | appid | 是 | String(32) | wx8888888888888888 | 微信分配的公众账号ID(企业号corpid即为此appId) |
商户号 | mch_id | 是 | String(32) | 1900000109 | 微信支付分配的商户号 |
随机字符串 | nonce_str | 是 | String(32) | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | 随机字符串,不长于32位。推荐随机数生成算法 |
签名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 签名,详见签名生成算法 |
签名类型 | sign_type | 否 | String(32) | HMAC-SHA256 | 签名类型,目前支持HMAC-SHA256和MD5,默认为MD5 |
微信订单号 | transaction_id | 二选一 | String(32) | 1217752501201407033233368018 | 微信生成的订单号,在支付通知中有返回 |
商户订单号 | out_trade_no | String(32) | 1217752501201407033233368018 | 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一。 transaction_id、out_trade_no二选一,如果同时存在优先级:transaction_id> out_trade_no |
|
商户退款单号 | out_refund_no | 是 | String(64) | 1217752501201407033233368018 | 商户系统内部的退款单号,商户系统内部唯一,只能是数字、大小写字母_-|*@ ,同一退款单号多次请求只退一笔。 |
订单金额 | total_fee | 是 | Int | 100 | 订单总金额,单位为分,只能为整数,详见支付金额 |
退款金额 | refund_fee | 是 | Int | 100 | 退款总金额,订单总金额,单位为分,只能为整数,详见支付金额 |
退款货币种类 | refund_fee_type | 否 | String(8) | CNY | 退款货币类型,需与支付一致,或者不填。符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型 |
退款原因 | refund_desc | 否 | String(80) | 商品已售完 | 若商户传入,会在下发给用户的退款消息中体现退款原因 注意:若订单退款金额≤1元,且属于部分退款,则不会在退款消息中体现退款原因 |
退款资金来源 | refund_account | 否 | String(30) | REFUND_SOURCE_RECHARGE_FUNDS | 仅针对老资金流商户使用 REFUND_SOURCE_UNSETTLED_FUNDS---未结算资金退款(默认使用未结算资金退款) REFUND_SOURCE_RECHARGE_FUNDS---可用余额退款 |
退款结果通知url | notify_url | 否 | String(256) | https://weixin.qq.com/notify/ | 异步接收微信支付退款结果通知的回调地址,通知URL必须为外网可访问的url,不允许带参数 如果参数中传了notify_url,则商户平台上配置的回调地址将不会生效。 |
public string GetWxGZHPayRefund(){ //构造请求参数 RequestHandler packageReqHandler = new RequestHandler(); #region 构造请求参数 packageReqHandler.SetParameter("appid", WxPayConfig.appid);//APPID packageReqHandler.SetParameter("mch_id", WxPayConfig.mchid);//商户号 packageReqHandler.SetParameter("nonce_str", TenPayV3Util.GetNoncestr());//随机串 packageReqHandler.SetParameter("out_refund_no", out_refund_no); packageReqHandler.SetParameter("out_trade_no", out_trade_no);//订单号 packageReqHandler.SetParameter("refund_fee", (int)(Convert.ToDecimal(refund_fee) * 100) + ""); packageReqHandler.SetParameter("total_fee", (int)(Convert.ToDecimal(total_fee) * 100) + ""); //金额,以分为单位 packageReqHandler.SetParameter("transaction_id", transaction_id); packageReqHandler.SetParameter("sign", packageReqHandler.CreateMd5Sign("key", WxPayConfig.key));//商户API密钥(签名) // #endregion //将参数转为xml字符串 string data = packageReqHandler.ParseXML(); //发起post异步请求,获取返回的内容 //本地或者服务器的证书位置(证书在微信支付申请成功发来的通知邮件中) string cert = @"D:\WSHH\apiclient_cert.p12"; //私钥(在安装证书时设置) string password = WxPayConfig.mchid; ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); //调用证书 X509Certificate2 cer = new X509Certificate2(cert, password, X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet); #region 发起post请求 HttpWebRequest webrequest = (HttpWebRequest)HttpWebRequest.Create(WxPayConfig.refund_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 dicResult; } private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { if (errors == SslPolicyErrors.None) return true; return false; }
注意:
如果报:基本账户余额不足,请充值后重新发起 ,那就是基本账户余额不足, 充个一块钱就好了