微信JSAPI支付 申請退款 介面地址 介面鏈接:https://api.mch.weixin.qq.com/secapi/pay/refund 是否需要證書 請求需要雙向證書。 詳見證書使用 請求參數 欄位名變數名必填類型示例值描述 公眾賬號ID appid 是 String(32) wx8888 ...
微信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; }
註意:
如果報:基本賬戶餘額不足,請充值後重新發起 ,那就是基本賬戶餘額不足, 充個一塊錢就好了