溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何實(shí)現(xiàn)微信支付退款功能

發(fā)布時(shí)間:2021-09-14 10:20:55 來(lái)源:億速云 閱讀:172 作者:小新 欄目:移動(dòng)開(kāi)發(fā)

這篇文章主要為大家展示了“如何實(shí)現(xiàn)微信支付退款功能”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“如何實(shí)現(xiàn)微信支付退款功能”這篇文章吧。

一、下載證書(shū)并導(dǎo)入到系統(tǒng)

微信退款是需要證書(shū)的,這個(gè)證書(shū)不是官方demo中的證書(shū),而是需要自己在微信商戶平臺(tái)中的api安全欄下載的證書(shū),在官方的證書(shū)使用實(shí)例的一個(gè)word文檔看到下面話:C#有一點(diǎn)需要注意,除了在代碼中使用apiclient_cert.p12之外還需要將該證書(shū)導(dǎo)入操作系統(tǒng)才能使用,1、代碼中使用、;2、導(dǎo)入操作系統(tǒng),二者缺一不可。.NET版本需要大于2.0  之前就是不知道這兩步,浪費(fèi)了太多時(shí)間。所以先下載證書(shū):

如何實(shí)現(xiàn)微信支付退款功能

下載的時(shí)候需要手機(jī)驗(yàn)證及登錄密碼。下載后找到apiclient_cert.p12這個(gè)證書(shū),雙擊導(dǎo)入,導(dǎo)入的時(shí)候提示輸入密碼,這個(gè)密碼就是商戶ID,且必須是在自己的商戶平臺(tái)下載的證書(shū)。否則會(huì)出現(xiàn)密碼錯(cuò)誤的提示:

如何實(shí)現(xiàn)微信支付退款功能

導(dǎo)入正確的提示:

如何實(shí)現(xiàn)微信支付退款功能

二、代碼退款

這個(gè)地方可以直接用官方demo中的代碼,demo下載

需要修改WxPayConfig中的幾個(gè)參數(shù):

      public const string APPID = "wxf6dd794bcexxxx";        public const string MCHID = "xxxx";        public const string KEY = "xxxxx849ba56abbe56e05xxxxx";        public const string APPSECRET = "---";        //=======【證書(shū)路徑設(shè)置】===================================== 
        /* 證書(shū)路徑,注意應(yīng)該填寫(xiě)絕對(duì)路徑(僅退款、撤銷訂單時(shí)需要)        */
        public const string SSLCERT_PATH = "/WxPayAPI/cert/apiclient_cert.p12";        public const string SSLCERT_PASSWORD = "131xxxx";

上面的SSLCERT_PASSWORD就是MCHID,也就是商戶ID,SSLCERT_PASSWORD錯(cuò)誤會(huì)出現(xiàn)指定的網(wǎng)絡(luò)密碼不正確的提示:

如何實(shí)現(xiàn)微信支付退款功能

接下來(lái)在控制器中增加一個(gè)退款方法,包含微信訂單號(hào)、商戶訂單號(hào)、總金額和退款金額。商戶訂單號(hào)和微信訂單號(hào)二選一。詳細(xì)參數(shù)

  public ActionResult DoRefund()
        {            string result = Refund.Run("","131667780120trade_no", "1", "1");            return Content(result);
        }

