/// <summary> /// 微信退支付接口 /// </summary> /// <param name="request">请求参数</param> /// <param name="config">config</param> /// <returns>xml</returns> public static string GetRefundPayRequestXml(RefundPayRequest request, Config config) { SortedDictionary <string, string> sParams = new SortedDictionary <string, string> { { "appid", config.GetAppId() }, { "mch_id", config.GetPid() }, { "nonce_str", Config.GetNoncestr() }, { "total_fee", request.TotalFee.ToString() }, { "refund_fee", request.RefundFee.ToString() }, { "out_refund_no", request.OutRefundNo } }; if (!string.IsNullOrWhiteSpace(request.OutTradeNo)) { sParams.Add("out_trade_no", request.OutTradeNo); } else { sParams.Add("transaction_id", request.TransactionId); } if (!string.IsNullOrWhiteSpace(request.RefundDesc)) { sParams.Add("refund_desc", request.RefundDesc); } var sing = Signature.Getsign(sParams, config.GetKey()); sParams.Add("sign", sing); //拼接成XML请求数据 StringBuilder sbPay = new StringBuilder(); foreach (KeyValuePair <string, string> k in sParams) { if (k.Key == "attach" || k.Key == "body" || k.Key == "sign") { sbPay.Append("<" + k.Key + "><![CDATA[" + k.Value + "]]></" + k.Key + ">"); } else { sbPay.Append("<" + k.Key + ">" + k.Value + "</" + k.Key + ">"); } } var return_string = $"<xml>{sbPay}</xml>"; return(return_string); }
/// <summary> /// 退款信息 /// </summary> /// <param name="request">退款参数</param> /// <param name="config">配置</param> /// <returns>退款结果</returns> public static RefundPayResult RefundPay(RefundPayRequest request, Config config) { var result = new RefundPayResult(); var orderqueryResult = OrderQuery(new OrderQueryRequest { OutTradeNo = request.OutTradeNo, TransactionId = request.TransactionId }, config); if (orderqueryResult.TradeState == "SUCCESS" || orderqueryResult.TradeState == "REFUND") { if (request.RefundFee > orderqueryResult.TotalFee) { result.IsSuccess = false; result.Message = "退款金额大于总订单金额"; return(result); } else { // 转入退款的订单先去查询退款金额够不够 if (orderqueryResult.TradeState == "REFUND") { var refundQueryResult = RefundPayQuery(new RefundQueryRequest { OutTradeNo = request.OutTradeNo }, config); if (refundQueryResult.IsSuccess) { // 已退款金额 var oldRefundAmount = refundQueryResult.Details.Sum(item => item.RefundFee); if (request.RefundFee > orderqueryResult.TotalFee - oldRefundAmount) { result.IsSuccess = false; result.Message = "退款金额大于总订单金额"; return(result); } var refundOrder = refundQueryResult.Details.FirstOrDefault(item => item.OutRefundNo == request.OutRefundNo); if (refundOrder != null) { if (refundOrder.RefundStatus == "SUCCESS" || refundOrder.RefundStatus == "PROCESSING") { result.IsSuccess = true; result.TransactionId = orderqueryResult.TransactionId; result.OutTradeNo = request.OutTradeNo; result.OutRefundNo = request.OutRefundNo; result.RefundId = refundOrder.RefundId; result.RefundFee = refundOrder.RefundFee; return(result); } } } else { result.Message = "退款查询失败"; result.IsSuccess = false; return(result); } } request.TotalFee = orderqueryResult.TotalFee; var requestStr = TenpayUtil.GetRefundPayRequestXml(request, config); var response = HttpHelp.PostXmlToUrl(Config.RefundPayUrl, requestStr, config.GetRefundCert(), config.GetPid()); result = TenpayUtil.ConvertToRefundPayResult(response); } } else { result.IsSuccess = false; result.Message = orderqueryResult.Message; } return(result); }