public SendResponse SendPayment(SmsPaymentDTO smsPayment) { Task <SendResponse> task = SendPaymentAsync(smsPayment); task.Wait(); return(task.Result); }
public SmsPaymentDTO CreateSmsPaymentDTO(SmsPayment smsPayment, Order order) { var newSmsPaymentDTO = new SmsPaymentDTO { Recepient = smsPayment.Recepient.Name, RecepientId = smsPayment.Recepient.Id, PhoneNumber = smsPayment.PhoneNumber, PaymentStatus = SmsPaymentStatus.WaitingForPayment, OrderId = smsPayment.Order.Id, PaymentCreationDate = smsPayment.CreationDate, Amount = smsPayment.Amount, RecepientType = smsPayment.Recepient.PersonType, Items = new List <SmsPaymentItemDTO>() }; foreach (var orderItem in order.OrderItems) { newSmsPaymentDTO.Items.Add(new SmsPaymentItemDTO { Name = orderItem.Nomenclature.OfficialName, Quantity = orderItem.CurrentCount, Price = orderItem.Sum / orderItem.Count }); } return(newSmsPaymentDTO); }
private async Task <SendResponse> SendPaymentAsync(SmsPaymentDTO smsPaymentDto) { //Битриксу необходимо всегда передавать имя и фамилию для физических клиентов var clientName = smsPaymentDto.Recepient.Trim(); if (smsPaymentDto.RecepientType == PersonType.natural && !clientName.Contains(' ')) { smsPaymentDto.Recepient = clientName + " -"; } string content = JsonConvert.SerializeObject(smsPaymentDto, new JsonSerializerSettings { DateFormatString = dateFormat }); logger.Info($"Передаём в битрикс данные: {content}"); using (HttpClient httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Accept.Clear(); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); HttpContent httpContent = new StringContent(content, Encoding.UTF8, "application/json"); HttpResponseMessage httpResponse = await httpClient.PostAsync($"{baseAddress}/vodovoz/handler.php", httpContent); var responseContent = httpResponse.Content.ReadAsStringAsync().Result; logger.Info($"Битрикс вернул http код: {httpResponse.StatusCode} Content: {responseContent}"); JObject obj = JObject.Parse(responseContent); var externalId = (int)obj["dealId"]; return(new SendResponse { HttpStatusCode = httpResponse.StatusCode, ExternalId = externalId }); } }
public bool Validate(SmsPaymentDTO smsPaymentDTO, out IList <string> errorMessages) { errorMessages = new List <string>(); if (!_allowedOrganizationIds.Contains(smsPaymentDTO.OrganizationId)) { errorMessages.Add($"Для заказа автоматически подобралась невалидная организация (Код: {smsPaymentDTO.OrganizationId})"); return(false); } return(true); }
private SmsPayment CreateNewSmsPayment(IUnitOfWork uow, SmsPaymentDTO dto, int externalId) { return(new SmsPayment { ExternalId = externalId, Amount = dto.Amount, Order = uow.GetById <Order>(dto.OrderId), Recepient = uow.GetById <Counterparty>(dto.RecepientId), CreationDate = dto.PaymentCreationDate, PhoneNumber = dto.PhoneNumber, SmsPaymentStatus = SmsPaymentStatus.WaitingForPayment }); }
public SmsPaymentDTO CreateSmsPaymentDTO(IUnitOfWork uow, SmsPayment smsPayment, Order order, PaymentFrom paymentFrom) { var newSmsPaymentDTO = new SmsPaymentDTO { Recepient = smsPayment.Recepient.Name, RecepientId = smsPayment.Recepient.Id, PhoneNumber = smsPayment.PhoneNumber, PaymentStatus = SmsPaymentStatus.WaitingForPayment, OrderId = smsPayment.Order.Id, PaymentCreationDate = smsPayment.CreationDate, Amount = smsPayment.Amount, RecepientType = smsPayment.Recepient.PersonType, Items = GetCalculatedSmsPaymentItemDTOs(order.OrderItems), OrganizationId = _organizationProvider.GetOrganization(uow, order, paymentFrom, PaymentType.ByCard).Id }; return(newSmsPaymentDTO); }
private async Task <SendResponse> SendPaymentAsync(SmsPaymentDTO smsPaymentDto) { //Засекаем время чтобы проверить что в ответе есть хотя бы один новый, то есть мы что-то создали, но ответ не пришел var now = DateTime.Now; try { //Битриксу необходимо всегда передавать имя и фамилию для физических клиентов var clientName = smsPaymentDto.Recepient.Trim(); if (smsPaymentDto.RecepientType == PersonType.natural && !clientName.Contains(' ')) { smsPaymentDto.Recepient = clientName + " -"; } string content = JsonConvert.SerializeObject(smsPaymentDto, new JsonSerializerSettings { DateFormatString = dateFormat }); logger.Info($"Передаём в битрикс данные: {content}"); using (HttpClient httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Accept.Clear(); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); HttpContent httpContent = new StringContent(content, Encoding.UTF8, "application/json"); HttpResponseMessage httpResponse = await httpClient.PostAsync($"{baseAddress}/vodovoz/handler.php", httpContent); var responseContent = httpResponse.Content.ReadAsStringAsync().Result; logger.Info($"Битрикс вернул http код: {httpResponse.StatusCode} Content: {responseContent}"); JObject obj = JObject.Parse(responseContent); var externalId = Int32.Parse(obj["dealId"]?.ToString()); return(new SendResponse { HttpStatusCode = httpResponse.StatusCode, ExternalId = externalId }); } } catch (Exception ex) { logger.Warn($"{ex}\nВозникла проблема, проверяем создался ли платеж на стороне битрикса"); return(await TryToGetExternalId(smsPaymentDto.OrderId, now)); } }
public PaymentResult SendPayment(int orderId, string phoneNumber) { logger.Info($"Поступил запрос на отправку платежа с данными orderId: {orderId}, phoneNumber: {phoneNumber}"); PaymentResult resultMessage = new PaymentResult(SmsPaymentStatus.WaitingForPayment); if (orderId <= 0) { resultMessage.ErrorDescription = "Неверное значение номера заказа"; logger.Error("Запрос на отправку платежа пришёл с неверным значением номера заказа"); return(resultMessage); } if (String.IsNullOrWhiteSpace(phoneNumber)) { resultMessage.ErrorDescription = "Неверное значение номера телефона"; logger.Error("Запрос на отправку платежа пришёл с неверным значение номера телефона"); return(resultMessage); } phoneNumber = phoneNumber.TrimStart('+').TrimStart('7').TrimStart('8'); if (String.IsNullOrWhiteSpace(phoneNumber) || phoneNumber.Length == 0 || phoneNumber.First() != '9' || phoneNumber.Length != 10) { resultMessage.ErrorDescription = "Неверный формат номера телефона"; logger.Error("Запрос на отправку платежа пришёл с неверным форматом номера телефона"); return(resultMessage); } phoneNumber = $"+7{phoneNumber}"; try { using (IUnitOfWork uow = UnitOfWorkFactory.CreateWithoutRoot()) { var order = uow.GetById <Order>(orderId); if (order == null) { resultMessage.ErrorDescription = $"Заказ с номером {orderId} не существующет в базе"; logger.Error($"Запрос на отправку платежа пришёл со значением номера заказа, не существующем в базе (Id: {orderId})"); return(resultMessage); } var paymentDto = new SmsPaymentDTO { Recepient = order.Client.Name, RecepientId = order.Client.Id, PhoneNumber = phoneNumber, PaymentStatus = SmsPaymentStatus.WaitingForPayment, OrderId = order.Id, PaymentCreationDate = DateTime.Now, Amount = order.OrderTotalSum, RecepientType = order.Client.PersonType }; var sendResponse = paymentWorker.SendPayment(paymentDto); if (sendResponse.HttpStatusCode == HttpStatusCode.OK) { var payment = CreateNewSmsPayment(uow, paymentDto, sendResponse.ExternalId); uow.Save(payment); uow.Commit(); logger.Info($"Создан новый платеж с данными: Id: {payment.Id}, orderId: {payment.Order.Id}, phoneNumber: {payment.PhoneNumber}"); } else { resultMessage.ErrorDescription = $"Не получилось отправить платёж. Http код: {sendResponse}"; logger.Error(resultMessage.ErrorDescription, $"Не получилось отправить платёж. Http код: {sendResponse}." + $" (orderId: {orderId}, phoneNumber: {phoneNumber})"); return(resultMessage); } } } catch (Exception ex) { resultMessage.ErrorDescription = $"Ошибка при отправке платежа. {ex.Message}"; logger.Error(ex, $"Ошибка при отправке платежа (orderId: {orderId}, phoneNumber: {phoneNumber})"); } return(resultMessage); }
public SendResponse SendPayment(SmsPaymentDTO smsPayment) { return(new SendResponse { HttpStatusCode = HttpStatusCode.OK, ExternalId = new System.Random().Next(1, 30000) }); }