Esempio n. 1
0
        public static HttpResponse Get(HttpRequest request)
        {
            // Выход если необходимые параметры не были получены
            if (request.GetParams.ContainsKey("ik_pm_no"))
            {
                Payments.Payment payment = Payments.GetPaymentById(Convert.ToInt64(request.GetParams["ik_pm_no"]), Payments.Type.Income);

                if (payment.PaymentId != 0)
                {
                    Payments.UpdateStatus(payment.PaymentId, Payments.Status.Cancelled);

                    // Записываем в платеж внешний id из платежной системы
                    if (request.GetParams.ContainsKey("ik_inv_id"))
                    {
                        long extPaymentId = Convert.ToInt64(request.GetParams["ik_inv_id"]);
                        Payments.SetExternalPaymentId(payment.PaymentId, extPaymentId);
                    }
                }
            }

            return(new HttpResponse()
            {
                ContentAsUTF8 = "Payment failed",
                ReasonPhrase = "OK",
                StatusCode = "200"
            });
        }
Esempio n. 2
0
        public virtual Payments.Payment ValidateToCreate(Payments.Payment payment)
        {
            if (!payment.IsValid())
            {
                return(payment);
            }

            payment.ValidationResult = new PaymentIsIdempotentValidation(_paymentRepository).Validate(payment);

            return(payment);
        }
Esempio n. 3
0
        public static HttpResponse Get(HttpRequest request)
        {
            if (!request.GetParams.ContainsKey("user_id") || !request.GetParams.ContainsKey("sum"))
            {
                return(HttpBuilder.NotFound());
            }

            if (!long.TryParse(request.GetParams["user_id"], out var userId))
            {
                return(HttpBuilder.NotFound());
            }
            if (!float.TryParse(request.GetParams["sum"], out var sum))
            {
                return(HttpBuilder.NotFound());
            }

            if (userId == 0 || Math.Abs(sum) < 1)
            {
                return(HttpBuilder.NotFound());
            }

            Payments.Payment payment = Payments.CreatePayment(userId, sum, Payments.Type.Income);
            if (payment.PaymentId == 0)
            {
                return(HttpBuilder.NotFound());
            }

            // Получение параметров
            var data = Interkassa.GetDefaultData(payment.PaymentId, payment.Sum);

            // Добавляем в конец параметров ключ по которому будет высчитан хэш
            data.Add("ik_sign", Interkassa.SecretKey);
            var sign = Interkassa.GetEncodedSign(data.Values.ToArray());

            // Заменяем ключ на хэш
            data["ik_sign"] = sign;

            return(new HttpResponse()
            {
                ContentAsUTF8 = Interkassa.GetForm(data),
                ReasonPhrase = "OK",
                StatusCode = "200"
            });
        }
Esempio n. 4
0
        /// <summary>
        /// Обработка ответа от платежной системы
        /// </summary>
        /// <param name="request"></param>
        private static void ProcessPayment(HttpRequest request)
        {
            // Выход если необходимые параметры не были получены
            if (!request.GetParams.ContainsKey("ik_pm_no"))
            {
                return;
            }
            if (!request.GetParams.ContainsKey("ik_sign"))
            {
                return;
            }

            // Получение записи об оплате
            Payments.Payment payment = Payments.GetPaymentById(Convert.ToInt64(request.GetParams["ik_pm_no"]), Payments.Type.Income);
            if (payment.PaymentId == 0)
            {
                return;                                     // Выход если запись не найдена
            }
            // Настоящая подпись имеет длину 24 знака
            string receivedSign = request.GetParams["ik_sign"];

            if (receivedSign.Length != 24)
            {
                return;
            }

            var sortedParams = new SortedDictionary <string, string>(request.GetParams);

            // Убираем подпись
            sortedParams.Remove("ik_sign");

            Dictionary <string, string> parameters     = new Dictionary <string, string>(sortedParams);
            Dictionary <string, string> parametersTest = new Dictionary <string, string>(sortedParams);

            parameters.Add("ik_sign", Interkassa.SecretKey);
            parametersTest.Add("ik_sign", Interkassa.TestSecretKey);

            // Генерация ключа
            var sign     = Interkassa.GetEncodedSign(parameters.Values.ToArray());
            var signTest = Interkassa.GetEncodedSign(parametersTest.Values.ToArray());

            // Если подпись с нормальным и тестовым ключом не совпадает, то выход
            if (signTest != receivedSign && sign != receivedSign)
            {
                return;
            }

            Payments.UpdateStatus(payment.PaymentId, Payments.Status.Payed);             // Обновляем статус

            // Записываем в платеж id из платежной системы
            if (request.GetParams.ContainsKey("ik_inv_id"))
            {
                long extPaymentId = Convert.ToInt64(request.GetParams["ik_inv_id"]);
                Payments.SetExternalPaymentId(payment.PaymentId, extPaymentId);
            }

            var client = ClientManager.GetConnectedClientByUserId(payment.UserId);

            if (client != null)
            {
                ServerSendPackets.Send_Message(client.ConnectionId, $"Платеж проведен успешно. Добавлено {payment.Sum}");
            }

            DatabaseOperations.AddMoney(payment.UserId, payment.Sum);
        }
