Sfoglia il codice sorgente

实现联合收单接口,未完待续

lcl 5 mesi fa
parent
commit
943428c0fd
39 ha cambiato i file con 3624 aggiunte e 0 eliminazioni
  1. 101 0
      Controllers/UnionPayController.cs
  2. 36 0
      Entity/UnionPay/BusinessLicenseInfo.cs
  3. 61 0
      Entity/UnionPay/ExtraInfoDto.cs
  4. 51 0
      Entity/UnionPay/LegalPersonInfo.cs
  5. 71 0
      Entity/UnionPay/MerchantInfo.cs
  6. 168 0
      Entity/UnionPay/PushData.cs
  7. 116 0
      Entity/UnionPay/SettleAccountInfo.cs
  8. 41 0
      Entity/UnionPay/ShopInfo.cs
  9. 161 0
      Entity/UnionPay/TransactionSettlementQuery.cs
  10. 36 0
      Entity/UnionPay/UnionPayAreaCodeInfo.cs
  11. 31 0
      Entity/UnionPay/UnionPayAreaCodeRequest.cs
  12. 21 0
      Entity/UnionPay/UnionPayBankInfo.cs
  13. 31 0
      Entity/UnionPay/UnionPayBankListRequest.cs
  14. 21 0
      Entity/UnionPay/UnionPayBranchInfo.cs
  15. 41 0
      Entity/UnionPay/UnionPayBranchListRequest.cs
  16. 21 0
      Entity/UnionPay/UnionPayIdCardTypeInfo.cs
  17. 21 0
      Entity/UnionPay/UnionPayIdCardTypesRequest.cs
  18. 41 0
      Entity/UnionPay/UnionPayListTradeDetailRequest.cs
  19. 36 0
      Entity/UnionPay/UnionPayMccInfo.cs
  20. 26 0
      Entity/UnionPay/UnionPayMccListRequest.cs
  21. 16 0
      Entity/UnionPay/UnionPayMerchantDetailRequest.cs
  22. 543 0
      Entity/UnionPay/UnionPayMerchantDetailResponse.cs
  23. 7 0
      Entity/UnionPay/UnionPayMerchantRegister.cs
  24. 56 0
      Entity/UnionPay/UnionPayMerchantRegisterRequest.cs
  25. 26 0
      Entity/UnionPay/UnionPayMerchantRegisterResponse.cs
  26. 31 0
      Entity/UnionPay/UnionPayMerchantReviewCallbackRequest.cs
  27. 75 0
      Entity/UnionPay/UnionPayRequest.cs
  28. 37 0
      Entity/UnionPay/UnionPayResponse.cs
  29. 177 0
      Entity/UnionPay/UnionPaySettlementPushRequest.cs
  30. 130 0
      Entity/UnionPay/UnionPayTradeDetailInfo.cs
  31. 423 0
      Entity/UnionPay/UnionPayUpdateMerchantInfoRequest.cs
  32. 21 0
      Entity/UnionPay/UnionPayUploadPicRequest.cs
  33. 16 0
      Entity/UnionPay/UnionPayUploadPicResponseData.cs
  34. 26 0
      Entity/UnionPay/UserRegistrationInfo.cs
  35. 36 0
      Util/UnionPay/FileItem.cs
  36. 231 0
      Util/UnionPay/UnionPayBase.cs
  37. 251 0
      Util/UnionPay/UnionPayHelper.cs
  38. 243 0
      Util/UnionPay/UnionPayMerchantTradeHelper.cs
  39. 147 0
      Util/UnionPay/UnionPayTradeSettlementHelper.cs

+ 101 - 0
Controllers/UnionPayController.cs

@@ -0,0 +1,101 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Logging;
+using MySystem.Util.UnionPay;
+using MySystem.Entity.UnionPay;
+using Library;
+using LitJson;
+
+namespace MySystem.Controllers
+{
+    /// <summary>
+    /// 联合收单接口控制器
+    /// </summary>
+    [Route("api/[controller]")]
+    [ApiController]
+    public class UnionPayController : ControllerBase
+    {
+        private readonly ILogger<UnionPayController> _logger;
+
+        public UnionPayController(ILogger<UnionPayController> logger)
+        {
+            _logger = logger;
+        }
+
+        /// <summary>
+        /// 商户审核信息回调接口
+        /// </summary>
+        /// <param name="request">包含签名和数据的请求对象</param>
+        /// <returns>回调处理结果</returns>
+        [HttpPost("/api/unionpay/merchant/review/callback")]
+        public IActionResult MerchantReviewCallback([FromBody] Dictionary<string, object> request)
+        {
+            try
+            {
+                _logger.LogInformation("收到商户审核回调请求");
+                
+                // 验证请求包含必要字段
+                if (!request.ContainsKey("sign") || !request.ContainsKey("agentId") || !request.ContainsKey("data"))
+                {
+                    _logger.LogError("回调请求缺少必要字段");
+                    return BadRequest(new { error_code = "400", error_msg = "参数错误", count = 0 });
+                }
+
+                // 解析data字段为UnionPayMerchantReviewCallbackRequest对象
+                var dataJson = Newtonsoft.Json.JsonConvert.SerializeObject(request["data"]);
+                var callbackRequest = Newtonsoft.Json.JsonConvert.DeserializeObject<UnionPayMerchantReviewCallbackRequest>(dataJson);
+
+                if (callbackRequest == null)
+                {
+                    _logger.LogError("解析回调请求数据失败");
+                    return BadRequest(new { error_code = "400", error_msg = "参数错误", count = 0 });
+                }
+
+                // 调用商户审核回调处理方法
+                var response = UnionPayMerchantTradeHelper.Instance.ProcessMerchantReviewCallback(callbackRequest);
+
+                // 返回处理结果
+                return Ok(response);
+            }
+            catch (Exception ex)
+            {
+                _logger.LogError(ex, "处理商户审核回调时发生异常");
+                return StatusCode(500, new { error_code = "9999", error_msg = "系统异常", count = 0 });
+            }
+        }
+
+        /// <summary>
+        /// 交易结算实时推送接口
+        /// </summary>
+        /// <param name="pushRequest">交易结算推送请求对象</param>
+        /// <returns>推送处理结果</returns>
+        [HttpPost("/api/unionpay/settlement/push")]
+        public IActionResult SettlementPush([FromBody] UnionPaySettlementPushRequest pushRequest)
+        {
+            try
+            {
+                _logger.LogInformation("收到交易结算实时推送请求");
+
+                if (pushRequest == null)
+                {
+                    _logger.LogError("推送请求数据为空");
+                    return BadRequest(new { error_code = "400", error_msg = "参数错误", count = 0 });
+                }
+
+                // 调用交易结算推送处理方法
+                var response = UnionPayTradeSettlementHelper.Instance.ProcessSettlementPush(pushRequest);
+
+                // 返回处理结果
+                return Ok(response);
+            }
+            catch (Exception ex)
+            {
+                _logger.LogError(ex, "处理交易结算实时推送时发生异常");
+                return StatusCode(500, new { error_code = "9999", error_msg = "系统异常", count = 0 });
+            }
+        }
+    }
+}

+ 36 - 0
Entity/UnionPay/BusinessLicenseInfo.cs

@@ -0,0 +1,36 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 营业执照信息
+    /// </summary>
+    public class BusinessLicenseInfo
+    {
+        /// <summary>
+        /// 营业执照号
+        /// </summary>
+        public string businessLicenseNo { get; set; }
+
+        /// <summary>
+        /// 营业执照名称
+        /// </summary>
+        public string businessLicenseName { get; set; }
+
+        /// <summary>
+        /// 营业执照开始日期
+        /// </summary>
+        public string businessLicenseStartDate { get; set; }
+
+        /// <summary>
+        /// 营业执照结束日期
+        /// </summary>
+        public string businessLicenseEndDate { get; set; }
+
+        /// <summary>
+        /// 营业执照照片
+        /// </summary>
+        public string businessCreditLicensePic { get; set; }
+    }
+}

+ 61 - 0
Entity/UnionPay/ExtraInfoDto.cs

@@ -0,0 +1,61 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 额外信息
+    /// </summary>
+    public class ExtraInfoDto
+    {
+        /// <summary>
+        /// 公司子类型
+        /// </summary>
+        public int? companyChildType { get; set; }
+
+        /// <summary>
+        /// 承包商执照名称
+        /// </summary>
+        public string contractorLicenseName { get; set; }
+
+        /// <summary>
+        /// 支付业务类型
+        /// </summary>
+        public int? payBusinessType { get; set; }
+
+        /// <summary>
+        /// 承包商商户ID
+        /// </summary>
+        public string contractorMerchantId { get; set; }
+
+        /// <summary>
+        /// 结算到高校账户
+        /// </summary>
+        public string settleToCollegeAccount { get; set; }
+
+        /// <summary>
+        /// 学校许可证
+        /// </summary>
+        public string schoolLicense { get; set; }
+
+        /// <summary>
+        /// 管理员与商户门头合影
+        /// </summary>
+        public string managerWithMerchantDoorPhoto { get; set; }
+
+        /// <summary>
+        /// 合作协议
+        /// </summary>
+        public string cooperationAgreement { get; set; }
+
+        /// <summary>
+        /// 国家网站截图
+        /// </summary>
+        public string contunryWebsiteScreenshot { get; set; }
+
+        /// <summary>
+        /// 其他图片
+        /// </summary>
+        public Dictionary<string, string> otherPics { get; set; }
+    }
+}

+ 51 - 0
Entity/UnionPay/LegalPersonInfo.cs

@@ -0,0 +1,51 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 法人信息
+    /// </summary>
+    public class LegalPersonInfo
+    {
+        /// <summary>
+        /// 法人姓名
+        /// </summary>
+        public string legalPersonName { get; set; }
+
+        /// <summary>
+        /// 证件类型
+        /// </summary>
+        public int certificateType { get; set; }
+
+        /// <summary>
+        /// 证件号码
+        /// </summary>
+        public string certificateNo { get; set; }
+
+        /// <summary>
+        /// 证件开始日期
+        /// </summary>
+        public string certificateStartDate { get; set; }
+
+        /// <summary>
+        /// 证件结束日期
+        /// </summary>
+        public string certificateEndDate { get; set; }
+
+        /// <summary>
+        /// 证件正面照片
+        /// </summary>
+        public string certificatesFrontPic { get; set; }
+
+        /// <summary>
+        /// 证件背面照片
+        /// </summary>
+        public string certificatesBackPic { get; set; }
+
+        /// <summary>
+        /// 身份证手持照片
+        /// </summary>
+        public string idcardHandPic { get; set; }
+    }
+}

+ 71 - 0
Entity/UnionPay/MerchantInfo.cs

@@ -0,0 +1,71 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 商户信息
+    /// </summary>
+    public class MerchantInfo
+    {
+        /// <summary>
+        /// 商户类型
+        /// </summary>
+        public int merchantType { get; set; }
+
+        /// <summary>
+        /// 商户名称
+        /// </summary>
+        public string merchantName { get; set; }
+
+        /// <summary>
+        /// MCC码
+        /// </summary>
+        public string mccCode { get; set; }
+
+        /// <summary>
+        /// 省份编码
+        /// </summary>
+        public string provinceNo { get; set; }
+
+        /// <summary>
+        /// 省份名称
+        /// </summary>
+        public string provinceName { get; set; }
+
+        /// <summary>
+        /// 城市编码
+        /// </summary>
+        public string cityNo { get; set; }
+
+        /// <summary>
+        /// 城市名称
+        /// </summary>
+        public string cityName { get; set; }
+
+        /// <summary>
+        /// 区域编码
+        /// </summary>
+        public string areaNo { get; set; }
+
+        /// <summary>
+        /// 区域名称
+        /// </summary>
+        public string areaName { get; set; }
+
+        /// <summary>
+        /// 详细地址
+        /// </summary>
+        public string address { get; set; }
+
+        /// <summary>
+        /// 申请人
+        /// </summary>
+        public string applicant { get; set; }
+
+        /// <summary>
+        /// 联系电话
+        /// </summary>
+        public string contactPhoneNo { get; set; }
+    }
+}

+ 168 - 0
Entity/UnionPay/PushData.cs

