初始提交
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Hncore.Pass.PaymentCenter.WeiFuTong.Refund
|
||||
{
|
||||
/// <summary>
|
||||
/// 威富通退款查询请求
|
||||
/// </summary>
|
||||
[XmlRoot("xml", Namespace = "")]
|
||||
public class WeiFuTongRefundQueryRequest : WeiFuTongRequestBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 商户系统内部的订单号, out_trade_no和transaction_id至少一个必填,同时存在时transaction_id优先
|
||||
/// </summary>
|
||||
[XmlElement("out_trade_no")]
|
||||
public string OutTradeNo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 可传入平台订单号或第三方商户单号(third_order_no), out_trade_no和transaction_id至少一个必填,同时存在时transaction_id优先
|
||||
/// </summary>
|
||||
[XmlElement("transaction_id")]
|
||||
public string TransactionId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 商户退款单号,32个字符内、可包含字母,确保在商户系统唯一。
|
||||
/// </summary>
|
||||
[XmlElement("out_refund_no")]
|
||||
public string OutRefundNo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 平台退款单号refund_id、out_refund_no、out_trade_no 、transaction_id 四个参数必填一个, 如果同时存在优先级为:refund_id>out_refund_no>transaction_id>out_trade_no
|
||||
/// </summary>
|
||||
[XmlElement("refund_id")]
|
||||
public string RefundId { get; set; }
|
||||
|
||||
public WeiFuTongRefundQueryRequest() : base("unified.trade.refundquery")
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,168 @@
|
||||
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; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Hncore.Pass.PaymentCenter.WeiFuTong.Refund
|
||||
{
|
||||
/// <summary>
|
||||
/// 威富通退款请求
|
||||
/// </summary>
|
||||
public class WeiFuTongRefundRequest : WeiFuTongRequestBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 商户系统内部的订单号, out_trade_no和transaction_id至少一个必填,同时存在时transaction_id优先
|
||||
/// </summary>
|
||||
[XmlElement("out_trade_no")]
|
||||
public string OutTradeNo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 可传入平台订单号或第三方商户单号(third_order_no), out_trade_no和transaction_id至少一个必填,同时存在时transaction_id优先
|
||||
/// </summary>
|
||||
[XmlElement("transaction_id")]
|
||||
public string TransactionId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 商户退款单号,32个字符内、可包含字母,确保在商户系统唯一。同个退款单号多次请求,平台当一个单处理,只会退一次款。如果出现退款不成功,请采用原退款单号重新发起,避免出现重复退款。
|
||||
/// </summary>
|
||||
[XmlElement("out_refund_no")]
|
||||
public string OutRefundNo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 订单总金额,单位为分
|
||||
/// </summary>
|
||||
[XmlElement("total_fee")]
|
||||
public int OrderTotalFee { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 退款总金额,单位为分,可以做部分退款
|
||||
/// </summary>
|
||||
[XmlElement("refund_fee")]
|
||||
public int RefundFee { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 操作员帐号,默认为商户号
|
||||
/// </summary>
|
||||
[XmlElement("op_user_id")]
|
||||
public string OpUserId => MchId;
|
||||
|
||||
/// <summary>
|
||||
/// 退款渠道ORIGINAL-原路退款,默认
|
||||
/// </summary>
|
||||
[XmlElement("refund_channel")]
|
||||
public string RefundChannel => "ORIGINAL";
|
||||
|
||||
public WeiFuTongRefundRequest() : base("unified.trade.refund")
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Hncore.Pass.PaymentCenter.WeiFuTong.Refund
|
||||
{
|
||||
/// <summary>
|
||||
/// 威富通退款响应
|
||||
/// </summary>
|
||||
[XmlRoot("xml", Namespace = "")]
|
||||
public class WeiFuTongRefundResponse : 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("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; }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user