Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
            });
        }