微信支付之退款步骤详解
先吐槽下微信的文檔和demo,重要的步驟信息沒有強調(diào)清楚,.net的demo就沒有跑成功過。
1.微信掃碼登錄
2.微信PC端支付
幾經(jīng)摸索才走通這個退款功能。下面介紹下微信支付退款功能的開發(fā)步驟:
一、下載證書并導入到系統(tǒng)
微信退款是需要證書的,這個證書不是官方demo中的證書,而是需要自己在微信商戶平臺中的api安全欄下載的證書,在官方的證書使用實例的一個word文檔看到下面話:C#有一點需要注意,除了在代碼中使用apiclient_cert.p12之外還需要將該證書導入操作系統(tǒng)才能使用,1、代碼中使用、;2、導入操作系統(tǒng),二者缺一不可。.NET版本需要大于2.0 之前就是不知道這兩步,浪費了太多時間。所以先下載證書:
下載的時候需要手機驗證及登錄密碼。下載后找到apiclient_cert.p12這個證書,雙擊導入,導入的時候提示輸入密碼,這個密碼就是商戶ID,且必須是在自己的商戶平臺下載的證書。否則會出現(xiàn)密碼錯誤的提示:
導入正確的提示:
二、代碼退款
這個地方可以直接用官方demo中的代碼,demo下載
需要修改WxPayConfig中的幾個參數(shù):
public const string APPID = "wxf6dd794bcexxxx"; public const string MCHID = "xxxx"; public const string KEY = "xxxxx849ba56abbe56e05xxxxx"; public const string APPSECRET = "---"; //=======【證書路徑設置】=====================================
/* 證書路徑,注意應該填寫絕對路徑(僅退款、撤銷訂單時需要) */
public const string SSLCERT_PATH = "/WxPayAPI/cert/apiclient_cert.p12"; public const string SSLCERT_PASSWORD = "131xxxx";
登錄后復制
上面的SSLCERT_PASSWORD就是MCHID,也就是商戶ID,SSLCERT_PASSWORD錯誤會出現(xiàn)指定的網(wǎng)絡密碼不正確的提示:
接下來在控制器中增加一個退款方法,包含微信訂單號、商戶訂單號、總金額和退款金額。商戶訂單號和微信訂單號二選一。詳細參數(shù)
public ActionResult DoRefund()
{ string result = Refund.Run("","131667780120trade_no", "1", "1"); return Content(result);
}
登錄后復制
Refund類的Run方法:
/***
* 申請退款完整業(yè)務流程邏輯
* @param transaction_id 微信訂單號(優(yōu)先使用)
* @param out_trade_no 商戶訂單號
* @param total_fee 訂單總金額
* @param refund_fee 退款金額
* @return 退款結果(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))//微信訂單號存在的條件下,則已微信訂單號為準 {
data.SetValue("transaction_id", transaction_id);
} else//微信訂單號不存在,才根據(jù)商戶訂單號去退款 {
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);//隨機生成商戶退款單號
data.SetValue("op_user_id", WxPayConfig.MCHID);//操作員,默認為商戶號
WxPayData result = WxPayApi.Refund(data);//提交退款申請給API,接收返回數(shù)據(jù)
Logger.Info("Refund process complete, result : " + result.ToXml()); return result.ToPrintStr();
}
登錄后復制
Refund:方法
/**
*
* 申請退款
* @param WxPayData inputObj 提交給申請退款API的參數(shù)
* @param int timeOut 超時時間
* @throws WxPayException
* @return 成功時返回接口調(diào)用結果,其他拋異常 */
public static WxPayData Refund(WxPayData inputObj, int timeOut = 6)
{ string url = "https://api.mch.weixin.qq.com/secapi/pay/refund"; //檢測必填參數(shù)
if (!inputObj.IsSet("out_trade_no") && !inputObj.IsSet("transaction_id"))
{ throw new WxPayException("退款申請接口中,out_trade_no、transaction_id至少填一個!");
} else if (!inputObj.IsSet("out_refund_no"))
{ throw new WxPayException("退款申請接口中,缺少必填參數(shù)out_refund_no!");
} else if (!inputObj.IsSet("total_fee"))
{ throw new WxPayException("退款申請接口中,缺少必填參數(shù)total_fee!");
} else if (!inputObj.IsSet("refund_fee"))
{ throw new WxPayException("退款申請接口中,缺少必填參數(shù)refund_fee!");
} else if (!inputObj.IsSet("op_user_id"))
{ throw new WxPayException("退款申請接口中,缺少必填參數(shù)op_user_id!");
}
inputObj.SetValue("appid", WxPayConfig.APPID);//公眾賬號ID
inputObj.SetValue("mch_id", WxPayConfig.MCHID);//商戶號
inputObj.SetValue("nonce_str", Guid.NewGuid().ToString().Replace("-", ""));//隨機字符串
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);//獲得接口耗時 //將xml格式的結果轉(zhuǎn)換為對象以返回
WxPayData result = new WxPayData();
result.FromXml(response);
ReportCostTime(url, timeCost, result);//測速上報
return result;
}
登錄后復制
生產(chǎn)環(huán)境中記得修改成自己的參數(shù)。如果參數(shù)都正確,將會返回:
而且,微信馬上回收到退款通知:
小結:至此,退款功能已經(jīng)走通,其實如果參數(shù)和流程對了,這個地方還是很簡單的,微信的規(guī)定是可以申請一年內(nèi)交易的退款。但是又有個問題,虛擬空間中怎么導入證書呢,還是要換云?
以上就是微信支付之退款步驟詳解的詳細內(nèi)容,更多請關注風君子博客其它相關文章!
總結
以上是生活随笔為你收集整理的微信支付之退款步骤详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux解压zip文件命令介绍(Lin
- 下一篇: python面向对象三大基本特性_pyt