@@ -0,0 +1,168 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 推送数据基础类
+    /// </summary>
+    public class PushDataBase
+    {
+        /// <summary>
+        /// 推送类型
+        /// </summary>
+        public string pushType { get; set; }
+
+        /// <summary>
+        /// 推送时间
+        /// </summary>
+        public string pushTime { get; set; }
+
+        /// <summary>
+        /// 商户号
+        /// </summary>
+        public string merchantNo { get; set; }
+
+        /// <summary>
+        /// 签名
+        /// </summary>
+        public string signature { get; set; }
+
+        /// <summary>
+        /// 扩展字段
+        /// </summary>
+        public Dictionary<string, string> extParams { get; set; }
+    }
+
+    /// <summary>
+    /// 交易推送数据
+    /// </summary>
+    public class TransactionPushData : PushDataBase
+    {
+        /// <summary>
+        /// 交易订单号
+        /// </summary>
+        public string transOrderNo { get; set; }
+
+        /// <summary>
+        /// 商户订单号
+        /// </summary>
+        public string merchantOrderNo { get; set; }
+
+        /// <summary>
+        /// 交易金额
+        /// </summary>
+        public decimal transAmount { get; set; }
+
+        /// <summary>
+        /// 交易时间
+        /// </summary>
+        public string transTime { get; set; }
+
+        /// <summary>
+        /// 交易类型
+        /// </summary>
+        public string transType { get; set; }
+
+        /// <summary>
+        /// 交易状态
+        /// </summary>
+        public string transStatus { get; set; }
+
+        /// <summary>
+        /// 支付方式
+        /// </summary>
+        public string payMethod { get; set; }
+
+        /// <summary>
+        /// 支付账号
+        /// </summary>
+        public string payAccount { get; set; }
+    }
+
+    /// <summary>
+    /// 结算推送数据
+    /// </summary>
+    public class SettlementPushData : PushDataBase
+    {
+        /// <summary>
+        /// 结算批次号
+        /// </summary>
+        public string settleBatchNo { get; set; }
+
+        /// <summary>
+        /// 结算日期
+        /// </summary>
+        public string settleDate { get; set; }
+
+        /// <summary>
+        /// 结算金额
+        /// </summary>
+        public decimal settleAmount { get; set; }
+
+        /// <summary>
+        /// 交易笔数
+        /// </summary>
+        public int transCount { get; set; }
+
+        /// <summary>
+        /// 手续费
+        /// </summary>
+        public decimal fee { get; set; }
+
+        /// <summary>
+        /// 结算状态
+        /// </summary>
+        public string settleStatus { get; set; }
+    }
+
+    /// <summary>
+    /// 商户状态推送数据
+    /// </summary>
+    public class MerchantStatusPushData : PushDataBase
+    {
+        /// <summary>
+        /// 商户状态
+        /// </summary>
+        public string merchantStatus { get; set; }
+
+        /// <summary>
+        /// 状态变更时间
+        /// </summary>
+        public string statusChangeTime { get; set; }
+
+        /// <summary>
+        /// 变更原因
+        /// </summary>
+        public string changeReason { get; set; }
+
+        /// <summary>
+        /// 审核意见
+        /// </summary>
+        public string auditOpinion { get; set; }
+    }
+
+    /// <summary>
+    /// 推送响应数据
+    /// </summary>
+    public class PushResponse
+    {
+        /// <summary>
+        /// 响应码
+        /// </summary>
+        public string code { get; set; }
+
+        /// <summary>
+        /// 响应消息
+        /// </summary>
+        public string message { get; set; }
+
+        /// <summary>
+        /// 扩展字段
+        /// </summary>
+        public Dictionary<string, string> extParams { get; set; }
+    }
+}

+ 116 - 0
Entity/UnionPay/SettleAccountInfo.cs

@@ -0,0 +1,116 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 结算账户信息
+    /// </summary>
+    public class SettleAccountInfo
+    {
+        /// <summary>
+        /// 银行卡账户类型
+        /// </summary>
+        public int bankCardAccountType { get; set; }
+
+        /// <summary>
+        /// 结算类型
+        /// </summary>
+        public int settleType { get; set; }
+
+        /// <summary>
+        /// 银行卡账号
+        /// </summary>
+        public string bankCardAccount { get; set; }
+
+        /// <summary>
+        /// 银行编码
+        /// </summary>
+        public string bankCode { get; set; }
+
+        /// <summary>
+        /// 银行省份编码
+        /// </summary>
+        public string bankProvince { get; set; }
+
+        /// <summary>
+        /// 银行省份名称
+        /// </summary>
+        public string bankProvinceName { get; set; }
+
+        /// <summary>
+        /// 银行城市编码
+        /// </summary>
+        public string bankCity { get; set; }
+
+        /// <summary>
+        /// 银行城市名称
+        /// </summary>
+        public string bankCityName { get; set; }
+
+        /// <summary>
+        /// 银行网点
+        /// </summary>
+        public string bankSite { get; set; }
+
+        /// <summary>
+        /// 银行名称
+        /// </summary>
+        public string bankName { get; set; }
+
+        /// <summary>
+        /// 银联编码
+        /// </summary>
+        public string unionpayCode { get; set; }
+
+        /// <summary>
+        /// 银行卡预留手机号
+        /// </summary>
+        public string bankCardPhone { get; set; }
+
+        /// <summary>
+        /// 银行卡持卡人
+        /// </summary>
+        public string bankCardHolder { get; set; }
+
+        /// <summary>
+        /// 银行卡照片
+        /// </summary>
+        public string bankCardPic { get; set; }
+
+        /// <summary>
+        /// 非法人证件类型
+        /// </summary>
+        public int? nonLegalPersonCertificateType { get; set; }
+
+        /// <summary>
+        /// 非法人证件号码
+        /// </summary>
+        public string nonLegalPersonCertificateNo { get; set; }
+
+        /// <summary>
+        /// 非法人证件开始日期
+        /// </summary>
+        public string nonLegalPersonCertificateStartDate { get; set; }
+
+        /// <summary>
+        /// 非法人证件结束日期
+        /// </summary>
+        public string nonLegalPersonCertificateEndDate { get; set; }
+
+        /// <summary>
+        /// 非法人证件正面照片
+        /// </summary>
+        public string nonLegalPersonCertificateFrontPic { get; set; }
+
+        /// <summary>
+        /// 非法人证件背面照片
+        /// </summary>
+        public string nonLegalPersonCertificateBackPic { get; set; }
+
+        /// <summary>
+        /// 非法人结算授权书照片
+        /// </summary>
+        public string nonLegalPersonSettleAuthorizationLetterPic { get; set; }
+    }
+}

+ 41 - 0
Entity/UnionPay/ShopInfo.cs

@@ -0,0 +1,41 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 门店信息
+    /// </summary>
+    public class ShopInfo
+    {
+        /// <summary>
+        /// 门店类型
+        /// </summary>
+        public int shopType { get; set; }
+
+        /// <summary>
+        /// 总店商户ID
+        /// </summary>
+        public string headShopMerchantId { get; set; }
+
+        /// <summary>
+        /// 店内照片
+        /// </summary>
+        public string shopInsidePlacePic { get; set; }
+
+        /// <summary>
+        /// 门店门头照片
+        /// </summary>
+        public string shopGatePic { get; set; }
+
+        /// <summary>
+        /// 收银台照片
+        /// </summary>
+        public string cashierDeskPic { get; set; }
+
+        /// <summary>
+        /// 管理员与门店门头合影
+        /// </summary>
+        public string managerWithMerchantDoorPhoto { get; set; }
+    }
+}

+ 161 - 0
Entity/UnionPay/TransactionSettlementQuery.cs

@@ -0,0 +1,161 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 交易结算数据查询请求参数
+    /// </summary>
+    public class TransactionSettlementQueryRequest
+    {
+        /// <summary>
+        /// 商户号
+        /// </summary>
+        public string merchantNo { get; set; }
+
+        /// <summary>
+        /// 门店号
+        /// </summary>
+        public string storeNo { get; set; }
+
+        /// <summary>
+        /// 交易日期开始
+        /// </summary>
+        public string transDateStart { get; set; }
+
+        /// <summary>
+        /// 交易日期结束
+        /// </summary>
+        public string transDateEnd { get; set; }
+
+        /// <summary>
+        /// 交易类型
+        /// </summary>
+        public string transType { get; set; }
+
+        /// <summary>
+        /// 结算状态
+        /// </summary>
+        public string settleStatus { get; set; }
+
+        /// <summary>
+        /// 分页页码
+        /// </summary>
+        public int pageNo { get; set; }
+
+        /// <summary>
+        /// 分页大小
+        /// </summary>
+        public int pageSize { get; set; }
+
+        /// <summary>
+        /// 扩展字段
+        /// </summary>
+        public Dictionary<string, string> extParams { get; set; }
+    }
+
+    /// <summary>
+    /// 交易结算数据查询响应参数
+    /// </summary>
+    public class TransactionSettlementQueryResponse
+    {
+        /// <summary>
+        /// 响应码
+        /// </summary>
+        public string code { get; set; }
+
+        /// <summary>
+        /// 响应消息
+        /// </summary>
+        public string message { get; set; }
+
+        /// <summary>
+        /// 总条数
+        /// </summary>
+        public int totalCount { get; set; }
+
+        /// <summary>
+        /// 总页数
+        /// </summary>
+        public int totalPage { get; set; }
+
+        /// <summary>
+        /// 当前页码
+        /// </summary>
+        public int currentPage { get; set; }
+
+        /// <summary>
+        /// 交易结算数据列表
+        /// </summary>
+        public List<TransactionSettlementInfo> transactionSettlementList { get; set; }
+
+        /// <summary>
+        /// 扩展字段
+        /// </summary>
+        public Dictionary<string, string> extParams { get; set; }
+    }
+
+    /// <summary>
+    /// 交易结算信息
+    /// </summary>
+    public class TransactionSettlementInfo
+    {
+        /// <summary>
+        /// 交易订单号
+        /// </summary>
+        public string transOrderNo { get; set; }
+
+        /// <summary>
+        /// 商户订单号
+        /// </summary>
+        public string merchantOrderNo { get; set; }
+
+        /// <summary>
+        /// 交易金额
+        /// </summary>
+        public decimal transAmount { get; set; }
+
+        /// <summary>
+        /// 交易时间
+        /// </summary>
+        public string transTime { get; set; }
+
+        /// <summary>
+        /// 结算金额
+        /// </summary>
+        public decimal settleAmount { get; set; }
+
+        /// <summary>
+        /// 结算时间
+        /// </summary>
+        public string settleTime { get; set; }
+
+        /// <summary>
+        /// 交易类型
+        /// </summary>
+        public string transType { get; set; }
+
+        /// <summary>
+        /// 交易状态
+        /// </summary>
+        public string transStatus { get; set; }
+
+        /// <summary>
+        /// 结算状态
+        /// </summary>
+        public string settleStatus { get; set; }
+
+        /// <summary>
+        /// 手续费
+        /// </summary>
+        public decimal fee { get; set; }
+
+        /// <summary>
+        /// 扩展字段
+        /// </summary>
+        public Dictionary<string, string> extParams { get; set; }
+    }
+}

+ 36 - 0
Entity/UnionPay/UnionPayAreaCodeInfo.cs

@@ -0,0 +1,36 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 地区编码信息
+    /// </summary>
+    public class UnionPayAreaCodeInfo
+    {
+        /// <summary>
+        /// 记录ID
+        /// </summary>
+        public long id { get; set; }
+
+        /// <summary>
+        /// 地区层级,1:省,2:市,3:区
+        /// </summary>
+        public string areaLevel { get; set; }
+
+        /// <summary>
+        /// 父级地区编码
+        /// </summary>
+        public string parentCode { get; set; }
+
+        /// <summary>
+        /// 地区编码
+        /// </summary>
+        public string areaCode { get; set; }
+
+        /// <summary>
+        /// 地区名称
+        /// </summary>
+        public string areaName { get; set; }
+    }
+}

+ 31 - 0
Entity/UnionPay/UnionPayAreaCodeRequest.cs

@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 获取地区编码请求
+    /// </summary>
+    public class UnionPayAreaCodeRequest
+    {
+        /// <summary>
+        /// 地区层级,1:省,2:市,3:区
+        /// </summary>
+        public string areaLevel { get; set; }
+
+        /// <summary>
+        /// 父级地区编码
+        /// </summary>
+        public string parentCode { get; set; }
+
+        /// <summary>
+        /// 地区编码
+        /// </summary>
+        public string areaCode { get; set; }
+
+        /// <summary>
+        /// 地区名称
+        /// </summary>
+        public string areaName { get; set; }
+    }
+}

+ 21 - 0
Entity/UnionPay/UnionPayBankInfo.cs

@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 银行信息
+    /// </summary>
+    public class UnionPayBankInfo
+    {
+        /// <summary>
+        /// 银行名称
+        /// </summary>
+        public string name { get; set; }
+
+        /// <summary>
+        /// 银行编码
+        /// </summary>
+        public string code { get; set; }
+    }
+}

+ 31 - 0
Entity/UnionPay/UnionPayBankListRequest.cs

@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 获取银行列表请求
+    /// </summary>
+    public class UnionPayBankListRequest
+    {
+        /// <summary>
+        /// 银行名称
+        /// </summary>
+        public string bankName { get; set; }
+
+        /// <summary>
+        /// 银行编码
+        /// </summary>
+        public string bankCode { get; set; }
+
+        /// <summary>
+        /// 页数
+        /// </summary>
+        public int pageNo { get; set; }
+
+        /// <summary>
+        /// 每页数量
+        /// </summary>
+        public int pageSize { get; set; }
+    }
+}

+ 21 - 0
Entity/UnionPay/UnionPayBranchInfo.cs

@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 银行网点信息
+    /// </summary>
+    public class UnionPayBranchInfo
+    {
+        /// <summary>
+        /// 网点名称(对应bankSite)
+        /// </summary>
+        public string name { get; set; }
+
+        /// <summary>
+        /// 网点编码(对应unionpayCode)
+        /// </summary>
+        public string code { get; set; }
+    }
+}

+ 41 - 0
Entity/UnionPay/UnionPayBranchListRequest.cs

