Я интегрирую платформу онлайн-платежей в существующую платформу электронной коммерции.Это платформа B2B, и клиенты могут вносить предоплату (используя вышеупомянутую платформу для онлайн-платежей) или размещать свои заказы и выставлять счета в конце месяца.
Следующее действие находится вOrdersController
и содержит логику, которая активируется, когда клиент хочет подтвердить свой заказ:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Resume(ResumeViewModel viewModel)
{
if (!_orderService.CanConfirmOrder(UserId, viewModel.TemporaryOrderId))
{
return Resume(viewModel.TemporaryOrderId, _settingsRepository.OrderTooLateMessage());
}
if (_customerService.MustPayDirectly(PaniproId))
{
return RedirectToAction("Initialize", "Payments", new { orderId = viewModel.TemporaryOrderId, amount = viewModel.OrderViewModel.Total });
}
return RedirectToAction("Confirm", new { id = viewModel.TemporaryOrderId });
}
PaymentsController
отвечает за перенаправление на действие Confirm
, если платеж был успешным наПлатформа удаленного платежа:
public ActionResult Finalize(int orderId)
{
var finalizeResult = _saferpay.FinalizeTransaction((string)_tokens[orderId.ToString()]);
if (finalizeResult.IsSuccess)
{
return RedirectToAction("Confirm", "Orders", new { id = orderId });
}
else
{
LogTools.AddLog(finalizeResult.Error.ToString());
return RedirectToAction("Resume", "Orders", new { id = orderId, errorMessage = finalizeResult.Error.Description });
}
}
Таким образом, в конечном итоге оба «потока» заканчиваются действием, приведенным ниже, которое окончательно подтверждает заказ и перенаправляет его на подтверждение:
public ActionResult Confirm(int id)
{
return HandleResult(_orderService.ConfirmOrder(UserId, id), order => RedirectToAction("Confirmation", new { id = order.ID }));
}
Я беспокоюсь овышеуказанное действие имеет два аспекта:
- Я изменяю состояние в действии GET, которое должно быть операцией без состояния
- Ручной вызов URL / Orders / Confirm / {id} будет пропускать платежи это тоже очень плохо для бизнеса
В идеале я хотел бы сделать что-то вроде добавления атрибутов [HttpPost]
и [ValidateAntiForgeryToken]
кего действия, но тогда становится невозможным сделать редирект на него.Как я могу решить эту проблему ?Мой дизайн имеет недостатки и нуждается в рефакторе?