using System.Text.Json; using Volo.Abp.Domain.Services; using Volo.Abp.Users; using Yi.Framework.AiHub.Domain.Entities.Pay; using Yi.Framework.AiHub.Domain.Shared.Enums; using Yi.Framework.SqlSugarCore.Abstractions; namespace Yi.Framework.AiHub.Domain.Managers; /// /// 支付管理器 /// public class PayManager : DomainService { private readonly ISqlSugarRepository _payNoticeRepository; private readonly ICurrentUser _currentUser; private readonly ISqlSugarRepository _payOrderRepository; public PayManager( ISqlSugarRepository payNoticeRepository, ICurrentUser currentUser, ISqlSugarRepository payOrderRepository) { _payNoticeRepository = payNoticeRepository; _currentUser = currentUser; _payOrderRepository = payOrderRepository; } /// /// 创建订单 /// /// 商品类型 /// 订单信息 public async Task CreateOrderAsync(GoodsTypeEnum goodsType) { // 验证用户是否登录 if (!_currentUser.IsAuthenticated) { throw new UserFriendlyException("用户未登录"); } // 生成订单号 var outTradeNo = GenerateOutTradeNo(); // 获取商品信息 var goodsName = goodsType.GetDisplayName(); var totalAmount = goodsType.GetTotalAmount(); // 创建订单实体 var payOrder = new PayOrderAggregateRoot { OutTradeNo = outTradeNo, UserId = _currentUser.GetId(), UserName = _currentUser.UserName ?? string.Empty, TotalAmount = totalAmount, GoodsName = goodsName, GoodsType = goodsType }; // 保存订单 await _payOrderRepository.InsertAsync(payOrder); return payOrder; } /// /// 更新订单状态 /// /// 商户订单号 /// 交易状态 /// 支付宝交易号 /// public async Task UpdateOrderStatusAsync(string outTradeNo, TradeStatusEnum tradeStatus, string? tradeNo = null) { var order = await _payOrderRepository.GetFirstAsync(x => x.OutTradeNo == outTradeNo); if (order == null) { throw new UserFriendlyException($"订单不存在:{outTradeNo}"); } order.TradeStatus = tradeStatus; if (!string.IsNullOrEmpty(tradeNo)) { order.TradeNo = tradeNo; } await _payOrderRepository.UpdateAsync(order); return order; } /// /// 记录支付通知 /// /// 通知数据 /// /// public async Task RecordPayNoticeAsync(Dictionary notifyData, string signStr) { var payNotice = new PayNoticeRecordAggregateRoot { NotifyTime = DateTime.Parse(notifyData.GetValueOrDefault("notify_time", string.Empty)), TradeNo = notifyData.GetValueOrDefault("trade_no", string.Empty), OutTradeNo = notifyData.GetValueOrDefault("out_trade_no", string.Empty), BuyerId = notifyData.GetValueOrDefault("buyer_id", string.Empty), TradeStatus = ParseTradeStatus(notifyData.GetValueOrDefault("trade_status", string.Empty)), TotalAmount = decimal.TryParse(notifyData.GetValueOrDefault("total_amount", "-1"), out var amount) ? amount : 0, NotifyData = JsonSerializer.Serialize(notifyData), SignStr = signStr }; await _payNoticeRepository.InsertAsync(payNotice); } /// /// 生成商户订单号 /// /// private string GenerateOutTradeNo() { return $"YI_{DateTime.Now:yyyyMMddHHmmss}_{Random.Shared.Next(1000, 9999)}"; } /// /// 解析交易状态 /// /// 状态字符串 /// private TradeStatusEnum ParseTradeStatus(string tradeStatus) { if (Enum.TryParse(tradeStatus, out var result)) { return result; } return TradeStatusEnum.WAIT_TRADE; } }