@@ -0,0 +1,41 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 获取银行网点列表请求
+    /// </summary>
+    public class UnionPayBranchListRequest
+    {
+        /// <summary>
+        /// 省份编码
+        /// </summary>
+        public string provinceCode { get; set; }
+
+        /// <summary>
+        /// 城市编码
+        /// </summary>
+        public string cityCode { get; set; }
+
+        /// <summary>
+        /// 银行编码
+        /// </summary>
+        public string bankCode { get; set; }
+
+        /// <summary>
+        /// 网点名称
+        /// </summary>
+        public string bankSiteName { get; set; }
+
+        /// <summary>
+        /// 页数
+        /// </summary>
+        public int pageNo { get; set; }
+
+        /// <summary>
+        /// 每页数量
+        /// </summary>
+        public int pageSize { get; set; }
+    }
+}

+ 21 - 0
Entity/UnionPay/UnionPayIdCardTypeInfo.cs

@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 证件类型信息
+    /// </summary>
+    public class UnionPayIdCardTypeInfo
+    {
+        /// <summary>
+        /// 证件类型
+        /// </summary>
+        public string type { get; set; }
+
+        /// <summary>
+        /// 证件名称
+        /// </summary>
+        public string name { get; set; }
+    }
+}

+ 21 - 0
Entity/UnionPay/UnionPayIdCardTypesRequest.cs

@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 获取证件类型列表请求
+    /// </summary>
+    public class UnionPayIdCardTypesRequest
+    {
+        /// <summary>
+        /// 证件类型大类 1-商户个人证件类型 2-通道个人证件类型;不填时默认1
+        /// </summary>
+        public string firstType { get; set; }
+
+        /// <summary>
+        /// 证件类型小类 (对应运营平台配置页面的字段来源);不填时默认1
+        /// </summary>
+        public string secondType { get; set; }
+    }
+}

+ 41 - 0
Entity/UnionPay/UnionPayListTradeDetailRequest.cs

@@ -0,0 +1,41 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 交易结算详情查询请求
+    /// </summary>
+    public class UnionPayListTradeDetailRequest
+    {
+        /// <summary>
+        /// 交易开始时间(交易开始时间必传)
+        /// </summary>
+        public string startTime { get; set; }
+
+        /// <summary>
+        /// 交易结束时间(交易结束时间必传)
+        /// </summary>
+        public string endTime { get; set; }
+
+        /// <summary>
+        /// 乐刷交易单号、商户编号必传其一
+        /// </summary>
+        public string orderId { get; set; }
+
+        /// <summary>
+        /// 乐刷交易单号、商户编号必传其一
+        /// </summary>
+        public string merchantId { get; set; }
+
+        /// <summary>
+        /// 当前页
+        /// </summary>
+        public int pageNo { get; set; }
+
+        /// <summary>
+        /// 每页大小
+        /// </summary>
+        public int pageSize { get; set; }
+    }
+}

+ 36 - 0
Entity/UnionPay/UnionPayMccInfo.cs

@@ -0,0 +1,36 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 行业编码信息
+    /// </summary>
+    public class UnionPayMccInfo
+    {
+        /// <summary>
+        /// 行业编码
+        /// </summary>
+        public string mccCode { get; set; }
+
+        /// <summary>
+        /// 行业名称
+        /// </summary>
+        public string mccTxt { get; set; }
+
+        /// <summary>
+        /// 父级行业编码
+        /// </summary>
+        public string fatherCode { get; set; }
+
+        /// <summary>
+        /// 父级行业名称
+        /// </summary>
+        public string fatherTxt { get; set; }
+
+        /// <summary>
+        /// 子行业列表
+        /// </summary>
+        public List<UnionPayMccInfo> subMcc { get; set; }
+    }
+}

+ 26 - 0
Entity/UnionPay/UnionPayMccListRequest.cs

@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 获取行业编码请求
+    /// </summary>
+    public class UnionPayMccListRequest
+    {
+        /// <summary>
+        /// 行业层级,1:大类,2:子类,3:细类
+        /// </summary>
+        public int level { get; set; }
+
+        /// <summary>
+        /// 父级行业编码
+        /// </summary>
+        public string fatherCode { get; set; }
+
+        /// <summary>
+        /// 行业编码
+        /// </summary>
+        public string mccCode { get; set; }
+    }
+}

+ 16 - 0
Entity/UnionPay/UnionPayMerchantDetailRequest.cs

@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 获取商户信息请求
+    /// </summary>
+    public class UnionPayMerchantDetailRequest
+    {
+        /// <summary>
+        /// 商户编号
+        /// </summary>
+        public string merchantId { get; set; }
+    }
+}

+ 543 - 0
Entity/UnionPay/UnionPayMerchantDetailResponse.cs

@@ -0,0 +1,543 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 获取商户详情响应数据
+    /// </summary>
+    public class UnionPayMerchantDetailResponseData
+    {
+        /// <summary>
+        /// 商户编号
+        /// </summary>
+        public string merchantId { get; set; }
+
+        /// <summary>
+        /// 商户基本信息
+        /// </summary>
+        public MerchantBaseInfo merchantBaseInfo { get; set; }
+
+        /// <summary>
+        /// 商户身份信息
+        /// </summary>
+        public IdentityInfo identityInfo { get; set; }
+
+        /// <summary>
+        /// 商户结算信息
+        /// </summary>
+        public SettlementInfo settlementInfo { get; set; }
+
+        /// <summary>
+        /// 商户额度信息
+        /// </summary>
+        public MerchantQuota merchantQuota { get; set; }
+
+        /// <summary>
+        /// 商户图片信息
+        /// </summary>
+        public MerchantPic merchantPic { get; set; }
+
+        /// <summary>
+        /// 商户基本信息
+        /// </summary>
+        public class MerchantBaseInfo
+        {
+            /// <summary>
+            /// 商户编号
+            /// </summary>
+            public string merchantId { get; set; }
+
+            /// <summary>
+            /// 门店名称
+            /// </summary>
+            public string merchantName { get; set; }
+
+            /// <summary>
+            /// 店铺类型
+            /// </summary>
+            public int shopType { get; set; }
+
+            /// <summary>
+            /// 店铺编号
+            /// </summary>
+            public string shopNo { get; set; }
+
+            /// <summary>
+            /// 店铺状态
+            /// </summary>
+            public int shopState { get; set; }
+
+            /// <summary>
+            /// 店铺管理者名称
+            /// </summary>
+            public string shopManagerName { get; set; }
+
+            /// <summary>
+            /// 商户状态
+            /// </summary>
+            public int status { get; set; }
+
+            /// <summary>
+            /// 手机号码
+            /// </summary>
+            public string mobile { get; set; }
+
+            /// <summary>
+            /// 用户名
+            /// </summary>
+            public string userName { get; set; }
+
+            /// <summary>
+            /// 审核不通过原因
+            /// </summary>
+            public int? noPassReason { get; set; }
+
+            /// <summary>
+            /// 激活时间
+            /// </summary>
+            public string activeTime { get; set; }
+
+            /// <summary>
+            /// 子状态
+            /// </summary>
+            public int? subState { get; set; }
+
+            /// <summary>
+            /// 结算方式:0-t0, 1-t1, 2-22点分时结算
+            /// </summary>
+            public int settleState { get; set; }
+
+            /// <summary>
+            /// 注册日期
+            /// </summary>
+            public string createDate { get; set; }
+
+            /// <summary>
+            /// 总店编号
+            /// </summary>
+            public string headMerchantId { get; set; }
+
+            /// <summary>
+            /// 总店名称
+            /// </summary>
+            public string headMerchantName { get; set; }
+
+            /// <summary>
+            /// 直属代理商编号
+            /// </summary>
+            public string agentId { get; set; }
+        }
+
+        /// <summary>
+        /// 商户身份信息
+        /// </summary>
+        public class IdentityInfo
+        {
+            /// <summary>
+            /// 商户性质:1-个人(小微),2-个体,3-企业
+            /// </summary>
+            public int merchantType { get; set; }
+
+            /// <summary>
+            /// 企业子类型
+            /// </summary>
+            public int companyChildType { get; set; }
+
+            /// <summary>
+            /// 证件类型
+            /// </summary>
+            public int certificateType { get; set; }
+
+            /// <summary>
+            /// 证件号码
+            /// </summary>
+            public string idCardNo { get; set; }
+
+            /// <summary>
+            /// 证件号码名称
+            /// </summary>
+            public string idCardName { get; set; }
+
+            /// <summary>
+            /// 证件生效开始日期,格式如2023-01-01
+            /// </summary>
+            public string idCardStartDate { get; set; }
+
+            /// <summary>
+            /// 证件生效截止日期,格式如2023-01-01,长期则填"长期"
+            /// </summary>
+            public string idCardEndDate { get; set; }
+
+            /// <summary>
+            /// 门店名称
+            /// </summary>
+            public string merchantShortName { get; set; }
+
+            /// <summary>
+            /// 所属行业码
+            /// </summary>
+            public string mccCode { get; set; }
+
+            /// <summary>
+            /// 所属行业名称
+            /// </summary>
+            public string mccCodeValue { get; set; }
+
+            /// <summary>
+            /// 营业执照编号
+            /// </summary>
+            public string businessLicenseNo { get; set; }
+
+            /// <summary>
+            /// 营业执照名称
+            /// </summary>
+            public string businessLicenseName { get; set; }
+
+            /// <summary>
+            /// 营业执照生效开始日期,格式如2023-01-01
+            /// </summary>
+            public string businessLicenseStartDate { get; set; }
+
+            /// <summary>
+            /// 营业执照生效截止日期 长期:(9999-12-31/长期)
+            /// </summary>
+            public string businessLicenseEndDate { get; set; }
+
+            /// <summary>
+            /// 营业执照法人姓名
+            /// </summary>
+            public string businessLicenseLegalName { get; set; }
+
+            /// <summary>
+            /// 省份编号
+            /// </summary>
+            public string provinceNo { get; set; }
+
+            /// <summary>
+            /// 省份名称
+            /// </summary>
+            public string provinceName { get; set; }
+
+            /// <summary>
+            /// 城市编号
+            /// </summary>
+            public string cityNo { get; set; }
+
+            /// <summary>
+            /// 城市名称
+            /// </summary>
+            public string cityName { get; set; }
+
+            /// <summary>
+            /// 县区编号
+            /// </summary>
+            public string areaNo { get; set; }
+
+            /// <summary>
+            /// 县区名称
+            /// </summary>
+            public string areaName { get; set; }
+
+            /// <summary>
+            /// 详细地址
+            /// </summary>
+            public string address { get; set; }
+        }
+
+        /// <summary>
+        /// 商户结算信息
+        /// </summary>
+        public class SettlementInfo
+        {
+            /// <summary>
+            /// 收银结算方式(0-打款至法人,1-打款至非法人,2-打款至对公账户)
+            /// </summary>
+            public int settleType { get; set; }
+
+            /// <summary>
+            /// 结算对象,0:结算给自己,1:结算给总店
+            /// </summary>
+            public int settleTo { get; set; }
+
+            /// <summary>
+            /// 结算账户类型  1个人账户 2公司账户
+            /// </summary>
+            public int bankCardAccountType { get; set; }
+
+            /// <summary>
+            /// 入账模式,0:多笔入账,1:单笔入账
+            /// </summary>
+            public int settleMode { get; set; }
+
+            /// <summary>
+            /// 银行卡账号
+            /// </summary>
+            public string bankCardAccount { get; set; }
+
+            /// <summary>
+            /// 持卡人姓名
+            /// </summary>
+            public string bankCardHolder { get; set; }
+
+            /// <summary>
+            /// 银行编码
+            /// </summary>
+            public string bankCode { get; set; }
+
+            /// <summary>
+            /// 银行名称
+            /// </summary>
+            public string bankName { get; set; }
+
+            /// <summary>
+            /// 银行所在省编码
+            /// </summary>
+            public string bankProvince { get; set; }
+
+            /// <summary>
+            /// 银行所在省名称
+            /// </summary>
+            public string bankProvinceName { get; set; }
+
+            /// <summary>
+            /// 银行所在市编码
+            /// </summary>
+            public string bankCity { get; set; }
+
+            /// <summary>
+            /// 银行所在市名称
+            /// </summary>
+            public string bankCityName { get; set; }
+
+            /// <summary>
+            /// 银行网点名称
+            /// </summary>
+            public string bankSite { get; set; }
+
+            /// <summary>
+            /// 银行联行号(网点编码)
+            /// </summary>
+            public string unionpayCode { get; set; }
+
+            /// <summary>
+            /// 非法人证件类型
+            /// </summary>
+            public int? nonLegalPersonCertificateType { get; set; }
+
+            /// <summary>
+            /// 非法人证件号码
+            /// </summary>
+            public string nonLegalPersonCertificateNo { get; set; }
+
+            /// <summary>
+            /// 非法人证件生效开始时间,格式如2023-01-01
+            /// </summary>
+            public string nonLegalPersonCertificateStartDate { get; set; }
+
+            /// <summary>
+            /// 非法人证件生效截止时间,格式如2023-01-01,长期则填"长期"
+            /// </summary>
+            public string nonLegalPersonCertificateEndDate { get; set; }
+        }
+
+        /// <summary>
+        /// 商户额度信息
+        /// </summary>
+        public class MerchantQuota
+        {
+            /// <summary>
+            /// 微信支付宝额度
+            /// </summary>
+            public WxAlipayScan wxAlipayScan { get; set; }
+
+            /// <summary>
+            /// 银联扫码额度
+            /// </summary>
+            public UnionScan unionScan { get; set; }
+
+            /// <summary>
+            /// 微信支付宝额度
+            /// </summary>
+            public class WxAlipayScan
+            {
+                /// <summary>
+                /// 微信单次限额(分)
+                /// </summary>
+                public long wxOnceLimit { get; set; }
+
+                /// <summary>
+                /// 微信单日限额(分)
+                /// </summary>
+                public long wxDailyLimit { get; set; }
+
+                /// <summary>
+                /// 微信单月限额(分)
+                /// </summary>
+                public long wxMonthlyLimit { get; set; }
+
+                /// <summary>
+                /// 支付宝单次限额(分)
+                /// </summary>
+                public long alipayOnceLimit { get; set; }
+
+                /// <summary>
+                /// 支付宝单日限额(分)
+                /// </summary>
+                public long alipayDailyLimit { get; set; }
+
+                /// <summary>
+                /// 支付宝单月限额(分)
+                /// </summary>
+                public long alipayMonthlyLimit { get; set; }
+            }
+
+            /// <summary>
+            /// 银联扫码额度
+            /// </summary>
+            public class UnionScan
+            {
+                /// <summary>
+                /// T1单笔限额(被扫)(分)
+                /// </summary>
+                public long userUploadOnceAmountLimit { get; set; }
+
+                /// <summary>
+                /// T1单日限额(被扫)(分)
+                /// </summary>
+                public long userUploadDayAmountLimit { get; set; }
+
+                /// <summary>
+                /// T1单日交易笔数(被扫)(笔)
+                /// </summary>
+                public long userUploadDayVolumeLimit { get; set; }
+
+                /// <summary>
+                /// T1单月限额(被扫)(分)
+                /// </summary>
+                public long userUploadMonthAmountLimit { get; set; }
+            }
+        }
+
+        /// <summary>
+        /// 商户图片信息
+        /// </summary>
+        public class MerchantPic
+        {
+            /// <summary>
+            /// 身份证正面
+            /// </summary>
+            public string idcardFront { get; set; }
+
+            /// <summary>
+            /// 身份证反面
+            /// </summary>
+            public string idcardBack { get; set; }
+
+            /// <summary>
+            /// 银行卡正面
+            /// </summary>
+            public string bankcardFront { get; set; }
+
+            /// <summary>
+            /// 营业执照
+            /// </summary>
+            public string businessLicense { get; set; }
+
+            /// <summary>
+            /// 非法人-身份证正面
+            /// </summary>
+            public string nonLegIdcardFront { get; set; }
+
+            /// <summary>
+            /// 非法人-身份证反面
+            /// </summary>
+            public string nonLegIdcardBack { get; set; }
+
+            /// <summary>
+            /// 非法人-结算授权书
+            /// </summary>
+            public string nonLegSettleAuth { get; set; }
+
+            /// <summary>
+            /// 店内照
+            /// </summary>
+            public string businessInside { get; set; }
+
+            /// <summary>
+            /// 门头照
+            /// </summary>
+            public string doorPhoto { get; set; }
+
+            /// <summary>
+            /// 收银台照片
+            /// </summary>
+            public string cashierDesk { get; set; }
+
+            /// <summary>
+            /// 手持身份证
+            /// </summary>
+            public string idcardHand { get; set; }
+
+            /// <summary>
+            /// 租赁合同
+            /// </summary>
+            public string leaseContract { get; set; }
+
+            /// <summary>
+            /// 商户协议
+            /// </summary>
+            public string protocolPage { get; set; }
+
+            /// <summary>
+            /// 组织机构代码
+            /// </summary>
+            public string organizationCode { get; set; }
+
+            /// <summary>
+            /// 税务登记
+            /// </summary>
+            public string taxRegCert { get; set; }
+
+            /// <summary>
+            /// 个人完税证明
+            /// </summary>
+            public string personalTaxProve { get; set; }
+
+            /// <summary>
+            /// 加盟店授权函
+            /// </summary>
+            public string authorizeLetter { get; set; }
+
+            /// <summary>
+            /// 结算卡信息转账成功照片
+            /// </summary>
+            public string settleCardTransferSuccess { get; set; }
+
+            /// <summary>
+            /// 结算卡身份证和结算卡同框照片
+            /// </summary>
+            public string idcardAndSettleCard { get; set; }
+
+            /// <summary>
+            /// 其他照片1
+            /// </summary>
+            public string otherPic1 { get; set; }
+
+            /// <summary>
+            /// 其他照片2
+            /// </summary>
+            public string otherPic2 { get; set; }
+        }
+    
+        /// <summary>
+        /// 商户图片信息是否完善 1:完善,0:未完善
+        /// </summary>
+        public int picState { get; set; }
+
+        /// <summary>
+        /// 银行活动报名状态,0:未报名,1:已报名
+        /// </summary>
+        public int bankActivityState { get; set; }
+    }
+}

