Пример #1
0
        public async Task <PaymentTransactionInfo> ProcessCallback(ProcessPaymentTransaction request)
        {
            var blockchainAddress = context.BlockchainAddresses.FirstOrDefault(addr => addr.Address == request.Address);

            if (blockchainAddress == null)
            {
                var msg = $"Eth address not found - {request.Address}";
                logger.LogError(msg);
                throw new ApplicationException(msg);
            }

            if (request.Currency != blockchainAddress.Currency)
            {
                var msg = $"Wallet and Transaction currency should be the same {blockchainAddress.Id}";
                logger.LogError(msg);
                throw new ApplicationException(msg);
            }

            var wallet = context.Wallets.First(w => w.UserId == blockchainAddress.UserId && w.Currency == blockchainAddress.Currency);

            PaymentTransactionInfo paymentTransactionInfo;

            using (var transaction = await context.Database.BeginTransactionAsync())
            {
                var paymentTransaction = context.PaymentTransactions
                                         .FirstOrDefault(t => t.Hash == request.TransactionHash &&
                                                         t.BlockchainAddressId == blockchainAddress.Id);

                if (paymentTransaction != null)
                {
                    if (paymentTransaction.Status == PaymentTransactionStatus.Pending ||
                        paymentTransaction.Status == PaymentTransactionStatus.New)
                    {
                        paymentTransaction.Status      = request.Status;
                        paymentTransaction.LastUpdated = DateTime.UtcNow;
                        context.Update(paymentTransaction);
                        await context.SaveChangesAsync();
                    }
                    else
                    {
                        logger.LogError($"Can not override status from {paymentTransaction.Status} to {request.Status}");
                    }
                }
                else
                {
                    var walletTransactions = new WalletTransactions()
                    {
                        Id       = Guid.NewGuid(),
                        WalletId = wallet.Id,
                        Type     = WalletTransactionsType.Deposit,
                        Date     = DateTime.UtcNow,
                        Amount   = request.Amount
                    };

                    context.WalletTransactions.Add(walletTransactions);
                    await context.SaveChangesAsync();

                    paymentTransaction = new PaymentTransactions
                    {
                        Id   = Guid.NewGuid(),
                        Hash = request.TransactionHash,
                        Type = PaymentTransactionType.Deposit,
                        BlockchainAddressId = blockchainAddress.Id,
                        Amount            = request.Amount,
                        Fee               = request.Fee,
                        DateCreated       = DateTime.UtcNow,
                        Status            = request.Status,
                        PayoutTxHash      = request.PayoutTxHash,
                        PayoutServiceFee  = request.PayoutServiceFee,
                        PayoutMinerFee    = request.PayoutMinerFee,
                        WalletTransaction = walletTransactions
                    };

                    context.PaymentTransactions.Add(paymentTransaction);

                    if (paymentTransaction.Status == PaymentTransactionStatus.ConfirmedAndValidated)
                    {
                        wallet.Amount += paymentTransaction.Amount;

                        await context.SaveChangesAsync();
                    }
                }

                transaction.Commit();

                paymentTransactionInfo = new PaymentTransactionInfo
                {
                    TransactionId   = paymentTransaction.Id,
                    TransactionHash = paymentTransaction.Hash,
                    Amount          = paymentTransaction.Amount,
                    Currency        = request.Currency.ToString(),
                    GatewayCode     = request.GatewayCode,
                    Status          = paymentTransaction.Status,
                    IsValid         = true
                };
            }

            return(paymentTransactionInfo);
        }
Пример #2
0
        public async Task <PaymentTransactionInfo> ProcessCallback(ProcessPaymentTransaction request)
        {
            var blockchainAddress = context.BlockchainAddresses.FirstOrDefault(addr => addr.Address == request.Address && addr.Currency == request.Currency);

            if (blockchainAddress == null)
            {
                var msg = $"{request.Currency} address not found - {request.Address}";
                logger.LogError(msg);
                throw new ApplicationException(msg);
            }

            if (request.VerificationCode != blockchainAddress.VerificationCode)
            {
                var msg = $"Invalid VerificationCode {request.VerificationCode} for {request.Address}";
                logger.LogError(msg);
                throw new ApplicationException(msg);
            }

            PaymentTransactionInfo transactionInfo;

            using (var transaction = await context.Database.BeginTransactionAsync())
            {
                var wallet = context.Wallets.FirstOrDefault(w => w.UserId == blockchainAddress.UserId && w.Currency == blockchainAddress.Currency);
                if (wallet == null)
                {
                    wallet = new Wallet()
                    {
                        UserId   = blockchainAddress.UserId.Value,
                        Amount   = 0,
                        Currency = blockchainAddress.Currency,
                    };
                    context.Wallets.Add(wallet);
                    context.SaveChanges();
                }

                var blockchainTransaction = context.BlockchainTransactions
                                            .FirstOrDefault(t => t.Hash == request.TransactionHash &&
                                                            t.BlockchainAddressId == blockchainAddress.Id);

                if (blockchainTransaction != null)
                {
                    if (blockchainTransaction.Status == BlockchainTransactionStatus.Pending ||
                        blockchainTransaction.Status == BlockchainTransactionStatus.New)
                    {
                        blockchainTransaction.Status      = request.IsConfirmed ? BlockchainTransactionStatus.ConfirmedAndValidated : BlockchainTransactionStatus.Pending;
                        blockchainTransaction.LastUpdated = DateTime.UtcNow;
                        context.Update(blockchainTransaction);

                        if (blockchainTransaction.Status == BlockchainTransactionStatus.ConfirmedAndValidated)
                        {
                            ProcessPayment(wallet, blockchainTransaction);
                        }
                    }
                    else
                    {
                        logger.LogError($"Can not override status from {blockchainTransaction.Status} to {request.IsConfirmed}");
                    }
                }
                else
                {
                    blockchainTransaction = new BlockchainTransaction
                    {
                        Id   = Guid.NewGuid(),
                        Hash = request.TransactionHash,
                        Type = BlockchainTransactionType.Deposit,
                        BlockchainAddressId = blockchainAddress.Id,
                        Amount = request.Amount,
                        //AmountBigInt = request.AmountBigInt,//TODO: Please add as string
                        Currency    = request.Currency,
                        Fee         = request.Fee,
                        DateCreated = DateTime.UtcNow,
                        Status      = request.IsConfirmed ? BlockchainTransactionStatus.ConfirmedAndValidated : BlockchainTransactionStatus.Pending
                    };

                    context.BlockchainTransactions.Add(blockchainTransaction);

                    if (blockchainTransaction.Status == BlockchainTransactionStatus.ConfirmedAndValidated)
                    {
                        ProcessPayment(wallet, blockchainTransaction);
                    }
                }

                await context.SaveChangesAsync();

                transaction.Commit();

                transactionInfo = new PaymentTransactionInfo
                {
                    TransactionId   = blockchainTransaction.Id,
                    TransactionHash = blockchainTransaction.Hash,
                    Amount          = blockchainTransaction.Amount,
                    Currency        = request.Currency.ToString(),
                    GatewayCode     = request.GatewayCode,
                    Status          = blockchainTransaction.Status,
                    IsValid         = true
                };
            }

            return(transactionInfo);
        }