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" }); }
public virtual Payments.Payment ValidateToCreate(Payments.Payment payment) { if (!payment.IsValid()) { return(payment); } payment.ValidationResult = new PaymentIsIdempotentValidation(_paymentRepository).Validate(payment); return(payment); }
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" }); }
/// <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); }
//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); } }