+ 7 - 0
Entity/UnionPay/UnionPayMerchantRegister.cs

@@ -0,0 +1,7 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    // 所有类已移至单独文件
+}

+ 56 - 0
Entity/UnionPay/UnionPayMerchantRegisterRequest.cs

@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 银联商户注册请求
+    /// </summary>
+    public class UnionPayMerchantRegisterRequest
+    {
+        /// <summary>
+        /// 是否关联总商户
+        /// </summary>
+        public bool affiliateHeadMerchant { get; set; }
+
+        /// <summary>
+        /// 渠道类型列表
+        /// </summary>
+        public List<int> channelTypes { get; set; }
+
+        /// <summary>
+        /// 用户注册信息
+        /// </summary>
+        public UserRegistrationInfo userRegistrationInfo { get; set; }
+
+        /// <summary>
+        /// 法人信息
+        /// </summary>
+        public LegalPersonInfo legalPerson { get; set; }
+
+        /// <summary>
+        /// 营业执照信息
+        /// </summary>
+        public BusinessLicenseInfo businessLicense { get; set; }
+
+        /// <summary>
+        /// 商户信息
+        /// </summary>
+        public MerchantInfo merchantInfo { get; set; }
+
+        /// <summary>
+        /// 结算账户信息
+        /// </summary>
+        public SettleAccountInfo settleAccountInfo { get; set; }
+
+        /// <summary>
+        /// 门店信息
+        /// </summary>
+        public ShopInfo shopInfo { get; set; }
+
+        /// <summary>
+        /// 额外信息
+        /// </summary>
+        public ExtraInfoDto extraInfoDto { get; set; }
+    }
+}

+ 26 - 0
Entity/UnionPay/UnionPayMerchantRegisterResponse.cs

@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 银联商户注册响应
+    /// </summary>
+    public class UnionPayMerchantRegisterResponse
+    {
+        /// <summary>
+        /// 响应码
+        /// </summary>
+        public string code { get; set; }
+
+        /// <summary>
+        /// 响应消息
+        /// </summary>
+        public string message { get; set; }
+
+        /// <summary>
+        /// 商户ID
+        /// </summary>
+        public string merchantId { get; set; }
+    }
+}

+ 31 - 0
Entity/UnionPay/UnionPayMerchantReviewCallbackRequest.cs

@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 商户审核信息回调请求
+    /// </summary>
+    public class UnionPayMerchantReviewCallbackRequest
+    {
+        /// <summary>
+        /// 商户编号
+        /// </summary>
+        public string merchantId { get; set; }
+
+        /// <summary>
+        /// 商户状态,-1:待完善资料,0:待审核,1:审核不通过,2:转人工,3:审核通过
+        /// </summary>
+        public int merchantStatus { get; set; }
+
+        /// <summary>
+        /// 消息类型,1:注册审核,2:修改审核
+        /// </summary>
+        public int messageType { get; set; }
+
+        /// <summary>
+        /// 审核结果描述
+        /// </summary>
+        public string checkDesc { get; set; }
+    }
+}

+ 75 - 0
Entity/UnionPay/UnionPayRequest.cs

@@ -0,0 +1,75 @@
+using System;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 银联请求报文
+    /// </summary>
+    public class UnionPayRequest<T>
+    {
+        private static int _sequenceNumber = 0;
+
+        /// <summary>
+        /// 服务商编号,由乐刷分配的接入方唯一标识,明文传输
+        /// </summary>
+        public string agentId { get; set; }
+
+        /// <summary>
+        /// 当前代理商编号(操作来源)
+        /// </summary>
+        public string currentAgentId { get; set; }
+
+        /// <summary>
+        /// 版本号,目前固定值1.0
+        /// </summary>
+        public string version { get; set; } = "1.0";
+
+        /// <summary>
+        /// 请求流水号(yyyyMMddHHmmssSSSXXXXX,其中 XXXXX为5位顺序号,禁止使用UUID等无意义数据)
+        /// </summary>
+        public string reqSerialNo { get; set; } = GenerateReqSerialNo();
+
+        /// <summary>
+        /// 签名串
+        /// </summary>
+        public string sign { get; set; }
+
+        /// <summary>
+        /// 验签方式,默认true-国密验签,false-MD5验签
+        /// </summary>
+        public bool algorithm { get; set; } = true;
+
+        /// <summary>
+        /// 业务数据
+        /// </summary>
+        public T data { get; set; }
+
+        /// <summary>
+        /// 生成请求流水号
+        /// </summary>
+        /// <returns>格式化的请求流水号</returns>
+        private static string GenerateReqSerialNo()
+        {
+            // 生成当前时间戳部分:yyyyMMddHHmmssSSS
+            string timestamp = DateTime.Now.ToString("yyyyMMddHHmmssfff");
+            
+            // 生成5位顺序号,循环递增
+            int sequence = System.Threading.Interlocked.Increment(ref _sequenceNumber);
+            if (sequence > 99999)
+            {
+                System.Threading.Interlocked.Exchange(ref _sequenceNumber, 1);
+                sequence = 1;
+            }
+            
+            // 组合完整的请求流水号
+            return $"{timestamp}{sequence.ToString("D5")}";
+        }
+    }
+
+    /// <summary>
+    /// 银联请求报文(非泛型版本,兼容旧代码)
+    /// </summary>
+    public class UnionPayRequest : UnionPayRequest<object>
+    {
+    }
+}

+ 37 - 0
Entity/UnionPay/UnionPayResponse.cs

@@ -0,0 +1,37 @@
+using System;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 银联返回报文
+    /// </summary>
+    public class UnionPayResponse<T>
+    {
+        /// <summary>
+        /// 业务响应码,0表示成功
+        /// </summary>
+        public string error_code { get; set; }
+
+        /// <summary>
+        /// 错误信息
+        /// </summary>
+        public string error_msg { get; set; }
+
+        /// <summary>
+        /// 记录总数
+        /// </summary>
+        public long count { get; set; }
+
+        /// <summary>
+        /// 业务数据
+        /// </summary>
+        public T data { get; set; }
+    }
+
+    /// <summary>
+    /// 银联返回报文(非泛型版本,兼容旧代码)
+    /// </summary>
+    public class UnionPayResponse : UnionPayResponse<object>
+    {
+    }
+}

+ 177 - 0
Entity/UnionPay/UnionPaySettlementPushRequest.cs

@@ -0,0 +1,177 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 交易结算实时推送请求
+    /// </summary>
+    public class UnionPaySettlementPushRequest
+    {
+        /// <summary>
+        /// 推送类型,0:交易 1:结算
+        /// </summary>
+        public int type { get; set; }
+
+        /// <summary>
+        /// 详细信息
+        /// </summary>
+        public object detailInfo { get; set; }
+
+        /// <summary>
+        /// 将detailInfo转换为TransactionDetailInfo
+        /// </summary>
+        /// <returns>TransactionDetailInfo对象</returns>
+        public TransactionDetailInfo ToTransactionDetailInfo()
+        {
+            if (type != 0)
+            {
+                throw new InvalidOperationException("当前推送类型不是交易数据");
+            }
+            return Newtonsoft.Json.JsonConvert.DeserializeObject<TransactionDetailInfo>(Newtonsoft.Json.JsonConvert.SerializeObject(detailInfo));
+        }
+
+        /// <summary>
+        /// 将detailInfo转换为SettlementDetailInfo
+        /// </summary>
+        /// <returns>SettlementDetailInfo对象</returns>
+        public SettlementDetailInfo ToSettlementDetailInfo()
+        {
+            if (type != 1)
+            {
+                throw new InvalidOperationException("当前推送类型不是结算数据");
+            }
+            return Newtonsoft.Json.JsonConvert.DeserializeObject<SettlementDetailInfo>(Newtonsoft.Json.JsonConvert.SerializeObject(detailInfo));
+        }
+    }
+
+    /// <summary>
+    /// 交易结算基础信息
+    /// </summary>
+    public class DetailInfo
+    {
+        /// <summary>
+        /// 直属代理编号
+        /// </summary>
+        public string agentId { get; set; }
+
+        /// <summary>
+        /// 交易金额(单位:分)
+        /// </summary>
+        public long amount { get; set; }
+
+        /// <summary>
+        /// 业务员编号
+        /// </summary>
+        public string keeperId { get; set; }
+
+        /// <summary>
+        /// 商户编号
+        /// </summary>
+        public string merchantId { get; set; }
+
+        /// <summary>
+        /// 商户名称
+        /// </summary>
+        public string merchantName { get; set; }
+
+        /// <summary>
+        /// 乐刷交易单号
+        /// </summary>
+        public string orderId { get; set; }
+
+        /// <summary>
+        /// 交易状态:5 支付成功,11 支付失败,3 退款成功,31 退款中,32 退款失败,
+        /// 40 预授权成功,41 预授权失败,42 预授权撤销成功,43 预授权撤销失败,44 预授权完成成功,
+        /// 45 预授权完成失败,48 预授权完成撤销成功,54 预授权完成退款订单
+        /// </summary>
+        public int state { get; set; }
+
+        /// <summary>
+        /// 交易时间
+        /// </summary>
+        public string time { get; set; }
+
+        /// <summary>
+        /// 一级代理编号
+        /// </summary>
+        public string topAgentId { get; set; }
+
+        /// <summary>
+        /// 交易流水号
+        /// </summary>
+        public string transactionId { get; set; }
+    }
+
+    /// <summary>
+    /// 交易数据详细信息
+    /// </summary>
+    public class TransactionDetailInfo : DetailInfo
+    {
+        /// <summary>
+        /// 备注信息
+        /// </summary>
+        public string attach { get; set; }
+
+        /// <summary>
+        /// 刷卡交易卡类型:0-借记卡,2-贷记卡,3-境外卡,4未知
+        /// </summary>
+        public int? cardType { get; set; }
+
+        /// <summary>
+        /// 码牌编号
+        /// </summary>
+        public string qrcodeNo { get; set; }
+
+        /// <summary>
+        /// 支付方式:1-刷卡,2-微信,3-支付宝,6-银联二维码
+        /// </summary>
+        public int? payType { get; set; }
+
+        /// <summary>
+        /// 乐刷sn
+        /// </summary>
+        public string pinpadUuid { get; set; }
+
+        /// <summary>
+        /// pos_sn
+        /// </summary>
+        public string posSn { get; set; }
+
+        /// <summary>
+        /// t0标识: 1、t0 ; 0 T1
+        /// </summary>
+        public int? t0Flag { get; set; }
+
+        /// <summary>
+        /// 交易类型:1-支付, 2-退款
+        /// </summary>
+        public int? tradeType { get; set; }
+    }
+
+    /// <summary>
+    /// 结算数据详细信息
+    /// </summary>
+    public class SettlementDetailInfo : DetailInfo
+    {
+        /// <summary>
+        /// 商户固定手续费,单位:万分之一分
+        /// </summary>
+        public long? feeFixed { get; set; }
+
+        /// <summary>
+        /// 手续费费率(万分之一)
+        /// </summary>
+        public long? feeRate { get; set; }
+
+        /// <summary>
+        /// 手续费(分)
+        /// </summary>
+        public long? merchantFee { get; set; }
+
+        /// <summary>
+        /// 结算金额(分)
+        /// </summary>
+        public long? settleAmount { get; set; }
+    }
+}

