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)); }
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)); }