初始提交

This commit is contained in:
wanyongkang
2020-10-07 20:25:03 +08:00
commit d318014316
3809 changed files with 263103 additions and 0 deletions

View File

@@ -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")
{
}
}
}

View File

@@ -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; }
}
}

View File

@@ -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")
{
}
}
}

View File

@@ -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; }
}
}