+ 130 - 0
Entity/UnionPay/UnionPayTradeDetailInfo.cs

@@ -0,0 +1,130 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 交易结算详情信息
+    /// </summary>
+    public class UnionPayTradeDetailInfo
+    {
+        /// <summary>
+        /// 商户编号
+        /// </summary>
+        public string merchantId { get; set; }
+
+        /// <summary>
+        /// 商户名称
+        /// </summary>
+        public string merchantName { get; set; }
+
+        /// <summary>
+        /// 直属代理编号
+        /// </summary>
+        public string agentId { get; set; }
+
+        /// <summary>
+        /// 一级代理编号
+        /// </summary>
+        public string topAgentId { get; set; }
+
+        /// <summary>
+        /// 业务员编号
+        /// </summary>
+        public string keeperId { get; set; }
+
+        /// <summary>
+        /// 交易流水号
+        /// </summary>
+        public string transactionId { get; set; }
+
+        /// <summary>
+        /// 订单编号
+        /// </summary>
+        public string orderId { get; set; }
+
+        /// <summary>
+        /// 交易时间
+        /// </summary>
+        public string time { get; set; }
+
+        /// <summary>
+        /// pos_sn
+        /// </summary>
+        public string posSn { get; set; }
+
+        /// <summary>
+        /// 乐刷sn
+        /// </summary>
+        public string pinpadUuid { get; set; }
+
+        /// <summary>
+        /// 码牌编号
+        /// </summary>
+        public string qrcodeNo { get; set; }
+
+        /// <summary>
+        /// 交易金额(单位:分)
+        /// </summary>
+        public decimal amount { get; set; }
+
+        /// <summary>
+        /// 刷卡交易卡类型:0-借记卡,2-贷记卡,3-境外卡,4未知
+        /// </summary>
+        public int cardType { get; set; }
+
+        /// <summary>
+        /// 交易状态:-1 未知,0 交易初始,5 支付成功,11 支付失败,3 退款成功,31 退款中,32 退款失败,
+        /// 40 预授权成功,41 预授权失败,42 预授权撤销成功,43 预授权撤销失败,44 预授权完成成功,
+        /// 45 预授权完成失败,48 预授权完成撤销成功,49 预授权完成撤销失败,50 预授权完成中间状态,
+        /// 51 预授权中间状态,52 预授权撤销中间状态,53 预授权完成撤销状态,54 预授权完成退款订单
+        /// </summary>
+        public int state { get; set; }
+
+        /// <summary>
+        /// 交易类型:1-支付, 2-退款
+        /// </summary>
+        public int tradeType { get; set; }
+
+        /// <summary>
+        /// 支付方式:1-刷卡,2-微信,3-支付宝,6-银联二维码
+        /// </summary>
+        public int payType { get; set; }
+
+        /// <summary>
+        /// t0标识: 1、t0 ; 0 T1
+        /// </summary>
+        public int t0Flag { get; set; }
+
+        /// <summary>
+        /// 备注信息
+        /// </summary>
+        public string attach { get; set; }
+
+        /// <summary>
+        /// 结算金额(分)
+        /// </summary>
+        public int settleAmount { get; set; }
+
+        /// <summary>
+        /// 状态: -1:打款失败; 0:打款中; 1:打款成功; 2:打款退票; 3:冻结出款;
+        /// 0-打款中状态下 无结算数据(即对应字段值为0,如feeRate字段)
+        /// </summary>
+        public int settleState { get; set; }
+
+        /// <summary>
+        /// 手续费费率(百万分之一)
+        /// </summary>
+        public int feeRate { get; set; }
+
+        /// <summary>
+        /// 商户固定手续费,单位:万分之一分
+        /// </summary>
+        public int feeFixed { get; set; }
+
+        /// <summary>
+        /// 手续费(分)
+        /// </summary>
+        public int merchantFee { get; set; }
+    }
+}

+ 423 - 0
Entity/UnionPay/UnionPayUpdateMerchantInfoRequest.cs

@@ -0,0 +1,423 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 更新商户信息请求
+    /// </summary>
+    public class UnionPayUpdateMerchantInfoRequest
+    {
+        /// <summary>
+        /// 商户编号
+        /// </summary>
+        public string merchantId { get; set; }
+
+        /// <summary>
+        /// 操作类型,0:修改提交审核,1:小微升级提交审核
+        /// </summary>
+        public int operateType { get; set; }
+
+        /// <summary>
+        /// 代理商编号
+        /// </summary>
+        public string agentId { get; set; }
+
+        /// <summary>
+        /// 法人信息
+        /// </summary>
+        public LegalPerson legalPerson { get; set; }
+
+        /// <summary>
+        /// 营业执照信息
+        /// </summary>
+        public BusinessLicense businessLicense { get; set; }
+
+        /// <summary>
+        /// 商户信息
+        /// </summary>
+        public MerchantInfo merchantInfo { get; set; }
+
+        /// <summary>
+        /// 结算信息
+        /// </summary>
+        public SettleAccountInfo settleAccountInfo { get; set; }
+
+        /// <summary>
+        /// 店铺信息
+        /// </summary>
+        public ShopInfo shopInfo { get; set; }
+
+        /// <summary>
+        /// 其他信息
+        /// </summary>
+        public ExtraInfoDto extraInfoDto { get; set; }
+
+        /// <summary>
+        /// 法人信息
+        /// </summary>
+        public class LegalPerson
+        {
+            /// <summary>
+            /// 法人姓名
+            /// </summary>
+            public string legalPersonName { get; set; }
+
+            /// <summary>
+            /// 证件类型,调获取证件类型列表接口
+            /// </summary>
+            public int certificateType { get; set; }
+
+            /// <summary>
+            /// 身份证号
+            /// </summary>
+            public string certificateNo { get; set; }
+
+            /// <summary>
+            /// 身份证有效期开始日期,格式如2023-01-01
+            /// </summary>
+            public string certificateStartDate { get; set; }
+
+            /// <summary>
+            /// 身份证有效期结束日期,格式如2023-01-01,长期则填"长期"
+            /// </summary>
+            public string certificateEndDate { get; set; }
+
+            /// <summary>
+            /// 身份证人像面照片地址
+            /// </summary>
+            public string certificatesFrontPic { get; set; }
+
+            /// <summary>
+            /// 身份证国徽面照片地址
+            /// </summary>
+            public string certificatesBackPic { get; set; }
+
+            /// <summary>
+            /// 手持身份证照片地址
+            /// </summary>
+            public string idcardHandPic { get; set; }
+
+            /// <summary>
+            /// 面部照片
+            /// </summary>
+            public string facePic { get; set; }
+        }
+
+        /// <summary>
+        /// 营业执照信息
+        /// </summary>
+        public class BusinessLicense
+        {
+            /// <summary>
+            /// 营业执照编号
+            /// </summary>
+            public string businessLicenseNo { get; set; }
+
+            /// <summary>
+            /// 营业执照名称
+            /// </summary>
+            public string businessLicenseName { get; set; }
+
+            /// <summary>
+            /// 营业执照有效期开始日期,格式如2023-01-01
+            /// </summary>
+            public string businessLicenseStartDate { get; set; }
+
+            /// <summary>
+            /// 营业执照有效期结束日期,格式如2023-01-01,长期则填"长期"
+            /// </summary>
+            public string businessLicenseEndDate { get; set; }
+
+            /// <summary>
+            /// 营业执照照片
+            /// </summary>
+            public string businessCreditLicensePic { get; set; }
+        }
+
+        /// <summary>
+        /// 商户信息
+        /// </summary>
+        public class MerchantInfo
+        {
+            /// <summary>
+            /// 商户类型,1:个人,2:个体,3:企业
+            /// </summary>
+            public int merchantType { get; set; }
+
+            /// <summary>
+            /// 门店名称
+            /// </summary>
+            public string merchantName { get; set; }
+
+            /// <summary>
+            /// 所属行业mcc码
+            /// </summary>
+            public string mccCode { get; set; }
+
+            /// <summary>
+            /// 省份代码
+            /// </summary>
+            public string provinceNo { get; set; }
+
+            /// <summary>
+            /// 省份名称
+            /// </summary>
+            public string provinceName { get; set; }
+
+            /// <summary>
+            /// 城市代码
+            /// </summary>
+            public string cityNo { get; set; }
+
+            /// <summary>
+            /// 城市名称
+            /// </summary>
+            public string cityName { get; set; }
+
+            /// <summary>
+            /// 地区代码
+            /// </summary>
+            public string areaNo { get; set; }
+
+            /// <summary>
+            /// 地区名称
+            /// </summary>
+            public string areaName { get; set; }
+
+            /// <summary>
+            /// 详细地址
+            /// </summary>
+            public string address { get; set; }
+
+            /// <summary>
+            /// 联系人
+            /// </summary>
+            public string applicant { get; set; }
+
+            /// <summary>
+            /// 联系电话
+            /// </summary>
+            public string contactPhoneNo { get; set; }
+
+            /// <summary>
+            /// 商户简称
+            /// </summary>
+            public string merchantShortHand { get; set; }
+
+            /// <summary>
+            /// 商户子类型
+            /// </summary>
+            public int merchantSubType { get; set; }
+        }
+
+        /// <summary>
+        /// 结算信息
+        /// </summary>
+        public class SettleAccountInfo
+        {
+            /// <summary>
+            /// 结算账户类型,1:私人账户 2:单位账户
+            /// </summary>
+            public int bankCardAccountType { get; set; }
+
+            /// <summary>
+            /// 结算方式,0:非法人结算 1:法人结算
+            /// </summary>
+            public int settleType { get; set; }
+
+            /// <summary>
+            /// 银行账号
+            /// </summary>
+            public string bankCardAccount { get; set; }
+
+            /// <summary>
+            /// 银行编码
+            /// </summary>
+            public string bankCode { get; set; }
+
+            /// <summary>
+            /// 开户银行省份编码
+            /// </summary>
+            public string bankProvince { get; set; }
+
+            /// <summary>
+            /// 开户银行省份名称
+            /// </summary>
+            public string bankProvinceName { get; set; }
+
+            /// <summary>
+            /// 开户银行城市编码
+            /// </summary>
+            public string bankCity { get; set; }
+
+            /// <summary>
+            /// 开户银行城市名称
+            /// </summary>
+            public string bankCityName { get; set; }
+
+            /// <summary>
+            /// 开户行网点名称
+            /// </summary>
+            public string bankSite { get; set; }
+
+            /// <summary>
+            /// 银行名称
+            /// </summary>
+            public string bankName { get; set; }
+
+            /// <summary>
+            /// 开户支行联行号(网点编码)
+            /// </summary>
+            public string unionpayCode { get; set; }
+
+            /// <summary>
+            /// 银行卡预留手机号
+            /// </summary>
+            public string bankCardPhone { get; set; }
+
+            /// <summary>
+            /// 开户名
+            /// </summary>
+            public string bankCardHolder { get; set; }
+
+            /// <summary>
+            /// 银行卡照片
+            /// </summary>
+            public string bankCardPic { get; set; }
+
+            /// <summary>
+            /// 非法人证件类型,调获取证件类型列表接口
+            /// </summary>
+            public int? nonLegalPersonCertificateType { get; set; }
+
+            /// <summary>
+            /// 非法人证件号
+            /// </summary>
+            public string nonLegalPersonCertificateNo { get; set; }
+
+            /// <summary>
+            /// 非法人证件有效开始日期,格式如2023-01-01
+            /// </summary>
+            public string nonLegalPersonCertificateStartDate { get; set; }
+
+            /// <summary>
+            /// 非法人证件有效截止日期,格式如2023-01-01,长期则填"长期"
+            /// </summary>
+            public string nonLegalPersonCertificateEndDate { get; set; }
+
+            /// <summary>
+            /// 非法人身份证正面照片地址
+            /// </summary>
+            public string nonLegalPersonCertificateFrontPic { get; set; }
+
+            /// <summary>
+            /// 非法人身份证背面照片地址
+            /// </summary>
+            public string nonLegalPersonCertificateBackPic { get; set; }
+
+            /// <summary>
+            /// 非法人结算授权函
+            /// </summary>
+            public string nonLegalPersonSettleAuthorizationLetterPic { get; set; }
+        }
+
+        /// <summary>
+        /// 店铺信息
+        /// </summary>
+        public class ShopInfo
+        {
+            /// <summary>
+            /// 店铺类型,0:分店,1:总店
+            /// </summary>
+            public int shopType { get; set; }
+
+            /// <summary>
+            /// 总店商户号
+            /// </summary>
+            public string headShopMerchantId { get; set; }
+
+            /// <summary>
+            /// 店内照片
+            /// </summary>
+            public string shopInsidePlacePic { get; set; }
+
+            /// <summary>
+            /// 门头照片
+            /// </summary>
+            public string shopGatePic { get; set; }
+
+            /// <summary>
+            /// 收银台照片
+            /// </summary>
+            public string cashierDeskPic { get; set; }
+
+            /// <summary>
+            /// 经理与门头合照
+            /// </summary>
+            public string managerWithMerchantDoorPhoto { get; set; }
+        }
+
+        /// <summary>
+        /// 其他信息
+        /// </summary>
+        public class ExtraInfoDto
+        {
+            /// <summary>
+            /// 企业类型商户子类型,非企业商户无效;1:普通,2:事业单位,3:社会团体
+            /// </summary>
+            public int? companyChildType { get; set; }
+
+            /// <summary>
+            /// 承包商营业执照名称
+            /// </summary>
+            public string contractorLicenseName { get; set; }
+
+            /// <summary>
+            /// 商户分类;0:扫码支付线下;1:扫码支付线上;2:扫码支付保险;3:扫码支付公缴;4:扫码支付公益;5:高校食堂
+            /// </summary>
+            public int? payBusinessType { get; set; }
+
+            /// <summary>
+            /// 二次分包商户进件时,承包商商户id
+            /// </summary>
+            public string contractorMerchantId { get; set; }
+
+            /// <summary>
+            /// 合打款至学校公账证明图片地址
+            /// </summary>
+            public string settleToCollegeAccount { get; set; }
+
+            /// <summary>
+            /// 办学许可证图片地址
+            /// </summary>
+            public string schoolLicense { get; set; }
+
+            /// <summary>
+            /// 客户经理与商户门头合照
+            /// </summary>
+            public string managerWithMerchantDoorPhoto { get; set; }
+
+            /// <summary>
+            /// 合作协议/证明图片地址
+            /// </summary>
+            public string cooperationAgreement { get; set; }
+
+            /// <summary>
+            /// 国家事业单位网站截图图片地址
+            /// </summary>
+            public string contunryWebsiteScreenshot { get; set; }
+
+            /// <summary>
+            /// 其他照片,包括:加盟店授权函照片、结算卡信息转账成功照片,结算卡身份证和结算卡同框照片、法人手持结算账户确认书照片
+            /// 以key:value形式传入
+            /// </summary>
+            public Dictionary<string, string> otherPics { get; set; }
+
+            /// <summary>
+            /// 凭证文件地址
+            /// </summary>
+            public string credentialFileAddress { get; set; }
+        }
+    }
+}

