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

  1. Ensure OpcSavePaymentInfo runs successfully and stages the ProcessPaymentRequest before confirm; redirect back to payment-info if GetProcessPaymentRequestAsync is null.
  2. Verify session/temp-data persistence (configure distributed session like Redis/SQL Server in load-balanced deployments).
  3. 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

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


AI-assisted analysis of nopSolutions/nopCommerce@64bdf2ff08 (2026-08-13). Data as JSON: /api/errors/33add348a24655b1. Report an issue: GitHub.