接口連接:https://api.mch.weixin.qq.com/secapi/pay/refundphp
請求須要雙向證書。 詳見證書使用web
字段名 | 變量名 | 必填 | 類型 | 示例值 | 描述 |
---|---|---|---|---|---|
公衆帳號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) | 商品已售完 | 若商戶傳入,會在下發給用戶的退款消息中體現退款緣由api 注意:若訂單退款金額≤1元,且屬於部分退款,則不會在退款消息中體現退款緣由服務器 |
退款資金來源 | refund_account | 否 | String(30) | REFUND_SOURCE_RECHARGE_FUNDS | 僅針對老資金流商戶使用微信 REFUND_SOURCE_UNSETTLED_FUNDS---未結算資金退款(默認使用未結算資金退款)app REFUND_SOURCE_RECHARGE_FUNDS---可用餘額退款異步 |
退款結果通知url | notify_url | 否 | String(256) | https://weixin.qq.com/notify/ | 異步接收微信支付退款結果通知的回調地址,通知URL必須爲外網可訪問的url,不容許帶參數post 若是參數中傳了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; }
注意:
若是報:基本帳戶餘額不足,請充值後從新發起 ,那就是基本帳戶餘額不足, 充個一塊錢就行了