using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Xml;
using System.Xml.Serialization;
using Hncore.Infrastructure.Extension;
namespace Hncore.Pass.PaymentCenter.WeiFuTong.Refund
{
///
/// 威富通退款查询响应
///
[XmlRoot("xml", Namespace = "")]
public class WeiFuTongRefundQueryResponse : WeiFuTongResponseBase
{
///
/// 平台交易号
///
[XmlElement("transaction_id")]
public string TransactionId { get; set; }
///
/// 商户系统内部的订单号
///
[XmlElement("out_trade_no")]
public string OutTradeNo { get; set; }
///
/// 退款记录数
///
[XmlElement("refund_count")]
public int RefundCount { get; set; }
///
/// 多笔退款详情
///
public List RefundQueryItems { get; set; } = new List();
public WeiFuTongRefundQueryResponse ParseItemsFromXml(string xmlText)
{
if (RefundCount <= 0)
{
return this;
}
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.XmlResolver = null;
xmlDoc.LoadXml(xmlText);
XmlNode root = xmlDoc.SelectSingleNode("xml");
for (int i = 0; i < RefundCount; i++)
{
RefundQueryItems.Add(new RefundQueryItem()
{
OutRefundNo = root.SelectSingleNode("out_refund_no_" + i).InnerText,
RefundId = root.SelectSingleNode("refund_id_" + i).InnerText,
RefundChannel = root.SelectSingleNode("refund_channel_" + i).InnerText,
RefundFee = root.SelectSingleNode("refund_fee_" + i).InnerText.ToInt(),
RefundTime = root.SelectSingleNode("refund_time_" + i).InnerText,
RefundStatus = root.SelectSingleNode("refund_status_" + i).InnerText
});
}
return this;
}
///
/// 是否是退款成功
///
///
public bool IsRefundSuccess()
{
return !HasError()
&& RefundQueryItems.Any()
&& RefundQueryItems.First().RefundStatus == "SUCCESS";
}
///
/// 是否是退款失败
///
///
public bool IsRefundFail()
{
return !HasError()
&& RefundQueryItems.Any()
&& RefundQueryItems.First().RefundStatus == "FAIL";
}
///
/// 是否是已撤销
///
///
public bool IsCancel()
{
return RefundCount == 0
&& ErrCode == "REFUND_FAIL"
&& ErrMsg.Contains("已撤销");
}
///
/// 退款不存在
///
///
public bool IsNotExists()
{
return HasError() &&
(
ErrCode.ToLower().Contains("refund not exists")
|| ErrCode.ToLower().Contains("order not exists")
|| ErrMsg.Contains("退款不存在")
|| ErrMsg.Contains("订单不存在")
);
}
public DateTime GetRefundSuccessTime()
{
DateTime.TryParseExact(RefundQueryItems.First().RefundTime, "yyyyMMddHHmmss", null, DateTimeStyles.None,
out var paySuccessTime);
return paySuccessTime;
}
}
public class RefundQueryItem
{
///
/// 商户退款单号
///
[XmlElement("out_refund_no")]
public string OutRefundNo { get; set; }
///
/// 平台退款单号
///
[XmlElement("refund_id")]
public string RefundId { get; set; }
///
/// 退款渠道 ORIGINAL—原路退款,默认
///
[XmlElement("refund_channel")]
public string RefundChannel { get; set; }
///
/// 退款总金额,单位为分,可以做部分退款
///
[XmlElement("refund_fee")]
public int RefundFee { get; set; }
///
/// 退款时间 yyyyMMddHHmmss
///
[XmlElement("refund_time")]
public string RefundTime { get; set; }
///
/// SUCCESS—退款成功
/// FAIL—退款失败
/// PROCESSING—退款处理中
/// NOTSURE—未确定, 需要商户原退款单号重新发起
/// CHANGE—转入代发,退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,资金回流到商户的现金帐号,需要商户人工干预,通过线下或者平台转账的方式进行退款。
///
[XmlElement("refund_status")]
public string RefundStatus { get; set; }
}
}