nopSolutions/nopCommerce · error · Exception
Payment information is not entered
Error message
Payment information is not entered
What it means
Thrown in OpcConfirmOrder when GetProcessPaymentRequestAsync returns null (no payment info was staged) AND a payment workflow is required for the cart (line ~2062). This means the customer reached confirm-order without having entered payment information that the payment plugin staged via SetProcessPaymentRequestAsync.
Source
Thrown at src/Presentation/Nop.Web/Controllers/CheckoutController.cs:2062
throw new Exception("Your cart is empty");
if (!_orderSettings.OnePageCheckoutEnabled)
throw new Exception("One page checkout is disabled");
if (await _customerService.IsGuestAsync(customer) && !_orderSettings.AnonymousCheckoutAllowed)
throw new Exception("Anonymous checkout is not allowed");
//prevent 2 orders being placed within an X seconds time frame
if (!await IsMinimumOrderPlacementIntervalValidAsync(customer))
throw new Exception(await _localizationService.GetResourceAsync("Checkout.MinOrderPlacementInterval"));
//place order
var processPaymentRequest = await _orderProcessingService.GetProcessPaymentRequestAsync();
if (processPaymentRequest == null)
{
//Check whether payment workflow is required
if (await _orderProcessingService.IsPaymentWorkflowRequiredAsync(cart))
throw new Exception("Payment information is not entered");
processPaymentRequest = new ProcessPaymentRequest();
}
processPaymentRequest.StoreId = store.Id;
processPaymentRequest.CustomerId = customer.Id;
processPaymentRequest.PaymentMethodSystemName = await _genericAttributeService.GetAttributeAsync<string>(customer,
NopCustomerDefaults.SelectedPaymentMethodAttribute, store.Id);
await _orderProcessingService.SetProcessPaymentRequestAsync(processPaymentRequest);
var placeOrderResult = await _orderProcessingService.PlaceOrderAsync(processPaymentRequest);
if (placeOrderResult.Success)
{
await _orderProcessingService.SetProcessPaymentRequestAsync(null);
var postProcessPaymentRequest = new PostProcessPaymentRequest
{
Order = placeOrderResult.PlacedOrder
};
View on GitHub (pinned to 64bdf2ff08)
Solutions
- Ensure OpcSavePaymentInfo runs successfully and stages the ProcessPaymentRequest before confirm; redirect back to payment-info if GetProcessPaymentRequestAsync is null.
- Verify session/temp-data persistence (configure distributed session like Redis/SQL Server in load-balanced deployments).
- Confirm IsPaymentWorkflowRequiredAsync logic matches the cart total (zero-total carts should not require a workflow).
Example fix
// before
if (processPaymentRequest == null)
{
if (await _orderProcessingService.IsPaymentWorkflowRequiredAsync(cart))
throw new Exception("Payment information is not entered");
processPaymentRequest = new ProcessPaymentRequest();
}
// after: redirect to payment-info instead of throwing
if (processPaymentRequest == null)
{
if (await _orderProcessingService.IsPaymentWorkflowRequiredAsync(cart))
return Json(new { error = 1, goto_section = "payment_info" });
processPaymentRequest = new ProcessPaymentRequest();
} Defensive patterns
Strategy: validation
Validate before calling
var ppr = await _orderProcessingService.GetProcessPaymentRequestAsync();
if (ppr == null && await _orderProcessingService.IsPaymentWorkflowRequiredAsync(cart))
return Json(new { error = 1, goto_section = "payment_info" }); Try / catch
catch (Exception exc) when (exc.Message == "Payment information is not entered")
{
return Json(new { error = 1, goto_section = "payment_info" });
} Prevention
- Use durable (distributed) session/temp-data storage so the staged ProcessPaymentRequest survives app recycles.
- Enforce OPC step ordering so confirm-order cannot run before payment-info.
- Verify IsPaymentWorkflowRequiredAsync returns false for zero-total carts.
When it happens
Trigger: OpcSavePaymentInfo was skipped or failed silently so no ProcessPaymentRequest was stored in the session/temp data; the cart contains items requiring payment but no payment info was collected; session/temp storage was lost between steps.
Common situations: Customer back-navigated and skipped the payment-info step; the payment-info POST failed validation but the flow continued; in-memory session lost on app recycle; a free/zero-total flow was expected but IsPaymentWorkflowRequiredAsync still returned true due to misconfiguration.
Related errors
- Order payment info not found
- Your cart is empty
- Address can't be loaded
- Selected payment method can't be parsed
- One page checkout is disabled
AI-assisted analysis of nopSolutions/nopCommerce@64bdf2ff08 (2026-08-13).
Data as JSON: /api/errors/33add348a24655b1.
Report an issue: GitHub.