Beispiel #1
0
        /// <summary>
        /// 微信退支付申请接口结果
        /// </summary>
        /// <param name="xml">xml</param>
        /// <returns>微信退支付申请接口结果</returns>
        public static RefundPayResult ConvertToRefundPayResult(string xml)
        {
            RefundPayResult refundPayResult = new RefundPayResult();
            XElement        doc             = XElement.Parse(xml);

            if (doc.Element("return_code").GetString() == "SUCCESS")
            {
                if (doc.Element("result_code").GetString() == "SUCCESS")
                {
                    refundPayResult.IsSuccess     = true;
                    refundPayResult.TransactionId = doc.Element("transaction_id").GetString();
                    refundPayResult.OutTradeNo    = doc.Element("out_trade_no").GetString();
                    refundPayResult.OutRefundNo   = doc.Element("out_refund_no").GetString();
                    refundPayResult.RefundId      = doc.Element("refund_id").GetString();
                    refundPayResult.RefundFee     = doc.Element("refund_fee").GetInt();
                }
                else
                {
                    refundPayResult.IsSuccess = false;
                    refundPayResult.Message   = doc.Element("err_code_des").GetString();
                }
            }
            else
            {
                refundPayResult.IsSuccess = false;
                refundPayResult.Message   = doc.Element("return_msg").GetString();
            }
            return(refundPayResult);
        }
Beispiel #2
0
 public ServiceRequestResult RefundPay(RefundPay request, out RefundPayResult result)
 {
     return(ServiceRequest(EventNames.Pay_Refund, request, out result));
 }
Beispiel #3
0
        /// <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);
        }