商户微信支付配置

This commit is contained in:
马梓彭 2026-03-26 00:09:20 +08:00
parent 6ace257b7d
commit bf896352a3
6 changed files with 215 additions and 1 deletions

View File

@ -52,4 +52,9 @@ public class AddMerchantInput
/// 审核状态 /// 审核状态
/// </summary> /// </summary>
public AuditStatus? AuditStatus { get; set; } public AuditStatus? AuditStatus { get; set; }
/// <summary>
/// 微信支付配置
/// </summary>
public WeChatPayConfigInputDto? WeChatPayConfig { get; set; }
} }

View File

@ -71,4 +71,9 @@ public class MerchantOutput
/// 更新时间 /// 更新时间
/// </summary> /// </summary>
public DateTime? UpdatedTime { get; set; } public DateTime? UpdatedTime { get; set; }
/// <summary>
/// 微信支付配置
/// </summary>
public WeChatPayConfigDto? WeChatPayConfig { get; set; }
} }

View File

@ -0,0 +1,44 @@
using YD_Event.Core.Enum;
namespace YD_Event.Application.Merchant.Dtos;
/// <summary>
/// 微信支付配置DTO
/// </summary>
public class WeChatPayConfigDto
{
/// <summary>
/// 主键Id
/// </summary>
public long Id { get; set; }
/// <summary>
/// 商户ID(外键)
/// </summary>
public long MerchantId { get; set; }
/// <summary>
/// 微信支付商户号
/// </summary>
public string MerchantIdValue { get; set; }
/// <summary>
/// 微信支付 APIv3 密钥
/// </summary>
public string MerchantV3Secret { get; set; }
/// <summary>
/// 微信支付商户证书序列号
/// </summary>
public string MerchantCertificateSerialNumber { get; set; }
/// <summary>
/// 微信支付商户私钥(PEM格式)
/// </summary>
public string MerchantCertificatePrivateKey { get; set; }
/// <summary>
/// 可用状态
/// </summary>
public AvailabilityStatus Status { get; set; }
}

View File

@ -0,0 +1,39 @@
using System.ComponentModel.DataAnnotations;
using YD_Event.Core.Enum;
namespace YD_Event.Application.Merchant.Dtos;
/// <summary>
/// 微信支付配置输入DTO
/// </summary>
public class WeChatPayConfigInputDto
{
/// <summary>
/// 微信支付商户号
/// </summary>
[Required(ErrorMessage = "微信支付商户号不能为空")]
public string MerchantIdValue { get; set; }
/// <summary>
/// 微信支付 APIv3 密钥
/// </summary>
[Required(ErrorMessage = "微信支付 APIv3 密钥不能为空")]
public string MerchantV3Secret { get; set; }
/// <summary>
/// 微信支付商户证书序列号
/// </summary>
[Required(ErrorMessage = "微信支付商户证书序列号不能为空")]
public string MerchantCertificateSerialNumber { get; set; }
/// <summary>
/// 微信支付商户私钥(PEM格式)
/// </summary>
[Required(ErrorMessage = "微信支付商户私钥不能为空")]
public string MerchantCertificatePrivateKey { get; set; }
/// <summary>
/// 可用状态
/// </summary>
public AvailabilityStatus Status { get; set; } = AvailabilityStatus.Enable;
}

View File

