下订单,在Nop Commerce 4中清除购物车

时间:2019-11-18 14:24:53

标签: shopping-cart nopcommerce

如何从购物车下订单并清除购物车? 我想在自己的控制器中执行此操作,而不是在结帐页面中执行此操作。

我尝试使用它,但是不起作用

//place order
var processPaymentRequest = HttpContext.Session.Get<ProcessPaymentRequest>("OrderPaymentInfo");

if (processPaymentRequest == null)
{
    //Check whether payment workflow is required
    if (_orderProcessingService.IsPaymentWorkflowRequired(cart))
        return RedirectToRoute("CheckoutPaymentInfo");

    processPaymentRequest = new ProcessPaymentRequest();
}
GenerateOrderGuid(processPaymentRequest);
processPaymentRequest.StoreId = _storeContext.CurrentStore.Id;
processPaymentRequest.CustomerId = _workContext.CurrentCustomer.Id;
processPaymentRequest.PaymentMethodSystemName = 
_genericAttributeService.GetAttribute<string>(_workContext.CurrentCustomer,
NopCustomerDefaults.SelectedPaymentMethodAttribute, 
_storeContext.CurrentStore.Id);
HttpContext.Session.Set<ProcessPaymentRequest>("OrderPaymentInfo", 
                 processPaymentRequest);
                var placeOrderResult = _orderProcessingService.PlaceOrder(processPaymentRequest);

1 个答案:

答案 0 :(得分:0)

您可以在PlaceOrder中使用IOrderProcessingService方法下订单。 CheckoutController也使用此方法。要使用它,您必须自己创建一个ProcessPaymentRequest。这是执行此任务的示例代码(我使用CheckoutController中放置的代码执行相同的工作):

var processPaymentRequest = HttpContext.Session.Get<ProcessPaymentRequest>("OrderPaymentInfo");
if (processPaymentRequest == null)
{
    //Check whether payment workflow is required
    if (_orderProcessingService.IsPaymentWorkflowRequired(cart))
        return RedirectToRoute("CheckoutPaymentInfo");

    processPaymentRequest = new ProcessPaymentRequest();
}

//prevent 2 orders being placed within an X seconds time frame
if (!IsMinimumOrderPlacementIntervalValid(_workContext.CurrentCustomer))
    throw new Exception(_localizationService.GetResource("Checkout.MinOrderPlacementInterval"));

//place order
processPaymentRequest.StoreId = _storeContext.CurrentStore.Id;
processPaymentRequest.CustomerId = _workContext.CurrentCustomer.Id;
processPaymentRequest.PaymentMethodSystemName = _workContext.CurrentCustomer.GetAttribute<string>(
SystemCustomerAttributeNames.SelectedPaymentMethod,
_genericAttributeService, _storeContext.CurrentStore.Id);
//____this is main line of code____
var placeOrderResult = _orderProcessingService.PlaceOrder(processPaymentRequest);
if (placeOrderResult.Success)
{
    HttpContext.Session.Set<ProcessPaymentRequest>("OrderPaymentInfo", null);
    //do payment process:
    var postProcessPaymentRequest = new PostProcessPaymentRequest
    {
        Order = placeOrderResult.PlacedOrder
    };
    _paymentService.PostProcessPayment(postProcessPaymentRequest);

    if (_webHelper.IsRequestBeingRedirected || _webHelper.IsPostBeingDone)
    {
        //redirection or POST has been done in PostProcessPayment
        return Content("Redirected");
    }

    return RedirectToRoute("CheckoutCompleted", new { orderId = placeOrderResult.PlacedOrder.Id });
}