コード例 #1
0
        public StatusCode ReceivePayment(RequestBody body)
        {
            int orderId;
            int externalId          = 0;
            SmsPaymentStatus status = SmsPaymentStatus.ReadyToSend;

            try
            {
                orderId    = body.OrderId;
                externalId = body.ExternalId;
                status     = (SmsPaymentStatus)body.Status;
                var paidDate = DateTime.Parse(body.PaidDate);

                _logger.Info($"Поступил запрос на изменения статуса платежа с параметрами externalId: {externalId}, orderId: {orderId}, status: {status} и paidDate: {paidDate}");

                var acceptedStatuses = new[] { SmsPaymentStatus.Paid, SmsPaymentStatus.Cancelled };
                if (externalId == 0 || !acceptedStatuses.Contains(status))
                {
                    _logger.Error($"Запрос на изменение статуса пришёл с неверным статусом или внешним Id (status: {status}, externalId: {externalId})");
                    return(new StatusCode(HttpStatusCode.UnsupportedMediaType));
                }

                using (IUnitOfWork uow = UnitOfWorkFactory.CreateWithoutRoot()) {
                    SmsPayment payment;
                    try {
                        payment = uow.Session.QueryOver <SmsPayment>().Where(x => x.ExternalId == externalId).Take(1).SingleOrDefault();
                    }
                    catch (Exception e) {
                        _logger.Error(e, "При загрузке платежа по externalId произошла ошибка, записываю данные файл...");
                        _smsPaymentFileCache.WritePaymentCache(null, externalId);
                        return(new StatusCode(HttpStatusCode.OK));
                    }

                    if (payment == null)
                    {
                        _logger.Warn($"Запрос на изменение статуса платежа указывает на несуществующий платеж (externalId: {externalId}).\n" +
                                     $"Применяю оплату для первого попавшегося неотправленного платёжа для заказа №{orderId}"
                                     );

                        if (orderId <= 0)
                        {
                            _logger.Warn(
                                $"Был передан невалидный номер заказа (orderId: {orderId}). Получить неотправленный платёж невозможно");
                            return(new StatusCode(HttpStatusCode.UnsupportedMediaType));
                        }

                        var unsendedPayment = uow.Session.QueryOver <SmsPayment>()
                                              .Where(sp => sp.Order.Id == orderId)
                                              .And(sp => sp.SmsPaymentStatus == SmsPaymentStatus.ReadyToSend)
                                              .Take(1)
                                              .SingleOrDefault();

                        if (unsendedPayment != null)
                        {
                            _logger.Info($"Применяю оплату для платежа: {unsendedPayment.Id} {unsendedPayment.SmsPaymentStatus} {unsendedPayment.CreationDate}");
                            unsendedPayment.ExternalId = externalId;
                            payment = unsendedPayment;
                        }
                        else
                        {
                            _logger.Warn($"Для заказа №{orderId} не найдено неотправленных платежей");
                            return(new StatusCode(HttpStatusCode.UnsupportedMediaType));
                        }
                    }
                    if (payment.SmsPaymentStatus == status)
                    {
                        _logger.Info($"Платеж с externalId: {externalId} уже имеет актуальный статус {status}");
                        return(new StatusCode(HttpStatusCode.OK));
                    }

                    var oldStatus      = payment.SmsPaymentStatus;
                    var oldPaymentType = payment.Order.PaymentType;

                    switch (status)
                    {
                    case SmsPaymentStatus.Paid:
                        payment.SetPaid(uow, paidDate == default(DateTime) ? DateTime.Now : paidDate, uow.GetById <PaymentFrom>(_orderParametersProvider.PaymentByCardFromSmsId));
                        break;

                    case SmsPaymentStatus.Cancelled:
                        payment.SetCancelled();
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }

                    try {
                        uow.Save(payment);
                        uow.Commit();

                        orderId = payment.Order.Id;

                        _logger.Info($"Статус платежа с externalId: {payment.ExternalId} изменён c {oldStatus} на {status}");

                        if (oldPaymentType != payment.Order.PaymentType)
                        {
                            _logger.Info(
                                $"Тип оплаты заказа № {payment.Order.Id} изменён c {oldPaymentType} на {payment.Order.PaymentType}");
                        }
                    }
                    catch (Exception e) {
                        _logger.Error(e, "При сохранении платежа произошла ошибка, записываю в файл...");
                        _smsPaymentFileCache.WritePaymentCache(payment.Id, payment.ExternalId);
                        return(new StatusCode(HttpStatusCode.OK));
                    }
                }
            }
            catch (Exception ex) {
                _logger.Error(ex, $"Ошибка при обработке поступившего платежа (externalId: {externalId}, status: {status})");
                return(new StatusCode(HttpStatusCode.InternalServerError));
            }

            try
            {
                _smsPaymentStatusNotificationReciever.NotifyOfSmsPaymentStatusChanged(orderId).Wait();
            }
            catch (Exception ex)
            {
                _logger.Error(ex, $"Не получилось уведомить DriverAPI об обновлении статуса заказа");
            }

            return(new StatusCode(HttpStatusCode.OK));
        }
