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 _logger; private ApiContext _context; public PayService(IMapper mapper,ILogger logger, ApiContext apiContext) { _mapper = mapper; _logger = logger; _context = apiContext; } public async Task 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; _context.UserPackages.Update(uPackage); } user.Balance -= package.Price; _context.Users.Update(user); 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 CreateEpay(Order order, PaymentConfig paymentConfig,string returnUrl) { try { var param = new Dictionary(); 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(res); }catch(Exception e) { _logger.LogError(e.Message); throw new BaseException(4001,"支付请求无效"); } } } }