+ 21 - 0
Entity/UnionPay/UnionPayUploadPicRequest.cs

@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 上传图片请求
+    /// </summary>
+    public class UnionPayUploadPicRequest
+    {
+        /// <summary>
+        /// 扩展名,限制jpg/png/jpeg
+        /// </summary>
+        public string ext { get; set; }
+
+        /// <summary>
+        /// base64编码的图片数据,2M以内
+        /// </summary>
+        public string picData { get; set; }
+    }
+}

+ 16 - 0
Entity/UnionPay/UnionPayUploadPicResponseData.cs

@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 上传图片响应数据
+    /// </summary>
+    public class UnionPayUploadPicResponseData
+    {
+        /// <summary>
+        /// 图片路径
+        /// </summary>
+        public string path { get; set; }
+    }
+}

+ 26 - 0
Entity/UnionPay/UserRegistrationInfo.cs

@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+
+namespace MySystem.Entity.UnionPay
+{
+    /// <summary>
+    /// 用户注册信息
+    /// </summary>
+    public class UserRegistrationInfo
+    {
+        /// <summary>
+        /// 用户名
+        /// </summary>
+        public string userName { get; set; }
+
+        /// <summary>
+        /// 密码
+        /// </summary>
+        public string password { get; set; }
+
+        /// <summary>
+        /// 手机号
+        /// </summary>
+        public string phone { get; set; }
+    }
+}

+ 36 - 0
Util/UnionPay/FileItem.cs

@@ -0,0 +1,36 @@
+using System;
+
+namespace MySystem.Util.UnionPay
+{
+    /// <summary>
+    /// 文件项
+    /// </summary>
+    public class FileItem
+    {
+        private byte[] content;
+        private string fileName;
+        private string mimeType;
+
+        public FileItem(byte[] content, string fileName, string mimeType)
+        {
+            this.content = content;
+            this.fileName = fileName;
+            this.mimeType = mimeType;
+        }
+
+        public byte[] GetContent()
+        {
+            return content;
+        }
+
+        public string GetFileName()
+        {
+            return fileName;
+        }
+
+        public string GetMimeType()
+        {
+            return mimeType;
+        }
+    }
+}

+ 231 - 0
Util/UnionPay/UnionPayBase.cs

@@ -0,0 +1,231 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Net;
+using System.Text;
+using Library;
+using LitJson;
+using MySystem.Entity.UnionPay;
+using Org.BouncyCastle.Crypto.Digests;
+using Org.BouncyCastle.Crypto.Macs;
+using Org.BouncyCastle.Crypto.Parameters;
+
+namespace MySystem.Util.UnionPay
+{
+    /// <summary>
+    /// 银联支付基础类
+    /// </summary>
+    public class UnionPayBase
+    {
+        // 测试环境
+        protected string UnionPayRequestUrl = "https://t-uts.lepass.cn";
+        protected string UnionPayAppId = "test_app_id";
+        protected string UnionPayAppSecret = "test_app_secret";
+        protected string UnionPayPublicKey = "";
+
+        // 生产环境
+        // protected string UnionPayRequestUrl = "https://uts.leshuazf.com";
+        // protected string UnionPayAppId = "prod_app_id";
+        // protected string UnionPayAppSecret = "prod_app_secret";
+        // protected string UnionPayPublicKey = "";
+
+        /// <summary>
+        /// 创建银联请求对象
+        /// </summary>
+        /// <typeparam name="T">业务数据类型</typeparam>
+        /// <param name="agentId">服务商编号</param>
+        /// <param name="currentAgentId">当前代理商编号</param>
+        /// <param name="businessData">业务数据</param>
+        /// <param name="useSM3">是否使用国密验签</param>
+        /// <returns>银联请求对象</returns>
+        protected UnionPayRequest<T> CreateRequest<T>(string agentId, string currentAgentId, T businessData, bool useSM3 = true)
+        {
+            // 创建请求对象
+            var request = new UnionPayRequest<T>
+            {
+                agentId = agentId,
+                currentAgentId = currentAgentId,
+                algorithm = useSM3,
+                data = businessData
+            };
+
+            // 序列化业务数据
+            string dataJson = Newtonsoft.Json.JsonConvert.SerializeObject(businessData);
+            
+            // 根据算法生成签名
+            request.sign = GenerateSignatureByAlgorithm(dataJson, useSM3);
+
+            return request;
+        }
+
+        /// <summary>
+        /// 根据算法生成签名
+        /// </summary>
+        /// <param name="data">待签名数据</param>
+        /// <param name="useSM3">是否使用国密验签</param>
+        /// <returns>签名字符串</returns>
+        protected string GenerateSignatureByAlgorithm(string data, bool useSM3 = true)
+        {
+            if (useSM3)
+            {
+                // 使用国密SM3算法
+                return SM3Encrypt(UnionPayAppSecret, data);
+            }
+            else
+            {
+                // 使用MD5算法
+                return MD5Encrypt(UnionPayAppSecret, data);
+            }
+        }
+
+        /// <summary>
+        /// 国密验签,推荐使用
+        /// </summary>
+        /// <param name="key">密钥</param>
+        /// <param name="srcData">待加密数据</param>
+        /// <returns>加密后的字符串</returns>
+        protected static string SM3Encrypt(string key, string srcData)
+        {
+            LogHelper.Instance.WriteLog("SM3Encrypt,待加密数据:" + srcData, "银联SM3加密", true);
+            byte[] result = Hmac(key, srcData);
+            return Convert.ToBase64String(result);
+        }
+
+        /// <summary>
+        /// HMAC计算
+        /// </summary>
+        /// <param name="key">密钥</param>
+        /// <param name="srcData">源数据</param>
+        /// <returns>计算结果</returns>
+        private static byte[] Hmac(byte[] key, byte[] srcData)
+        {
+            KeyParameter keyParameter = new KeyParameter(key);
+            SM3Digest digest = new SM3Digest();
+            HMac mac = new HMac(digest);
+            mac.Init(keyParameter);
+            mac.BlockUpdate(srcData, 0, srcData.Length);
+            byte[] result = new byte[mac.GetMacSize()];
+            mac.DoFinal(result, 0);
+            return result;
+        }
+
+        /// <summary>
+        /// HMAC计算
+        /// </summary>
+        /// <param name="key">密钥</param>
+        /// <param name="srcData">源数据</param>
+        /// <returns>计算结果</returns>
+        private static byte[] Hmac(string key, string srcData)
+        {
+            return Hmac(Encoding.UTF8.GetBytes(key), Encoding.UTF8.GetBytes(srcData));
+        }
+
+        /// <summary>
+        /// MD5验签
+        /// </summary>
+        /// <param name="key">密钥</param>
+        /// <param name="srcData">待加密数据</param>
+        /// <returns>加密后的字符串</returns>
+        protected static string MD5Encrypt(string key, string srcData)
+        {
+            LogHelper.Instance.WriteLog("MD5Encrypt,待加密数据:" + srcData, "银联MD5加密", true);
+            string signStr = key + srcData;
+            using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create())
+            {
+                byte[] inputBytes = Encoding.UTF8.GetBytes(signStr);
+                byte[] hashBytes = md5.ComputeHash(inputBytes);
+                StringBuilder sb = new StringBuilder();
+                for (int i = 0; i < hashBytes.Length; i++)
+                {
+                    sb.Append(hashBytes[i].ToString("X2"));
+                }
+                return sb.ToString();
+            }
+        }
+
+        /// <summary>
+        /// 发送HTTP POST请求
+        /// </summary>
+        /// <param name="postUrl">请求地址</param>
+        /// <param name="paramData">请求参数</param>
+        /// <param name="headers">请求头</param>
+        /// <returns>响应结果</returns>
+        protected string PostWebRequest(string postUrl, string paramData, Dictionary<string, string> headers)
+        {
+            string ret = string.Empty;
+            try
+            {
+                string logString = "";
+                logString += "\n" + DateTime.Now.ToString();
+                logString += "\n" + postUrl;
+                logString += "\n" + paramData;
+                byte[] postData = System.Text.Encoding.UTF8.GetBytes(paramData);
+
+                System.Net.HttpWebRequest request = System.Net.WebRequest.Create(postUrl) as System.Net.HttpWebRequest;
+                System.Text.Encoding myEncoding = System.Text.Encoding.UTF8;
+                request.Method = "POST";
+                request.KeepAlive = false;
+                request.AllowAutoRedirect = true;
+                request.ContentType = "application/json";
+                foreach (string key in headers.Keys)
+                {
+                    if (key != "Content-Type")
+                    {
+                        request.Headers.Add(key, headers[key]);
+                    }
+                    else
+                    {
+                        request.ContentType = headers[key];
+                    }
+                }
+                request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)";
+                request.ContentLength = postData.Length;
+
+                using (System.IO.Stream outputStream = request.GetRequestStream())
+                {
+                    outputStream.Write(postData, 0, postData.Length);
+                    outputStream.Close();
+                }
+
+                using (System.Net.HttpWebResponse response = request.GetResponse() as System.Net.HttpWebResponse)
+                {
+                    using (System.IO.Stream responseStream = response.GetResponseStream())
+                    {
+                        using (System.IO.StreamReader reader = new System.IO.StreamReader(responseStream, System.Text.Encoding.UTF8))
+                        {
+                            ret = reader.ReadToEnd();
+                            logString += "\n" + ret;
+                            LogHelper.Instance.WriteLog(logString, "请求联合收单API日志", true);
+                        }
+                    }
+                }
+            }
+            catch (System.Net.WebException ex)
+            {
+                if (ex.Response != null)
+                {
+                    using (System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)ex.Response)
+                    {
+                        using (System.IO.Stream stream = response.GetResponseStream())
+                        {
+                            using (System.IO.StreamReader reader = new System.IO.StreamReader(stream, System.Text.Encoding.UTF8))
+                            {
+                                string errorMsg = reader.ReadToEnd();
+                                LogHelper.Instance.WriteLog(DateTime.Now.ToString() + "\r\n" + ex.ToString() + "\r\n" + errorMsg, "请求联合收单API异常", true);
+                            }
+                        }
+                    }
+                }
+                else
+                {
+                    LogHelper.Instance.WriteLog(DateTime.Now.ToString() + "\r\n" + ex.ToString(), "请求联合收单API异常", true);
+                }
+            }
+            catch (Exception ex)
+            {
+                LogHelper.Instance.WriteLog(DateTime.Now.ToString() + "\r\n" + ex.ToString(), "请求联合收单API异常", true);
+            }
+            return ret;
+        }
+    }
+}