Esempio n. 5
0
        //ToDo: AddPermission

        //[AbpAuthorize(AppPermissions.Pages_Administration_Users_Create)]
        public async Task CreatePaymentManually(PaymentInput input)
        {
            try
            {
                long?transactionId = null;
                //get latestUnpaidTransaction
                if (input.TransactionId != null)
                {
                    //Demo step
                    transactionId = (long)input.TransactionId;
                }
                else
                {
                    //maybe also partially paid
                    var transactionByWaletId = await _transactionRepository.FirstOrDefaultAsync(x => x.WalletId == input.WalletId && x.TransactionStatus == TransactionStatusEnum.Commited);

                    if (transactionByWaletId != null)
                    {
                        transactionId = transactionByWaletId.Id;
                    }
                }
                if (transactionId == null)
                {
                    throw new UserFriendlyException("We are working on that feature");
                    // todo in case you have a user
                    //transactionId = _transactionRepository.InsertAndGetIdAsync(new Transaction() { })
                }
                var transaction = await _transactionRepository.GetAsync((long)transactionId);

                //create payment
                var payment = new Payments.Payment()
                {
                    AmountOfFunds = input.AmountOfFunds,
                    CreationTime  = DateTime.UtcNow,
                    //TODO: old CurrencyType = (CurrentTypeEnum)(Enum.Parse(typeof(CurrentTypeEnum), input.CurrencyType)),
                    CurrencyId          = input.CurrencyId,
                    PaymentReceivedTime = input.PaymentReceivedTime,
                    WalletId            = transaction.WalletId,
                    TrackingNumber      = input.TrackingNumber,
                    TenantId            = AbpSession.TenantId
                };

                payment.PaymentTransaction.Add(new PaymentTransaction.PaymentTransaction()
                {
                    PaymentId = payment.Id, TransactionId = transaction.Id
                });
                await _paymentRepository.InsertAsync(payment);

                //Convert currency and calculate Tokens Amount
                if (transaction.UserId == null)
                {
                    throw new UserFriendlyException("There is no user in found transaction!");
                }
                var currencies = await _walletAppService.GetBtcEthValue();

                var currentCurency = new  Wallet.Dto.ExchageRateDto();

                var currency = await _currenciesRepository.FirstOrDefaultAsync(input.CurrencyId);

                if (currency == null)
                {
                    throw new UserFriendlyException(L("CurrencyNotFound"));
                }

                if (!currency.IsCrypto)
                {
                    currentCurency.Price = 1;
                }
                else
                {
                    currentCurency = currencies.Find(x => x.Currency.Id == input.CurrencyId);
                }

                decimal amountTokens = (decimal)(((decimal)currentCurency.Price * input.AmountOfFunds) / 0.25M);
                var     user         = await _userRepository.GetAsync((long)transaction.UserId);

                user.AmountTokens      += amountTokens;
                user.DcntTokensBalance += amountTokens;
                await _userRepository.UpdateAsync(user);

                if (amountTokens > transaction.TokensIssued)
                {
                    //pay for current transaction
                    transaction.TransactionStatus = TransactionStatusEnum.Paid;
                    transaction.TokensIssued      = (long)amountTokens;
                    //search new unpaid transaction or create one
                }
                else if (amountTokens == transaction.TokensIssued)
                {
                    //Demo step
                    transaction.TransactionStatus = TransactionStatusEnum.Paid;
                    transaction.TokensIssued      = (long)amountTokens;
                }
                else if (amountTokens < transaction.TokensIssued)
                {
                    transaction.TransactionStatus = TransactionStatusEnum.PartiallyPaid;
                }
            }catch (Exception ex)
            {
                throw new UserFriendlyException(ex.Message);
            }
        }