private async Task <CreatePaymentResponse> UnifiedCreatePayment(CreatePaymentDto input, bool jsPayment = false) { var paymentId = _paymentIdCache.GetCacheItem(AbpSession.GetTenantId(), input.EditionId, input.EditionPaymentType, input.PaymentPeriodType); var targetEdition = await _editionCache.GetAsync(input.EditionId); var tenant = AbpSession.TenantId == null ? null : await TenantManager.GetByIdAsync(AbpSession.GetTenantId()); var amount = await CalculateAmountForPaymentAsync(targetEdition, input.PaymentPeriodType, input.EditionPaymentType, tenant); var paymentGatewayManager = _paymentGatewayProviderFactory.Create(input.SubscriptionPaymentGatewayType); CreatePaymentResponse createPaymentResult; if (jsPayment) { createPaymentResult = await paymentGatewayManager.CreateJsPaymentAsync(new CreatePaymentRequest() { PaymentId = paymentId, Description = GetPaymentDescription(input, targetEdition), Amount = amount, UserId = AbpSession.GetUserId() }); } else { createPaymentResult = await paymentGatewayManager.CreatePaymentAsync(new CreatePaymentRequest() { PaymentId = paymentId, Description = GetPaymentDescription(input, targetEdition), Amount = amount }); } var cacheItem = await _subscriptionPaymentCache.GetCacheItemOrNullAsync(paymentId); if (cacheItem == null) { await _subscriptionPaymentCache.AddCacheItemAsync( new SubscriptionPaymentCacheItem { PaymentPeriodType = input.PaymentPeriodType, EditionId = input.EditionId, TenantId = tenant == null ? 0 : tenant.Id, Amount = amount, DayCount = input.PaymentPeriodType.HasValue ? (int)input.PaymentPeriodType.Value : 0, PaymentId = paymentId, Status = SubscriptionPaymentStatus.Processing, EditionPaymentType = input.EditionPaymentType }); } createPaymentResult.Amount = amount; createPaymentResult.PaymentId = paymentId; return(createPaymentResult); }
public override void Execute(AlipayTradePayResponse result) { AsyncHelper.RunSync(async() => { //------------------------------ //处理业务开始 //------------------------------ //处理数据库逻辑 //注意交易单不要重复处理 //注意判断返回金额 var paymentId = result.OutTradeNo; var subscriptionPaymentCache = await _subscriptionPaymentCache.GetCacheItemOrNullAsync(paymentId); if (subscriptionPaymentCache == null) { _logger.Error(L("Payments.WeChat.PayFail.PaymentIdNotFound", paymentId)); return; } if (subscriptionPaymentCache.Amount.ToString() != result.TotalAmount) { _logger.Error(L("Payments.WeChat.PayFail.PaymentAmountNotMatch", paymentId, result.TotalAmount)); } else { var subscriptionPayment = await _subscriptionPaymentManager.FindByPaymentIdAsync(paymentId); if (subscriptionPayment == null) { subscriptionPayment = _objectMapper.Map <SubscriptionPayment>(subscriptionPaymentCache); } subscriptionPayment.Gateway = SubscriptionPaymentGatewayType.Alipay; subscriptionPayment.Status = SubscriptionPaymentStatus.Completed; subscriptionPayment.Payer = result.BuyerLogonId; if (subscriptionPayment.Id > 0) { await _subscriptionPaymentManager.UpdateAsync(subscriptionPayment); } else { await _subscriptionPaymentManager.CreateAsync(subscriptionPayment); } using (CurrentUnitOfWork.SetTenantId(subscriptionPayment.TenantId)) { await _tenantManager.UpdateTenantAsync( subscriptionPayment.TenantId, true, false, subscriptionPayment.PaymentPeriodType, subscriptionPayment.EditionId, subscriptionPayment.EditionPaymentType ); } await _unitOfWorkManager.Current.SaveChangesAsync(); } // 清除缓存 _paymentIdCache.RemoveCacheItem(subscriptionPaymentCache.TenantId, subscriptionPaymentCache.EditionId, subscriptionPaymentCache.EditionPaymentType, subscriptionPaymentCache.PaymentPeriodType); //_subscriptionPaymentCache.RemoveCacheItem(subscriptionPaymentCache.PaymentId); }); }