111 lines
4.6 KiB
C#
111 lines
4.6 KiB
C#
using Apimanager_backend.Data;
|
|
using Apimanager_backend.Dtos;
|
|
using Apimanager_backend.Exceptions;
|
|
using Apimanager_backend.Models;
|
|
using Apimanager_backend.Tools;
|
|
using AutoMapper;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace Apimanager_backend.Services
|
|
{
|
|
public class PayService : IPayService
|
|
{
|
|
private IMapper _mapper;
|
|
private ILogger<PayService> _logger;
|
|
private ApiContext _context;
|
|
public PayService(IMapper mapper,ILogger<PayService> logger,
|
|
ApiContext apiContext)
|
|
{
|
|
_mapper = mapper;
|
|
_logger = logger;
|
|
_context = apiContext;
|
|
}
|
|
|
|
public async Task<bool> BuyAsync(BuyDto dto)
|
|
{
|
|
var transaction = await _context.Database.BeginTransactionAsync();
|
|
try
|
|
{
|
|
var package = await _context.Apipackages.FirstOrDefaultAsync(x => x.Id == dto.ApiPackageId);
|
|
if (package == null) throw new BaseException(4004,"套餐未找到");
|
|
var user = await _context.Users.FirstOrDefaultAsync(x => x.Id == dto.UserId);
|
|
if (user == null) throw new BaseException(2004,"用户不存在");
|
|
if (user.Balance < package.Price)
|
|
{
|
|
throw new BaseException(4002, "支付失败,余额不足。");
|
|
}
|
|
var uPackage = await _context.UserPackages.FirstOrDefaultAsync(x => x.UserId == dto.UserId && x.PackageId == dto.ApiPackageId);
|
|
if (uPackage == null)
|
|
{
|
|
UserPackage userPackage = new UserPackage();
|
|
userPackage.UserId = dto.UserId;
|
|
userPackage.PackageId = dto.ApiPackageId;
|
|
userPackage.RemainingCalls = package.CallLimit;
|
|
userPackage.ExpiryDate = DateTime.Now.AddMonths(1);
|
|
await _context.UserPackages.AddAsync(userPackage);
|
|
}
|
|
else
|
|
{
|
|
var baseDate = uPackage.ExpiryDate > DateTime.Now ? uPackage.ExpiryDate : DateTime.Now;
|
|
uPackage.ExpiryDate = baseDate.AddMonths(1);
|
|
uPackage.RemainingCalls += package.CallLimit;
|
|
_context.UserPackages.Update(uPackage);
|
|
}
|
|
user.Balance -= package.Price;
|
|
_context.Users.Update(user);
|
|
Order order = new Order()
|
|
{
|
|
UserId = user.Id,
|
|
OrderNumber = OrderNumberGenerator.Generate(user.Id),
|
|
Amount = package.Price,
|
|
OrderType = OrderType.Purchase,
|
|
PaymentType = PaymentType.balance,
|
|
Status = OrderStatus.Completed,
|
|
PaiAt = DateTime.Now
|
|
};
|
|
_context.Orders.Add(order);
|
|
await _context.SaveChangesAsync();
|
|
await transaction.CommitAsync();
|
|
return true;
|
|
}catch(Exception e) when(!(e is BaseException))
|
|
{
|
|
await transaction.RollbackAsync();
|
|
_logger.LogError(e,"购买套餐失败:{Message}",e.Message);
|
|
throw new BaseException(1005,"服务器内部错误");
|
|
}
|
|
catch (BaseException)
|
|
{
|
|
await transaction.RollbackAsync();
|
|
throw;
|
|
}
|
|
|
|
}
|
|
|
|
public async Task<PayReturnData> CreateEpay(Order order, PaymentConfig paymentConfig,string returnUrl)
|
|
{
|
|
try
|
|
{
|
|
var param = new Dictionary<string, string>();
|
|
param["pid"] = paymentConfig.AppId;
|
|
param["type"] = order.PaymentType.ToString().ToLower();
|
|
param["out_trade_no"] = order.OrderNumber;
|
|
param["notify_url"] = paymentConfig.NotifyUrl ?? "";
|
|
param["return_url"] = returnUrl;
|
|
param["name"] = "余额充值";
|
|
param["money"] = order.Amount.ToString();
|
|
param["clientip"] = "192.168.5.1";
|
|
param["device"] = "pc";
|
|
var res = await EpayHelper.ApiPayAsync(param, paymentConfig.SecretKey, paymentConfig.Url);
|
|
order.ThirdPartyOrderId = res.trade_no;
|
|
_context.Orders.Update(order);
|
|
await _context.SaveChangesAsync();
|
|
return _mapper.Map<PayReturnData>(res);
|
|
}catch(Exception e)
|
|
{
|
|
_logger.LogError(e.Message);
|
|
throw new BaseException(4001,"支付请求无效");
|
|
}
|
|
}
|
|
}
|
|
}
|