{"record":{"id":"33add348a24655b1","repo":"nopSolutions/nopCommerce","slug":"payment-information-is-not-entered","errorCode":null,"errorMessage":"Payment information is not entered","messagePattern":"Payment information is not entered","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"src/Presentation/Nop.Web/Controllers/CheckoutController.cs","lineNumber":2062,"sourceCode":"                    throw new Exception(\"Your cart is empty\");\r\n\r\n                if (!_orderSettings.OnePageCheckoutEnabled)\r\n                    throw new Exception(\"One page checkout is disabled\");\r\n\r\n                if (await _customerService.IsGuestAsync(customer) && !_orderSettings.AnonymousCheckoutAllowed)\r\n                    throw new Exception(\"Anonymous checkout is not allowed\");\r\n\r\n                //prevent 2 orders being placed within an X seconds time frame\r\n                if (!await IsMinimumOrderPlacementIntervalValidAsync(customer))\r\n                    throw new Exception(await _localizationService.GetResourceAsync(\"Checkout.MinOrderPlacementInterval\"));\r\n\r\n                //place order\r\n                var processPaymentRequest = await _orderProcessingService.GetProcessPaymentRequestAsync();\r\n                if (processPaymentRequest == null)\r\n                {\r\n                    //Check whether payment workflow is required\r\n                    if (await _orderProcessingService.IsPaymentWorkflowRequiredAsync(cart))\r\n                        throw new Exception(\"Payment information is not entered\");\r\n\r\n                    processPaymentRequest = new ProcessPaymentRequest();\r\n                }\r\n\r\n                processPaymentRequest.StoreId = store.Id;\r\n                processPaymentRequest.CustomerId = customer.Id;\r\n                processPaymentRequest.PaymentMethodSystemName = await _genericAttributeService.GetAttributeAsync<string>(customer,\r\n                    NopCustomerDefaults.SelectedPaymentMethodAttribute, store.Id);\r\n                await _orderProcessingService.SetProcessPaymentRequestAsync(processPaymentRequest);\r\n                var placeOrderResult = await _orderProcessingService.PlaceOrderAsync(processPaymentRequest);\r\n                if (placeOrderResult.Success)\r\n                {\r\n                    await _orderProcessingService.SetProcessPaymentRequestAsync(null);\r\n                    var postProcessPaymentRequest = new PostProcessPaymentRequest\r\n                    {\r\n                        Order = placeOrderResult.PlacedOrder\r\n                    };\r\n\r","sourceCodeStart":2044,"sourceCodeEnd":2080,"githubUrl":"https://github.com/nopSolutions/nopCommerce/blob/64bdf2ff08c8b39e65717bcf974fb43dc2ef68f2/src/Presentation/Nop.Web/Controllers/CheckoutController.cs#L2044-L2080","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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)."],"exampleFix":"// before\nif (processPaymentRequest == null)\n{\n    if (await _orderProcessingService.IsPaymentWorkflowRequiredAsync(cart))\n        throw new Exception(\"Payment information is not entered\");\n    processPaymentRequest = new ProcessPaymentRequest();\n}\n\n// after: redirect to payment-info instead of throwing\nif (processPaymentRequest == null)\n{\n    if (await _orderProcessingService.IsPaymentWorkflowRequiredAsync(cart))\n        return Json(new { error = 1, goto_section = \"payment_info\" });\n    processPaymentRequest = new ProcessPaymentRequest();\n}","handlingStrategy":"validation","validationCode":"var ppr = await _orderProcessingService.GetProcessPaymentRequestAsync();\nif (ppr == null && await _orderProcessingService.IsPaymentWorkflowRequiredAsync(cart))\n    return Json(new { error = 1, goto_section = \"payment_info\" });","typeGuard":null,"tryCatchPattern":"catch (Exception exc) when (exc.Message == \"Payment information is not entered\")\n{\n    return Json(new { error = 1, goto_section = \"payment_info\" });\n}","preventionTips":["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."],"tags":["nopcommerce","checkout","opc","payment-info","session"],"backgroundTag":null,"analyzedSha":"64bdf2ff08c8b39e65717bcf974fb43dc2ef68f2","analyzedAt":"2026-08-13T21:19:38.062Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}