Refund類的Run方法:

 /***
        * 申請(qǐng)退款完整業(yè)務(wù)流程邏輯
        * @param transaction_id 微信訂單號(hào)(優(yōu)先使用)
        * @param out_trade_no 商戶訂單號(hào)
        * @param total_fee 訂單總金額
        * @param refund_fee 退款金額
        * @return 退款結(jié)果(xml格式)        */
        public static string Run(string transaction_id, string out_trade_no, string total_fee, string refund_fee)
        {
            Logger.Info("Refund is processing...");

            WxPayData data = new WxPayData();            if (!string.IsNullOrEmpty(transaction_id))//微信訂單號(hào)存在的條件下,則已微信訂單號(hào)為準(zhǔn)            {
                data.SetValue("transaction_id", transaction_id);
            }            else//微信訂單號(hào)不存在,才根據(jù)商戶訂單號(hào)去退款            {
                data.SetValue("out_trade_no", out_trade_no);
            }

            data.SetValue("total_fee", int.Parse(total_fee));//訂單總金額
            data.SetValue("refund_fee", int.Parse(refund_fee));//退款金額
            data.SetValue("out_refund_no", out_trade_no);//隨機(jī)生成商戶退款單號(hào)
            data.SetValue("op_user_id", WxPayConfig.MCHID);//操作員,默認(rèn)為商戶號(hào)
            WxPayData result = WxPayApi.Refund(data);//提交退款申請(qǐng)給API,接收返回?cái)?shù)據(jù)
            Logger.Info("Refund process complete, result : " + result.ToXml());            return result.ToPrintStr();
        }

Refund:方法

 /**
        * 
        * 申請(qǐng)退款
        * @param WxPayData inputObj 提交給申請(qǐng)退款A(yù)PI的參數(shù)
        * @param int timeOut 超時(shí)時(shí)間
        * @throws WxPayException
        * @return 成功時(shí)返回接口調(diào)用結(jié)果,其他拋異常        */
        public static WxPayData Refund(WxPayData inputObj, int timeOut = 6)
        {            string url = "https://api.mch.weixin.qq.com/secapi/pay/refund";            //檢測(cè)必填參數(shù)
            if (!inputObj.IsSet("out_trade_no") && !inputObj.IsSet("transaction_id"))
            {                throw new WxPayException("退款申請(qǐng)接口中,out_trade_no、transaction_id至少填一個(gè)!");
            }            else if (!inputObj.IsSet("out_refund_no"))
            {                throw new WxPayException("退款申請(qǐng)接口中,缺少必填參數(shù)out_refund_no!");
            }            else if (!inputObj.IsSet("total_fee"))
            {                throw new WxPayException("退款申請(qǐng)接口中,缺少必填參數(shù)total_fee!");
            }            else if (!inputObj.IsSet("refund_fee"))
            {                throw new WxPayException("退款申請(qǐng)接口中,缺少必填參數(shù)refund_fee!");
            }            else if (!inputObj.IsSet("op_user_id"))
            {                throw new WxPayException("退款申請(qǐng)接口中,缺少必填參數(shù)op_user_id!");
            }

            inputObj.SetValue("appid", WxPayConfig.APPID);//公眾賬號(hào)ID
            inputObj.SetValue("mch_id", WxPayConfig.MCHID);//商戶號(hào)
            inputObj.SetValue("nonce_str", Guid.NewGuid().ToString().Replace("-", ""));//隨機(jī)字符串
            inputObj.SetValue("sign", inputObj.MakeSign());//簽名
            
            string xml = inputObj.ToXml();            var start = DateTime.Now;

            Log.Debug("WxPayApi", "Refund request : " + xml);            string response = HttpService.Post(xml, url, true, timeOut);//調(diào)用HTTP通信接口提交數(shù)據(jù)到API
            Log.Debug("WxPayApi", "Refund response : " + response);            var end = DateTime.Now;            int timeCost = (int)((end - start).TotalMilliseconds);//獲得接口耗時(shí)            //將xml格式的結(jié)果轉(zhuǎn)換為對(duì)象以返回
            WxPayData result = new WxPayData();
            result.FromXml(response);

            ReportCostTime(url, timeCost, result);//測(cè)速上報(bào)
            return result;
        }

生產(chǎn)環(huán)境中記得修改成自己的參數(shù)。如果參數(shù)都正確,將會(huì)返回:

如何實(shí)現(xiàn)微信支付退款功能

而且,微信馬上回收到退款通知:

如何實(shí)現(xiàn)微信支付退款功能

以上是“如何實(shí)現(xiàn)微信支付退款功能”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI