168 lines
5.4 KiB
C#
168 lines
5.4 KiB
C#
|
|
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
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// 威富通退款查询响应
|
|||
|
|
/// </summary>
|
|||
|
|
[XmlRoot("xml", Namespace = "")]
|
|||
|
|
public class WeiFuTongRefundQueryResponse : WeiFuTongResponseBase
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// 平台交易号
|
|||
|
|
/// </summary>
|
|||
|
|
[XmlElement("transaction_id")]
|
|||
|
|
public string TransactionId { get; set; }
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 商户系统内部的订单号
|
|||
|
|
/// </summary>
|
|||
|
|
[XmlElement("out_trade_no")]
|
|||
|
|
public string OutTradeNo { get; set; }
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 退款记录数
|
|||
|
|
/// </summary>
|
|||
|
|
[XmlElement("refund_count")]
|
|||
|
|
public int RefundCount { get; set; }
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 多笔退款详情
|
|||
|
|
/// </summary>
|
|||
|
|
public List<RefundQueryItem> RefundQueryItems { get; set; } = new List<RefundQueryItem>();
|
|||
|
|
|
|||
|
|
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;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 是否是退款成功
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public bool IsRefundSuccess()
|
|||
|
|
{
|
|||
|
|
return !HasError()
|
|||
|
|
&& RefundQueryItems.Any()
|
|||
|
|
&& RefundQueryItems.First().RefundStatus == "SUCCESS";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 是否是退款失败
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public bool IsRefundFail()
|
|||
|
|
{
|
|||
|
|
return !HasError()
|
|||
|
|
&& RefundQueryItems.Any()
|
|||
|
|
&& RefundQueryItems.First().RefundStatus == "FAIL";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 是否是已撤销
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public bool IsCancel()
|
|||
|
|
{
|
|||
|
|
return RefundCount == 0
|
|||
|
|
&& ErrCode == "REFUND_FAIL"
|
|||
|
|
&& ErrMsg.Contains("已撤销");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 退款不存在
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
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
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// 商户退款单号
|
|||
|
|
/// </summary>
|
|||
|
|
[XmlElement("out_refund_no")]
|
|||
|
|
public string OutRefundNo { get; set; }
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 平台退款单号
|
|||
|
|
/// </summary>
|
|||
|
|
[XmlElement("refund_id")]
|
|||
|
|
public string RefundId { get; set; }
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 退款渠道 ORIGINAL—原路退款,默认
|
|||
|
|
/// </summary>
|
|||
|
|
[XmlElement("refund_channel")]
|
|||
|
|
public string RefundChannel { get; set; }
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 退款总金额,单位为分,可以做部分退款
|
|||
|
|
/// </summary>
|
|||
|
|
[XmlElement("refund_fee")]
|
|||
|
|
public int RefundFee { get; set; }
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 退款时间 yyyyMMddHHmmss
|
|||
|
|
/// </summary>
|
|||
|
|
[XmlElement("refund_time")]
|
|||
|
|
public string RefundTime { get; set; }
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// SUCCESS—退款成功
|
|||
|
|
/// FAIL—退款失败
|
|||
|
|
/// PROCESSING—退款处理中
|
|||
|
|
/// NOTSURE—未确定, 需要商户原退款单号重新发起
|
|||
|
|
/// CHANGE—转入代发,退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,资金回流到商户的现金帐号,需要商户人工干预,通过线下或者平台转账的方式进行退款。
|
|||
|
|
/// </summary>
|
|||
|
|
[XmlElement("refund_status")]
|
|||
|
|
public string RefundStatus { get; set; }
|
|||
|
|
}
|
|||
|
|
}
|