コード例 #1
0
        public SendResponse SendPayment(SmsPaymentDTO smsPayment)
        {
            Task <SendResponse> task = SendPaymentAsync(smsPayment);

            task.Wait();
            return(task.Result);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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
                });
            }
        }
コード例 #4
0
 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);
 }
コード例 #5
0
 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
     });
 }
コード例 #6
0
        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);
        }
コード例 #7
0
        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));
            }
        }
コード例 #8
0
        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);
        }
コード例 #9
0
 public SendResponse SendPayment(SmsPaymentDTO smsPayment)
 {
     return(new SendResponse {
         HttpStatusCode = HttpStatusCode.OK, ExternalId = new System.Random().Next(1, 30000)
     });
 }