先吐槽下微信的文件和demo,重要的步驟資訊沒有強調清楚,.net的demo就沒有跑成功過。
1.微信掃碼登入
2.微信PC端付款
幾經摸索才走通這個退款功能。以下介紹下微信支付退款功能的開發步驟:
一、下載證書並導入到系統
微信退款是需要證書的,這個證書不是官方demo中的證書,而是需要自己在微信商家平台中的api安全欄下載的證書,在官方的證書使用實例的一個word文檔看到下面話:C#有一點需要注意,除了在程式碼中使用apiclient_cert.p12以外還需要將該憑證導入作業系統才能使用,1、程式碼中使用、;2、導入作業系統,二者缺一不可。 .NET版本要大於2.0 之前就是不知道這兩步,浪費太多時間了。所以先下載憑證:
下載的時候需要手機驗證及登入密碼。下載後找到apiclient_cert.p12這個證書,雙擊導入,導入的時候提示輸入密碼,這個密碼就是商家ID,且必須是在自己的商家平台下載的憑證。否則會出現密碼錯誤的提示:
匯入正確的提示:
##二、程式碼退款 這個地方可以直接用官方demo中的程式碼,demo下載 需要修改WxPayConfig中的幾個參數: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錯誤會出現指定的網路密碼不正確的提示: #接下來在控制器中增加一個退款方法,包含微信訂單號碼、商家訂單號碼、總金額和退款金額。商戶訂單號碼和微信訂單號碼二選一。詳細參數
public ActionResult DoRefund() { string result = Refund.Run("","131667780120trade_no", "1", "1"); return Content(result); }Refund類別的Run方法:
/*** * 申请退款完整业务流程逻辑 * @param transaction_id 微信订单号(优先使用) * @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//微信订单号不存在,才根据商户订单号去退款 { 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,接收返回数据 Logger.Info("Refund process complete, result : " + result.ToXml()); return result.ToPrintStr(); }Refund:方法
/** * * 申请退款 * @param WxPayData inputObj 提交给申请退款API的参数 * @param int timeOut 超时时间 * @throws WxPayException * @return 成功时返回接口调用结果,其他抛异常 */ public static WxPayData Refund(WxPayData inputObj, int timeOut = 6) { string url = "https://api.mch.weixin.qq.com/secapi/pay/refund"; //检测必填参数 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("退款申请接口中,缺少必填参数out_refund_no!"); } else if (!inputObj.IsSet("total_fee")) { throw new WxPayException("退款申请接口中,缺少必填参数total_fee!"); } else if (!inputObj.IsSet("refund_fee")) { throw new WxPayException("退款申请接口中,缺少必填参数refund_fee!"); } else if (!inputObj.IsSet("op_user_id")) { throw new WxPayException("退款申请接口中,缺少必填参数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);//调用HTTP通信接口提交数据到API Log.Debug("WxPayApi", "Refund response : " + response); var end = DateTime.Now; int timeCost = (int)((end - start).TotalMilliseconds);//获得接口耗时 //将xml格式的结果转换为对象以返回 WxPayData result = new WxPayData(); result.FromXml(response); ReportCostTime(url, timeCost, result);//测速上报 return result; }生產環境中記得修改成自己的參數。如果參數都正確,將會回傳: 而且,微信馬上回收退款通知: 小結:至此,退款功能已經走通,其實如果參數和流程對了,這個地方還是很簡單的,微信的規定是可以申請一年內交易的退款。但是又有個問題,虛擬空間怎麼導入憑證呢,還是要換雲?
以上是微信支付退款步驟詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!