+ 251 - 0
Util/UnionPay/UnionPayHelper.cs

@@ -0,0 +1,251 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Net;
+using System.Text;
+using Library;
+using LitJson;
+using MySystem.Entity.UnionPay;
+using Org.BouncyCastle.Crypto.Digests;
+using Org.BouncyCastle.Crypto.Macs;
+using Org.BouncyCastle.Crypto.Parameters;
+
+namespace MySystem.Util.UnionPay
+{
+    /// <summary>
+    /// 联合收单接口帮助类
+    /// </summary>
+    public class UnionPayHelper : UnionPayBase
+    {
+        public readonly static UnionPayHelper Instance = new UnionPayHelper();
+        private UnionPayHelper()
+        {
+        }
+
+
+        /// <summary>
+        /// 上传图片
+        /// </summary>
+        /// <param name="uploadRequest">上传图片请求参数</param>
+        /// <returns>上传结果</returns>
+        public UnionPayResponse<UnionPayUploadPicResponseData> UnionPayUploadPic(UnionPayUploadPicRequest uploadRequest)
+        {
+            // 使用CreateRequest方法创建请求对象,确保sign是用国密SM3对业务数据data字段进行签名的
+            var request = CreateRequest(UnionPayAppId, UnionPayAppId, uploadRequest);
+
+            // 调用新的方法
+            string logString = "";
+            logString += "\n" + DateTime.Now.ToString();
+
+            try
+            {
+                // 序列化请求参数
+                string req = Newtonsoft.Json.JsonConvert.SerializeObject(request);
+
+                // 记录请求日志
+                logString += "\n" + "请求参数\n" + req;
+                logString += "\n" + "请求地址:" + UnionPayRequestUrl + "/open-api/common/uploadPic";
+
+                // 发送请求
+                string result = PostWebRequest(UnionPayRequestUrl + "/open-api/common/uploadPic", req, new Dictionary<string, string>());
+
+                // 记录响应日志
+                logString += "\n" + "返回\n" + result + "\n\n";
+                LogHelper.Instance.WriteLog(logString, "银联上传图片", true);
+
+                // 反序列化为UnionPayResponse
+                return Newtonsoft.Json.JsonConvert.DeserializeObject<UnionPayResponse<UnionPayUploadPicResponseData>>(result);
+            }
+            catch (Exception ex)
+            {
+                logString += "\n" + "异常:" + ex.ToString();
+                LogHelper.Instance.WriteLog(logString, "银联上传图片异常", true);
+                return new UnionPayResponse<UnionPayUploadPicResponseData>
+                {
+                    error_code = "9999",
+                    error_msg = "系统异常"
+                };
+            }
+        }
+
+        /// <summary>
+        /// 获取行业编码
+        /// </summary>
+        /// <param name="mccRequest">获取行业编码请求参数</param>
+        /// <returns>行业编码列表</returns>
+        public UnionPayResponse<List<UnionPayMccInfo>> GetMccList(UnionPayMccListRequest mccRequest)
+        {
+            // 使用CreateRequest方法创建请求对象,确保sign是用国密SM3对业务数据data字段进行签名的
+            var request = CreateRequest(UnionPayAppId, UnionPayAppId, mccRequest);
+
+            string logString = "";
+            logString += "\n" + DateTime.Now.ToString();
+
+            try
+            {
+                // 序列化请求参数
+                string req = Newtonsoft.Json.JsonConvert.SerializeObject(request);
+
+                // 记录请求日志
+                logString += "\n" + "请求参数\n" + req;
+                logString += "\n" + "请求地址:" + UnionPayRequestUrl + "/open-api/mcc/mccList";
+
+                // 发送请求
+                string result = PostWebRequest(UnionPayRequestUrl + "/open-api/mcc/mccList", req, new Dictionary<string, string>());
+
+                // 记录响应日志
+                logString += "\n" + "返回\n" + result + "\n\n";
+                LogHelper.Instance.WriteLog(logString, "银联获取行业编码", true);
+
+                // 反序列化为UnionPayResponse
+                return Newtonsoft.Json.JsonConvert.DeserializeObject<UnionPayResponse<List<UnionPayMccInfo>>>(result);
+            }
+            catch (Exception ex)
+            {
+                logString += "\n" + "异常:" + ex.ToString();
+                LogHelper.Instance.WriteLog(logString, "银联获取行业编码异常", true);
+                return new UnionPayResponse<List<UnionPayMccInfo>>
+                {
+                    error_code = "9999",
+                    error_msg = "系统异常"
+                };
+            }
+        }
+
+        /// <summary>
+        /// 获取地区编码
+        /// </summary>
+        /// <param name="areaCodeRequest">获取地区编码请求参数</param>
+        /// <returns>地区编码列表</returns>
+        public UnionPayResponse<List<UnionPayAreaCodeInfo>> GetAreaCode(UnionPayAreaCodeRequest areaCodeRequest)
+        {
+            // 使用CreateRequest方法创建请求对象,确保sign是用国密SM3对业务数据data字段进行签名的
+            var request = CreateRequest(UnionPayAppId, UnionPayAppId, areaCodeRequest);
+
+            string logString = "";
+            logString += "\n" + DateTime.Now.ToString();
+
+            try
+            {
+                // 序列化请求参数
+                string req = Newtonsoft.Json.JsonConvert.SerializeObject(request);
+
+                // 记录请求日志
+                logString += "\n" + "请求参数\n" + req;
+                logString += "\n" + "请求地址:" + UnionPayRequestUrl + "/open-api/base/areaCode";
+
+                // 发送请求
+                string result = PostWebRequest(UnionPayRequestUrl + "/open-api/base/areaCode", req, new Dictionary<string, string>());
+
+                // 记录响应日志
+                logString += "\n" + "返回\n" + result + "\n\n";
+                LogHelper.Instance.WriteLog(logString, "银联获取地区编码", true);
+
+                // 反序列化为UnionPayResponse
+                return Newtonsoft.Json.JsonConvert.DeserializeObject<UnionPayResponse<List<UnionPayAreaCodeInfo>>>(result);
+            }
+            catch (Exception ex)
+            {
+                logString += "\n" + "异常:" + ex.ToString();
+                LogHelper.Instance.WriteLog(logString, "银联获取地区编码异常", true);
+                return new UnionPayResponse<List<UnionPayAreaCodeInfo>>
+                {
+                    error_code = "9999",
+                    error_msg = "系统异常"
+                };
+            }
+        }
+
+        /// <summary>
+        /// 获取银行列表
+        /// </summary>
+        /// <param name="bankListRequest">获取银行列表请求参数</param>
+        /// <returns>银行列表</returns>
+        public UnionPayResponse<List<UnionPayBankInfo>> GetBankList(UnionPayBankListRequest bankListRequest)
+        {
+            // 使用CreateRequest方法创建请求对象,确保sign是用国密SM3对业务数据data字段进行签名的
+            var request = CreateRequest(UnionPayAppId, UnionPayAppId, bankListRequest);
+
+            string logString = "";
+            logString += "\n" + DateTime.Now.ToString();
+
+            try
+            {
+                // 序列化请求参数
+                string req = Newtonsoft.Json.JsonConvert.SerializeObject(request);
+
+                // 记录请求日志
+                logString += "\n" + "请求参数\n" + req;
+                logString += "\n" + "请求地址:" + UnionPayRequestUrl + "/open-api/base/bankList";
+
+                // 发送请求
+                string result = PostWebRequest(UnionPayRequestUrl + "/open-api/base/bankList", req, new Dictionary<string, string>());
+
+                // 记录响应日志
+                logString += "\n" + "返回\n" + result + "\n\n";
+                LogHelper.Instance.WriteLog(logString, "银联获取银行列表", true);
+
+                // 反序列化为UnionPayResponse
+                return Newtonsoft.Json.JsonConvert.DeserializeObject<UnionPayResponse<List<UnionPayBankInfo>>>(result);
+            }
+            catch (Exception ex)
+            {
+                logString += "\n" + "异常:" + ex.ToString();
+                LogHelper.Instance.WriteLog(logString, "银联获取银行列表异常", true);
+                return new UnionPayResponse<List<UnionPayBankInfo>>
+                {
+                    error_code = "9999",
+                    error_msg = "系统异常"
+                };
+            }
+        }
+
+        /// <summary>
+        /// 获取银行网点列表
+        /// </summary>
+        /// <param name="branchListRequest">获取银行网点列表请求参数</param>
+        /// <returns>银行网点列表</returns>
+        public UnionPayResponse<List<UnionPayBranchInfo>> GetBranchList(UnionPayBranchListRequest branchListRequest)
+        {
+            // 使用CreateRequest方法创建请求对象,确保sign是用国密SM3对业务数据data字段进行签名的
+            var request = CreateRequest(UnionPayAppId, UnionPayAppId, branchListRequest);
+
+            string logString = "";
+            logString += "\n" + DateTime.Now.ToString();
+
+            try
+            {
+                // 序列化请求参数
+                string req = Newtonsoft.Json.JsonConvert.SerializeObject(request);
+
+                // 记录请求日志
+                logString += "\n" + "请求参数\n" + req;
+                logString += "\n" + "请求地址:" + UnionPayRequestUrl + "/open-api/base/branchList";
+
+                // 发送请求
+                string result = PostWebRequest(UnionPayRequestUrl + "/open-api/base/branchList", req, new Dictionary<string, string>());
+
+                // 记录响应日志
+                logString += "\n" + "返回\n" + result + "\n\n";
+                LogHelper.Instance.WriteLog(logString, "银联获取银行网点列表", true);
+
+                // 反序列化为UnionPayResponse
+                return Newtonsoft.Json.JsonConvert.DeserializeObject<UnionPayResponse<List<UnionPayBranchInfo>>>(result);
+            }
+            catch (Exception ex)
+            {
+                logString += "\n" + "异常:" + ex.ToString();
+                LogHelper.Instance.WriteLog(logString, "银联获取银行网点列表异常", true);
+                return new UnionPayResponse<List<UnionPayBranchInfo>>
+                {
+                    error_code = "9999",
+                    error_msg = "系统异常"
+                };
+            }
+        }
+
+
+    }
+
+
+}

+ 243 - 0
Util/UnionPay/UnionPayMerchantTradeHelper.cs