コード例 #2
0
        public StatusCode ReceivePayment(RequestBody body)
        {
            int orderId;
            int externalId          = 0;
            SmsPaymentStatus status = SmsPaymentStatus.ReadyToSend;

            try {
                externalId = body.ExternalId;
                status     = (SmsPaymentStatus)body.Status;
                var paidDate = DateTime.Parse(body.PaidDate);

                logger.Info($"Поступил запрос на изменения статуса платежа с параметрами externalId: {externalId}, status: {status} и paidDate: {paidDate}");

                var acceptedStatuses = new[] { SmsPaymentStatus.Paid, SmsPaymentStatus.Cancelled };
                if (externalId == 0 || !acceptedStatuses.Contains(status))
                {
                    logger.Error($"Запрос на изменение статуса пришёл с неверным статусом или внешним Id (status: {status}, externalId: {externalId})");
                    return(new StatusCode(HttpStatusCode.UnsupportedMediaType));
                }

                using (IUnitOfWork uow = UnitOfWorkFactory.CreateWithoutRoot()) {
                    SmsPayment payment;

                    try {
                        payment = uow.Session.QueryOver <SmsPayment>().Where(x => x.ExternalId == externalId).Take(1).SingleOrDefault();
                    }
                    catch (Exception e) {
                        logger.Error(e, "При загрузке платежа по externalId произошла ошибка, записываю данные файл...");
                        smsPaymentFileCache.WritePaymentCache(null, externalId);
                        return(new StatusCode(HttpStatusCode.OK));
                    }

                    if (payment == null)
                    {
                        logger.Error($"Запрос на изменение статуса платежа указывает на несуществующий платеж (externalId: {externalId})");
                        return(new StatusCode(HttpStatusCode.UnsupportedMediaType));
                    }
                    if (payment.SmsPaymentStatus == status)
                    {
                        logger.Info($"Платеж с externalId: {externalId} уже имеет актуальный статус {status}");
                        return(new StatusCode(HttpStatusCode.OK));
                    }

                    var oldStatus      = payment.SmsPaymentStatus;
                    var oldPaymentType = payment.Order.PaymentType;

                    switch (status)
                    {
                    case SmsPaymentStatus.Paid:
                        payment.SetPaid(uow, DateTime.Now, uow.GetById <PaymentFrom>(orderParametersProvider.PaymentByCardFromSmsId));
                        break;

                    case SmsPaymentStatus.Cancelled:
                        payment.SetCancelled();
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }

                    try {
                        uow.Save(payment);
                        uow.Commit();

                        orderId = payment.Order.Id;
                        logger.Info($"Статус платежа с externalId: {payment.ExternalId} изменён c {oldStatus} на {status}");

                        #region OrderStatusChanged
                        if (oldPaymentType != payment.Order.PaymentType)
                        {
                            logger.Info(
                                $"Тип оплаты заказа № {payment.Order.Id} изменён c {oldPaymentType} на {payment.Order.PaymentType}");
                        }
                        #endregion
                    }
                    catch (Exception e) {
                        logger.Error(e, "При сохранении платежа произошла ошибка, записываю в файл...");
                        smsPaymentFileCache.WritePaymentCache(payment.Id, payment.ExternalId);
                        return(new StatusCode(HttpStatusCode.OK));
                    }
                }
            }
            catch (Exception ex) {
                logger.Error(ex, $"Ошибка при обработке поступившего платежа (externalId: {externalId}, status: {status})");
                return(new StatusCode(HttpStatusCode.InternalServerError));
            }

            try {
                androidDriverService.RefreshPaymentStatus(orderId);
            }
            catch (Exception ex) {
                logger.Error(ex, $"Не получилось уведомить службу водителей об обновлении статуса заказа");
            }

            return(new StatusCode(HttpStatusCode.OK));
        }