using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp.Application.Services;
using Yi.Framework.AiHub.Domain.Alipay;
using Yi.Framework.AiHub.Domain.Managers;
using Yi.Framework.AiHub.Application.Contracts.Dtos.Pay;
using Yi.Framework.AiHub.Domain.Shared.Enums;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Yi.Framework.AiHub.Application.Contracts.IServices;
using Volo.Abp;
using Yi.Framework.AiHub.Domain.Entities.Pay;
using Yi.Framework.SqlSugarCore.Abstractions;
using System.ComponentModel;
using System.Reflection;
using Volo.Abp.Users;
using Yi.Framework.AiHub.Application.Contracts.Dtos.Recharge;
namespace Yi.Framework.AiHub.Application.Services;
///
/// 支付服务
///
public class PayService : ApplicationService, IPayService
{
private readonly AlipayManager _alipayManager;
private readonly PayManager _payManager;
private readonly ILogger _logger;
private readonly ISqlSugarRepository _payOrderRepository;
private readonly IRechargeService _rechargeService;
private readonly PremiumPackageManager _premiumPackageManager;
public PayService(
AlipayManager alipayManager,
PayManager payManager,
ILogger logger,
ISqlSugarRepository payOrderRepository,
IRechargeService rechargeService,
PremiumPackageManager premiumPackageManager)
{
_alipayManager = alipayManager;
_payManager = payManager;
_logger = logger;
_payOrderRepository = payOrderRepository;
_rechargeService = rechargeService;
_premiumPackageManager = premiumPackageManager;
}
///
/// 创建订单并发起支付
///
/// 创建订单输入
/// 订单创建结果
[Authorize]
[HttpPost("pay/Order")]
public async Task CreateOrderAsync(CreateOrderInput input)
{
// 1. 通过PayManager创建订单(内部会验证VIP资格)
var order = await _payManager.CreateOrderAsync(input.GoodsType);
// 2. 通过AlipayManager发起页面支付
var paymentPageHtml = await _alipayManager.PaymentPageAsync(
order.GoodsName,
order.OutTradeNo,
order.TotalAmount,
input.ReturnUrl);
// 3. 返回结果
return new CreateOrderOutput
{
OrderId = order.Id,
OutTradeNo = order.OutTradeNo,
PaymentPageHtml = paymentPageHtml.Body
};
}
///
/// 支付宝异步通知处理
///
/// 表单数据
///
[HttpPost("pay/AlipayNotify")]
[AllowAnonymous]
public async Task AlipayNotifyAsync([FromForm] IFormCollection form)
{
// 1. 将表单数据转换为字典,保持原始顺序
var notifyData = new Dictionary();
foreach (var item in form)
{
notifyData[item.Key] = item.Value.ToString();
}
var signStr = string.Join("&", notifyData.Select(kv => $"{kv.Key}={kv.Value}"));
_logger.LogInformation($"收到支付宝回调通知:{signStr}");
// 2. 验证签名
await _alipayManager.VerifyNotifyAsync(notifyData);
// 3. 记录支付通知
await _payManager.RecordPayNoticeAsync(notifyData, signStr);
// 4. 更新订单状态
var outTradeNo = notifyData.GetValueOrDefault("out_trade_no", string.Empty);
var tradeStatus = notifyData.GetValueOrDefault("trade_status", string.Empty);
var tradeNo = notifyData.GetValueOrDefault("trade_no", string.Empty);
if (!string.IsNullOrEmpty(outTradeNo) && !string.IsNullOrEmpty(tradeStatus))
{
var status = ParseTradeStatus(tradeStatus);
var order = await _payManager.UpdateOrderStatusAsync(outTradeNo, status, tradeNo);
_logger.LogInformation("订单状态更新成功,订单号:{OutTradeNo},状态:{TradeStatus}", outTradeNo, tradeStatus);
// 验证交易状态,只有交易成功才执行充值逻辑
if (status != TradeStatusEnum.TRADE_SUCCESS)
{
_logger.LogError($"订单 {outTradeNo} 状态为 {tradeStatus},不执行充值逻辑");
return "success";
}
// 5. 根据商品类型进行不同的处理
if (order.GoodsType.IsPremiumPackage())
{
// 处理尊享包商品:创建尊享包记录
await _premiumPackageManager.CreatePremiumPackageAsync(
order.UserId,
order.GoodsType,
order.TotalAmount,
expireMonths: null // 尊享包不设置过期时间,或者可以根据需求设置
);
_logger.LogInformation(
$"用户 {order.UserId} 购买尊享包成功,订单号:{outTradeNo},商品:{order.GoodsName}");
}
else if (order.GoodsType.IsVipService())
{
// 处理VIP服务商品:充值VIP
await _rechargeService.RechargeVipAsync(new RechargeCreateInput
{
UserId = order.UserId,
RechargeAmount = order.TotalAmount,
Content = order.GoodsName,
Months = order.GoodsType.GetValidMonths(),
Remark = "自助充值",
ContactInfo = null
});
_logger.LogInformation(
$"用户 {order.UserId} 充值VIP成功,订单号:{outTradeNo},月数:{order.GoodsType.GetValidMonths()}");
}
else
{
_logger.LogWarning($"未知的商品类型:{order.GoodsType},订单号:{outTradeNo}");
}
}
else
{
throw new AlipayException($"回调格式错误");
}
return "success";
}
///
/// 查询订单状态
///
/// 查询订单状态输入
/// 订单状态信息
[HttpGet("pay/OrderStatus")]
[Authorize]
public async Task QueryOrderStatusAsync([FromQuery] QueryOrderStatusInput input)
{
// 通过PayManager查询订单
var order = await _payOrderRepository.GetFirstAsync(x => x.OutTradeNo == input.OutTradeNo);
if (order == null)
{
throw new UserFriendlyException($"订单不存在:{input.OutTradeNo}");
}
return new QueryOrderStatusOutput
{
OrderId = order.Id,
OutTradeNo = order.OutTradeNo,
TradeNo = order.TradeNo,
TradeStatus = order.TradeStatus,
TradeStatusDescription = GetTradeStatusDescription(order.TradeStatus),
TotalAmount = order.TotalAmount,
GoodsName = order.GoodsName,
GoodsType = order.GoodsType,
CreationTime = order.CreationTime,
LastModificationTime = order.LastModificationTime
};
}
///
/// 获取商品列表
///
/// 获取商品列表输入
/// 商品列表
[HttpGet("pay/GoodsList")]
public async Task> GetGoodsListAsync([FromQuery] GetGoodsListInput input)
{
var goodsList = new List();
// 获取当前用户的累加充值金额(仅已登录用户)
decimal totalRechargeAmount = 0m;
if (CurrentUser.IsAuthenticated)
{
totalRechargeAmount = await _payManager.GetUserTotalRechargeAmountAsync(CurrentUser.GetId());
}
// 遍历所有商品枚举
foreach (GoodsTypeEnum goodsType in Enum.GetValues(typeof(GoodsTypeEnum)))
{
// 如果指定了商品类别,则过滤
if (input.GoodsCategoryType.HasValue)
{
var goodsCategory = goodsType.GetGoodsCategory();
if (goodsCategory != input.GoodsCategoryType.Value)
{
continue; // 跳过不匹配的商品
}
}
var originalPrice = goodsType.GetTotalAmount();
decimal actualPrice = originalPrice;
decimal? discountAmount = null;
string? discountDescription = null;
// 如果是尊享包商品,计算折扣
if (goodsType.IsPremiumPackage())
{
if (CurrentUser.IsAuthenticated)
{
discountAmount = goodsType.CalculateDiscount(totalRechargeAmount);
actualPrice = goodsType.GetDiscountedPrice(totalRechargeAmount);
if (discountAmount > 0)
{
discountDescription = $"根据累积充值已优惠 ¥{discountAmount:F2}";
}
else
{
discountDescription = $"累积充值过低,暂无优惠";
}
}
else
{
discountDescription = $"登录后查看优惠";
}
}
var goodsItem = new GoodsListOutput
{
GoodsName = goodsType.GetChineseName(),
OriginalPrice = originalPrice,
ReferencePrice = goodsType.GetReferencePrice(),
GoodsPrice = actualPrice,
GoodsCategory = goodsType.GetGoodsCategory().ToString(),
Remark = goodsType.GetRemark(),
DiscountAmount = discountAmount,
DiscountDescription = discountDescription,
GoodsType = goodsType
};
goodsList.Add(goodsItem);
}
return goodsList;
}
///
/// 获取交易状态描述
///
/// 交易状态
/// 状态描述
private string GetTradeStatusDescription(TradeStatusEnum tradeStatus)
{
var fieldInfo = tradeStatus.GetType().GetField(tradeStatus.ToString());
var descriptionAttribute = fieldInfo?.GetCustomAttribute();
return descriptionAttribute?.Description ?? "未知状态";
}
///
/// 解析交易状态
///
/// 状态字符串
///
private TradeStatusEnum ParseTradeStatus(string tradeStatus)
{
if (Enum.TryParse(tradeStatus, out var result))
{
return result;
}
return TradeStatusEnum.WAIT_TRADE;
}
}