@@ -0,0 +1,243 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Net;
+using System.Text;
+using Library;
+using LitJson;
+using MySystem.Entity.UnionPay;
+using Org.BouncyCastle.Crypto.Digests;
+using Org.BouncyCastle.Crypto.Macs;
+using Org.BouncyCastle.Crypto.Parameters;
+
+namespace MySystem.Util.UnionPay
+{
+    /// <summary>
+    /// 银联商户交易帮助类
+    /// </summary>
+    public class UnionPayMerchantTradeHelper : UnionPayBase
+    {
+        public readonly static UnionPayMerchantTradeHelper Instance = new UnionPayMerchantTradeHelper();
+        private UnionPayMerchantTradeHelper()
+        {
+        }
+
+        /// <summary>
+        /// 商户注册
+        /// </summary>
+        /// <param name="merchantInfo">商户信息</param>
+        /// <returns>注册结果</returns>
+        public UnionPayResponse<UnionPayMerchantRegisterResponse> MerchantRegister(UnionPayMerchantRegisterRequest merchantInfo)
+        {
+            // 使用CreateRequest方法创建请求对象,确保sign是用国密SM3对业务数据data字段进行签名的
+            var request = CreateRequest(UnionPayAppId, UnionPayAppId, merchantInfo);
+
+            // 调用新的方法
+            string logString = "";
+            logString += "\n" + DateTime.Now.ToString();
+
+            try
+            {
+                // 序列化请求参数
+                string req = Newtonsoft.Json.JsonConvert.SerializeObject(request);
+
+                logString += "\n" + "请求参数\n" + req;
+                logString += "\n" + "请求地址:" + UnionPayRequestUrl + "/open-api/merchant/register";
+                string result = PostWebRequest(UnionPayRequestUrl + "/open-api/merchant/register", req, new Dictionary<string, string>());
+                logString += "\n" + "返回\n" + result + "\n\n";
+                LogHelper.Instance.WriteLog(logString, "联合收单商户注册", true);
+
+                // 反序列化为UnionPayResponse
+                return Newtonsoft.Json.JsonConvert.DeserializeObject<UnionPayResponse<UnionPayMerchantRegisterResponse>>(result);
+            }
+            catch (Exception ex)
+            {
+                logString += "\n" + "异常:" + ex.ToString();
+                LogHelper.Instance.WriteLog(logString, "联合收单商户注册异常", true);
+                return new UnionPayResponse<UnionPayMerchantRegisterResponse>
+                {
+                    error_code = "9999",
+                    error_msg = "系统异常"
+                };
+            }
+        }
+
+        /// <summary>
+        /// 获取证件类型列表
+        /// </summary>
+        /// <param name="idCardTypesRequest">获取证件类型列表请求参数</param>
+        /// <returns>证件类型列表</returns>
+        public UnionPayResponse<List<UnionPayIdCardTypeInfo>> GetIdCardTypes(UnionPayIdCardTypesRequest idCardTypesRequest)
+        {
+            // 使用CreateRequest方法创建请求对象,确保sign是用国密SM3对业务数据data字段进行签名的
+            var request = CreateRequest(UnionPayAppId, UnionPayAppId, idCardTypesRequest);
+
+            string logString = "";
+            logString += "\n" + DateTime.Now.ToString();
+
+            try
+            {
+                // 序列化请求参数
+                string req = Newtonsoft.Json.JsonConvert.SerializeObject(request);
+
+                // 记录请求日志
+                logString += "\n" + "请求参数\n" + req;
+                logString += "\n" + "请求地址:" + UnionPayRequestUrl + "/open-api/agentManager/getIdCardTypes";
+
+                // 发送请求
+                string result = PostWebRequest(UnionPayRequestUrl + "/open-api/agentManager/getIdCardTypes", req, new Dictionary<string, string>());
+
+                // 记录响应日志
+                logString += "\n" + "返回\n" + result + "\n\n";
+                LogHelper.Instance.WriteLog(logString, "银联获取证件类型列表", true);
+
+                // 反序列化为UnionPayResponse
+                return Newtonsoft.Json.JsonConvert.DeserializeObject<UnionPayResponse<List<UnionPayIdCardTypeInfo>>>(result);
+            }
+            catch (Exception ex)
+            {
+                logString += "\n" + "异常:" + ex.ToString();
+                LogHelper.Instance.WriteLog(logString, "银联获取证件类型列表异常", true);
+                return new UnionPayResponse<List<UnionPayIdCardTypeInfo>>
+                {
+                    error_code = "9999",
+                    error_msg = "系统异常"
+                };
+            }
+        }
+
+        /// <summary>
+        /// 获取商户详情
+        /// </summary>
+        /// <param name="merchantDetailRequest">获取商户详情请求参数</param>
+        /// <returns>商户详情</returns>
+        public UnionPayResponse<UnionPayMerchantDetailResponseData> GetMerchantDetail(UnionPayMerchantDetailRequest merchantDetailRequest)
+        {
+            // 使用CreateRequest方法创建请求对象,确保sign是用国密SM3对业务数据data字段进行签名的
+            var request = CreateRequest(UnionPayAppId, UnionPayAppId, merchantDetailRequest);
+
+            string logString = "";
+            logString += "\n" + DateTime.Now.ToString();
+
+            try
+            {
+                // 序列化请求参数
+                string req = Newtonsoft.Json.JsonConvert.SerializeObject(request);
+
+                // 记录请求日志
+                logString += "\n" + "请求参数\n" + req;
+                logString += "\n" + "请求地址:" + UnionPayRequestUrl + "/open-api/merchant/getMerchantDetail";
+
+                // 发送请求
+                string result = PostWebRequest(UnionPayRequestUrl + "/open-api/merchant/getMerchantDetail", req, new Dictionary<string, string>());
+
+                // 记录响应日志
+                logString += "\n" + "返回\n" + result + "\n\n";
+                LogHelper.Instance.WriteLog(logString, "银联获取商户详情", true);
+
+                // 反序列化为UnionPayResponse
+                return Newtonsoft.Json.JsonConvert.DeserializeObject<UnionPayResponse<UnionPayMerchantDetailResponseData>>(result);
+            }
+            catch (Exception ex)
+            {
+                logString += "\n" + "异常:" + ex.ToString();
+                LogHelper.Instance.WriteLog(logString, "银联获取商户详情异常", true);
+                return new UnionPayResponse<UnionPayMerchantDetailResponseData>
+                {
+                    error_code = "9999",
+                    error_msg = "系统异常"
+                };
+            }
+        }
+
+        /// <summary>
+        /// 更新商户信息
+        /// </summary>
+        /// <param name="updateRequest">更新商户信息请求参数</param>
+        /// <returns>更新结果</returns>
+        public UnionPayResponse UpdateMerchantInfo(UnionPayUpdateMerchantInfoRequest updateRequest)
+        {
+            // 使用CreateRequest方法创建请求对象,确保sign是用国密SM3对业务数据data字段进行签名的
+            var request = CreateRequest(UnionPayAppId, UnionPayAppId, updateRequest);
+
+            string logString = "";
+            logString += "\n" + DateTime.Now.ToString();
+
+            try
+            {
+                // 序列化请求参数
+                string req = Newtonsoft.Json.JsonConvert.SerializeObject(request);
+
+                // 记录请求日志
+                logString += "\n" + "请求参数\n" + req;
+                logString += "\n" + "请求地址:" + UnionPayRequestUrl + "/open-api/merchant/updateMerchantInfo";
+
+                // 发送请求
+                string result = PostWebRequest(UnionPayRequestUrl + "/open-api/merchant/updateMerchantInfo", req, new Dictionary<string, string>());
+
+                // 记录响应日志
+                logString += "\n" + "返回\n" + result + "\n\n";
+                LogHelper.Instance.WriteLog(logString, "银联更新商户信息", true);
+
+                // 反序列化为UnionPayResponse
+                return Newtonsoft.Json.JsonConvert.DeserializeObject<UnionPayResponse>(result);
+            }
+            catch (Exception ex)
+            {
+                logString += "\n" + "异常:" + ex.ToString();
+                LogHelper.Instance.WriteLog(logString, "银联更新商户信息异常", true);
+                return new UnionPayResponse
+                {
+                    error_code = "9999",
+                    error_msg = "系统异常"
+                };
+            }
+        }
+
+        /// <summary>
+        /// 处理商户审核信息回调
+        /// </summary>
+        /// <param name="callbackRequest">商户审核回调请求参数</param>
+        /// <returns>回调处理结果</returns>
+        public UnionPayResponse ProcessMerchantReviewCallback(UnionPayMerchantReviewCallbackRequest callbackRequest)
+        {
+            string logString = "";
+            logString += "\n" + DateTime.Now.ToString();
+
+            try
+            {
+                // 序列化请求参数记录日志
+                string req = Newtonsoft.Json.JsonConvert.SerializeObject(callbackRequest);
+                logString += "\n" + "商户审核回调请求参数\n" + req;
+
+                // TODO: 实现具体的回调处理逻辑
+                // 1. 验证商户信息
+                // 2. 更新商户状态
+                // 3. 记录审核日志
+                // 4. 触发后续业务流程(如通知商户等)
+
+                logString += "\n" + "商户审核回调处理成功";
+                LogHelper.Instance.WriteLog(logString, "银联商户审核回调处理", true);
+
+                // 返回成功响应
+                return new UnionPayResponse
+                {
+                    error_code = "0",
+                    error_msg = "success",
+                    count = 0,
+                    data = null
+                };
+            }
+            catch (Exception ex)
+            {
+                logString += "\n" + "异常:" + ex.ToString();
+                LogHelper.Instance.WriteLog(logString, "银联商户审核回调处理异常", true);
+                return new UnionPayResponse
+                {
+                    error_code = "9999",
+                    error_msg = "系统异常"
+                };
+            }
+        }
+    }
+}

+ 147 - 0
Util/UnionPay/UnionPayTradeSettlementHelper.cs

@@ -0,0 +1,147 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Net;
+using System.Text;
+using Library;
+using LitJson;
+using MySystem.Entity.UnionPay;
+using Org.BouncyCastle.Crypto.Digests;
+using Org.BouncyCastle.Crypto.Macs;
+using Org.BouncyCastle.Crypto.Parameters;
+
+namespace MySystem.Util.UnionPay
+{
+    /// <summary>
+    /// 银联交易结算帮助类
+    /// </summary>
+    public class UnionPayTradeSettlementHelper : UnionPayBase
+    {
+        public readonly static UnionPayTradeSettlementHelper Instance = new UnionPayTradeSettlementHelper();
+        private UnionPayTradeSettlementHelper()
+        {
+        }
+
+        /// <summary>
+        /// 查询订单交易结算信息
+        /// </summary>
+        /// <param name="request">交易结算查询请求参数</param>
+        /// <returns>交易结算信息列表</returns>
+        public UnionPayResponse<List<UnionPayTradeDetailInfo>> ListTradeDetail(UnionPayListTradeDetailRequest request)
+        {
+            // 使用CreateRequest方法创建请求对象,确保sign是用国密SM3对业务数据data字段进行签名的
+            var unionPayRequest = CreateRequest(UnionPayAppId, UnionPayAppId, request);
+
+            string logString = "";
+            logString += "\n" + DateTime.Now.ToString();
+
+            try
+            {
+                // 序列化请求参数
+                string req = Newtonsoft.Json.JsonConvert.SerializeObject(unionPayRequest);
+
+                // 记录请求日志
+                logString += "\n" + "请求参数\n" + req;
+                logString += "\n" + "请求地址:" + UnionPayRequestUrl + "/open-api/tradeDetail/listTradeDetail";
+
+                // 发送请求
+                string result = PostWebRequest(UnionPayRequestUrl + "/open-api/tradeDetail/listTradeDetail", req, new Dictionary<string, string>());
+
+                // 记录响应日志
+                logString += "\n" + "返回\n" + result + "\n\n";
+                LogHelper.Instance.WriteLog(logString, "银联交易结算详情查询", true);
+
+                // 反序列化为UnionPayResponse
+                return Newtonsoft.Json.JsonConvert.DeserializeObject<UnionPayResponse<List<UnionPayTradeDetailInfo>>>(result);
+            }
+            catch (Exception ex)
+            {
+                logString += "\n" + "异常:" + ex.ToString();
+                LogHelper.Instance.WriteLog(logString, "银联交易结算详情查询异常", true);
+                return new UnionPayResponse<List<UnionPayTradeDetailInfo>>
+                {
+                    error_code = "9999",
+                    error_msg = "系统异常"
+                };
+            }
+        }
+
+        /// <summary>
+        /// 处理交易结算实时推送
+        /// </summary>
+        /// <param name="pushRequest">交易结算推送请求参数</param>
+        /// <returns>处理结果</returns>
+        public UnionPayResponse ProcessSettlementPush(UnionPaySettlementPushRequest pushRequest)
+        {
+            string logString = "";
+            logString += "\n" + DateTime.Now.ToString();
+
+            try
+            {
+                // 序列化请求参数记录日志
+                string req = Newtonsoft.Json.JsonConvert.SerializeObject(pushRequest);
+                logString += "\n" + "交易结算实时推送请求参数\n" + req;
+
+                // 根据推送类型处理不同的数据
+                if (pushRequest.type == 0)
+                {
+                    // 处理交易数据
+                    TransactionDetailInfo transactionInfo = pushRequest.ToTransactionDetailInfo();
+                    logString += "\n" + "处理交易数据,订单号:" + transactionInfo.orderId;
+
+                    // TODO: 实现交易数据处理逻辑
+                    // 1. 验证交易信息
+                    // 2. 更新交易状态
+                    // 3. 记录交易日志
+                    // 4. 触发后续业务流程
+                }
+                else if (pushRequest.type == 1)
+                {
+                    // 处理结算数据
+                    SettlementDetailInfo settlementInfo = pushRequest.ToSettlementDetailInfo();
+                    logString += "\n" + "处理结算数据,订单号:" + settlementInfo.orderId;
+
+                    // TODO: 实现结算数据处理逻辑
+                    // 1. 验证结算信息
+                    // 2. 更新结算状态
+                    // 3. 记录结算日志
+                    // 4. 触发后续业务流程
+                }
+                else
+                {
+                    logString += "\n" + "未知的推送类型:" + pushRequest.type;
+                    LogHelper.Instance.WriteLog(logString, "银联交易结算实时推送处理异常", true);
+                    return new UnionPayResponse
+                    {
+                        error_code = "400",
+                        error_msg = "参数错误",
+                        count = 0,
+                        data = null
+                    };
+                }
+
+                logString += "\n" + "交易结算实时推送处理成功";
+                LogHelper.Instance.WriteLog(logString, "银联交易结算实时推送处理", true);
+
+                // 返回成功响应
+                return new UnionPayResponse
+                {
+                    error_code = "0",
+                    error_msg = "success",
+                    count = 0,
+                    data = null
+                };
+            }
+            catch (Exception ex)
+            {
+                logString += "\n" + "异常:" + ex.ToString();
+                LogHelper.Instance.WriteLog(logString, "银联交易结算实时推送处理异常", true);
+                return new UnionPayResponse
+                {
+                    error_code = "9999",
+                    error_msg = "系统异常"
+                };
+            }
+        }
+    }
+}