@ -14,6 +14,7 @@ public class MerchantService : BaseService<YD_Event.Core.Entities.Merchant>, ITr
{ {
private readonly ISqlSugarRepository<YD_Event.Core.Entities.Merchant> _repository; private readonly ISqlSugarRepository<YD_Event.Core.Entities.Merchant> _repository;
private readonly ISqlSugarRepository<UserCoupon> _userCouponRepository; private readonly ISqlSugarRepository<UserCoupon> _userCouponRepository;
private readonly ISqlSugarRepository<WeChatPayConfig> _weChatPayConfigRepository;
private readonly AuthManager _authManager; private readonly AuthManager _authManager;
private readonly IIdGenerator _idGenerator; private readonly IIdGenerator _idGenerator;
private readonly IMemoryCache _memoryCache; private readonly IMemoryCache _memoryCache;
@ -21,6 +22,7 @@ public class MerchantService : BaseService<YD_Event.Core.Entities.Merchant>, ITr
public MerchantService(ISqlSugarRepository<YD_Event.Core.Entities.Merchant> repository, public MerchantService(ISqlSugarRepository<YD_Event.Core.Entities.Merchant> repository,
ISqlSugarRepository<UserCoupon> userCouponRepository, ISqlSugarRepository<UserCoupon> userCouponRepository,
ISqlSugarRepository<WeChatPayConfig> weChatPayConfigRepository,
AuthManager authManager, AuthManager authManager,
IIdGenerator idGenerator, IIdGenerator idGenerator,
IMemoryCache memoryCache, IMemoryCache memoryCache,
@ -28,6 +30,7 @@ public class MerchantService : BaseService<YD_Event.Core.Entities.Merchant>, ITr
{ {
_repository = repository; _repository = repository;
_userCouponRepository = userCouponRepository; _userCouponRepository = userCouponRepository;
_weChatPayConfigRepository = weChatPayConfigRepository;
_authManager = authManager; _authManager = authManager;
_idGenerator = idGenerator; _idGenerator = idGenerator;
_memoryCache = memoryCache; _memoryCache = memoryCache;
@ -163,11 +166,20 @@ public class MerchantService : BaseService<YD_Event.Core.Entities.Merchant>, ITr
/// </summary> /// </summary>
[DisplayName("添加商户")] [DisplayName("添加商户")]
[HttpPost("add")] [HttpPost("add")]
[UnitOfWork]
public async Task Add(AddMerchantInput input) public async Task Add(AddMerchantInput input)
{ {
var entity = input.Adapt<YD_Event.Core.Entities.Merchant>(); var entity = input.Adapt<YD_Event.Core.Entities.Merchant>();
entity.Id = _idGenerator.NextId(); entity.Id = _idGenerator.NextId();
await _repository.InsertAsync(entity); await _repository.InsertAsync(entity);
if (input.WeChatPayConfig != null)
{
var weChatPayConfig = input.WeChatPayConfig.Adapt<WeChatPayConfig>();
weChatPayConfig.Id = _idGenerator.NextId();
weChatPayConfig.MerchantId = entity.Id;
await _weChatPayConfigRepository.InsertAsync(weChatPayConfig);
}
} }
/// <summary> /// <summary>
@ -175,6 +187,7 @@ public class MerchantService : BaseService<YD_Event.Core.Entities.Merchant>, ITr
/// </summary> /// </summary>
[DisplayName("更新商户")] [DisplayName("更新商户")]
[HttpPut("edit")] [HttpPut("edit")]
[UnitOfWork]
public async Task Update(UpdateMerchantInput input) public async Task Update(UpdateMerchantInput input)
{ {
var entity = await _repository.GetByIdAsync(input.Id); var entity = await _repository.GetByIdAsync(input.Id);
@ -182,6 +195,31 @@ public class MerchantService : BaseService<YD_Event.Core.Entities.Merchant>, ITr
input.Adapt(entity); input.Adapt(entity);
await _repository.UpdateAsync(entity); await _repository.UpdateAsync(entity);
var existingWeChatPayConfig = await _weChatPayConfigRepository.GetFirstAsync(c => c.MerchantId == input.Id);
if (input.WeChatPayConfig != null)
{
if (existingWeChatPayConfig != null)
{
input.WeChatPayConfig.Adapt(existingWeChatPayConfig);
await _weChatPayConfigRepository.UpdateAsync(existingWeChatPayConfig);
}
else
{
var weChatPayConfig = input.WeChatPayConfig.Adapt<WeChatPayConfig>();
weChatPayConfig.Id = _idGenerator.NextId();
weChatPayConfig.MerchantId = input.Id;
await _weChatPayConfigRepository.InsertAsync(weChatPayConfig);
}
}
else
{
if (existingWeChatPayConfig != null)
{
await _weChatPayConfigRepository.DeleteAsync(existingWeChatPayConfig);
}
}
} }
/// <summary> /// <summary>
@ -204,6 +242,8 @@ public class MerchantService : BaseService<YD_Event.Core.Entities.Merchant>, ITr
var entity = await _repository.GetByIdAsync(id); var entity = await _repository.GetByIdAsync(id);
if (entity == null) throw Oops.Bah("商户不存在"); if (entity == null) throw Oops.Bah("商户不存在");
var weChatPayConfig = await _weChatPayConfigRepository.GetFirstAsync(c => c.MerchantId == id);
return new MerchantOutput return new MerchantOutput
{ {
Id = entity.Id, Id = entity.Id,
@ -218,7 +258,8 @@ public class MerchantService : BaseService<YD_Event.Core.Entities.Merchant>, ITr
AuditRemark = entity.AuditRemark, AuditRemark = entity.AuditRemark,
Status = entity.Status, Status = entity.Status,
CreatedTime = entity.CreatedTime, CreatedTime = entity.CreatedTime,
UpdatedTime = entity.UpdatedTime UpdatedTime = entity.UpdatedTime,
WeChatPayConfig = weChatPayConfig != null ? weChatPayConfig.Adapt<WeChatPayConfigDto>() : null
}; };
} }

View File

@ -6053,6 +6053,11 @@
审核状态 审核状态
</summary> </summary>
</member> </member>
<member name="P:YD_Event.Application.Merchant.Dtos.AddMerchantInput.WeChatPayConfig">
<summary>
微信支付配置
</summary>
</member>
<member name="T:YD_Event.Application.Merchant.Dtos.MerchantOutput"> <member name="T:YD_Event.Application.Merchant.Dtos.MerchantOutput">
<summary> <summary>
商户输出DTO 商户输出DTO
@ -6123,6 +6128,11 @@
更新时间 更新时间
</summary> </summary>
</member> </member>
<member name="P:YD_Event.Application.Merchant.Dtos.MerchantOutput.WeChatPayConfig">
<summary>
微信支付配置
</summary>
</member>
<member name="T:YD_Event.Application.Merchant.Dtos.MerchantQueryInput"> <member name="T:YD_Event.Application.Merchant.Dtos.MerchantQueryInput">
<summary> <summary>
商户查询输入 商户查询输入
@ -6268,6 +6278,76 @@
主键Id 主键Id
</summary> </summary>
</member> </member>
<member name="T:YD_Event.Application.Merchant.Dtos.WeChatPayConfigDto">
<summary>
微信支付配置DTO
</summary>
</member>
<member name="P:YD_Event.Application.Merchant.Dtos.WeChatPayConfigDto.Id">
<summary>
主键Id
</summary>
</member>
<member name="P:YD_Event.Application.Merchant.Dtos.WeChatPayConfigDto.MerchantId">
<summary>
商户ID(外键)
</summary>
</member>
<member name="P:YD_Event.Application.Merchant.Dtos.WeChatPayConfigDto.MerchantIdValue">
<summary>
微信支付商户号
</summary>
</member>
<member name="P:YD_Event.Application.Merchant.Dtos.WeChatPayConfigDto.MerchantV3Secret">
<summary>
微信支付 APIv3 密钥
</summary>
</member>
<member name="P:YD_Event.Application.Merchant.Dtos.WeChatPayConfigDto.MerchantCertificateSerialNumber">
<summary>
微信支付商户证书序列号
</summary>
</member>
<member name="P:YD_Event.Application.Merchant.Dtos.WeChatPayConfigDto.MerchantCertificatePrivateKey">
<summary>
微信支付商户私钥(PEM格式)
</summary>
</member>
<member name="P:YD_Event.Application.Merchant.Dtos.WeChatPayConfigDto.Status">
<summary>
可用状态
</summary>
</member>
<member name="T:YD_Event.Application.Merchant.Dtos.WeChatPayConfigInputDto">
<summary>
微信支付配置输入DTO
</summary>
</member>
<member name="P:YD_Event.Application.Merchant.Dtos.WeChatPayConfigInputDto.MerchantIdValue">
<summary>
微信支付商户号
</summary>
</member>
<member name="P:YD_Event.Application.Merchant.Dtos.WeChatPayConfigInputDto.MerchantV3Secret">
<summary>
微信支付 APIv3 密钥
</summary>
</member>
<member name="P:YD_Event.Application.Merchant.Dtos.WeChatPayConfigInputDto.MerchantCertificateSerialNumber">
<summary>
微信支付商户证书序列号
</summary>
</member>
<member name="P:YD_Event.Application.Merchant.Dtos.WeChatPayConfigInputDto.MerchantCertificatePrivateKey">
<summary>
微信支付商户私钥(PEM格式)
</summary>
</member>
<member name="P:YD_Event.Application.Merchant.Dtos.WeChatPayConfigInputDto.Status">
<summary>
可用状态
</summary>
</member>
<member name="T:YD_Event.Application.Merchant.MerchantService"> <member name="T:YD_Event.Application.Merchant.MerchantService">
<summary> <summary>
商户管理 商户管理