コード例 #1
0
        public StatusCode ReceivePayment(RequestBody body)
        {
            var externalId = body.ExternalId;
            var status     = (SmsPaymentStatus)body.Status;
            var paidDate   = DateTime.Parse(body.PaidDate);
            int orderId;

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

            var acceptedStatuses = new[] { SmsPaymentStatus.Paid, SmsPaymentStatus.Cancelled };

            if (externalId == 0 || !acceptedStatuses.Contains(status))
            {
                logger.Error($"Запрос на изменение статуса пришёл с неверным статусом (status: {status})");
                return(new StatusCode(HttpStatusCode.UnsupportedMediaType));
            }
            try {
                using (IUnitOfWork uow = UnitOfWorkFactory.CreateWithoutRoot()) {
                    var payment = uow.Session.QueryOver <SmsPayment>().Where(x => x.ExternalId == externalId).Take(1).SingleOrDefault();
                    if (payment == null)
                    {
                        logger.Error($"Запрос на изменение статуса платежа указывает на несуществующий платеж (externalId: {externalId})");
                        return(new StatusCode(HttpStatusCode.UnsupportedMediaType));
                    }
                    var oldStatus      = payment.SmsPaymentStatus;
                    var oldPaymentType = payment.Order.PaymentType;

                    payment.SmsPaymentStatus = status;

                    if (status == SmsPaymentStatus.Paid)
                    {
                        payment.PaidDate = paidDate;

                        PaymentFrom smsPaymentFrom = uow.GetById <PaymentFrom>(new BaseParametersProvider().GetSmsPaymentByCardFromId);
                        if (payment.Order.PaymentType != PaymentType.ByCard || payment.Order.PaymentByCardFrom.Id != smsPaymentFrom.Id)
                        {
                            payment.Order.PaymentType       = PaymentType.ByCard;
                            payment.Order.PaymentByCardFrom = smsPaymentFrom;
                            payment.Order.OnlineOrder       = externalId;
                        }
                    }
                    uow.Save(payment);
                    uow.Commit();
                    orderId = payment.Order.Id;

                    if (oldStatus != status)
                    {
                        logger.Info($"Статус платежа № {payment.Id} изменён c {oldStatus} на {status}");
                    }
                    if (oldPaymentType != PaymentType.ByCard)
                    {
                        logger.Info($"Тип оплаты заказа № {payment.Order.Id} изменён c {oldPaymentType} на {PaymentType.ByCard}");
                    }
                }
            }
            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));
        }
コード例 #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, 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}");

                        #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, $"Не получилось уведомить службу водителей об обновлении статуса заказа");
            }

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

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