0

我有一个使用 UCommerce 构建的电子商务网站。在结帐过程中,用户将被重定向到支付门户进行支付。

当用户在支付门户中时,我想阻止用户在购物篮中添加新项目。我目前的解决方案是在将用户重定向到支付门户之前将购物篮保存到Session中。

Session["checkoutOrder"] = TransactionLibrary.GetBasket(!TransactionLibrary.HasBasket()).PurchaseOrder;

付款后如何用 Session 中的购物篮覆盖当前购物篮?这是为了将篮子恢复到付款前的原始状态。

我试过这个:

[HttpPost]
public ActionResult ExecutePayment()
{
var order = Session["checkoutOrder"] as PurchaseOrder;
order.Save();
...
}

但是我在 order.Save() 上遇到错误:

Batch update returned unexpected row count from update; actual row count: 0; expected: 1
4

2 回答 2

2

我还要补充一点,您的 Session["orderInProcess"] 是 uCommerce 中的反模式。当您通过可能/将导致 Session 处理异常的请求持久化 NHibernate 实体时,您可能会遇到令人讨厌的异常。它还可能导致您遇到的初始异常,因为您实际上是在绕过 NHibernate 的会话状态。

只需在TransactionLibrary.GetBasket(!TransactionLibrary.HasBasket()).PurchaseOrder;每次取回篮子时使用。NHibernate 将负责为您缓存订单。

然后您可以使用订单属性来保存您所处的状态。

var basket = TransactionLibrary.GetBasket(!TransactionLibrary.HasBasket()).PurchaseOrder;
basket["CheckoutInProcess"] = "True";

最好的问候莫腾

于 2016-10-04T10:08:03.870 回答
0

我的处理方式不同,因为我无法将篮子恢复到原来的状态。

我决定在付款过程中阻止用户在购物篮中添加商品。

在将用户重定向到支付网关之前,我创建了一个会话Session["orderInProcess"]=true 。

现在,每次用户尝试在购物篮中添加新商品时,我都会先检查他当前的订单是否正在处理中。像这样:

[HttpPost]
public ActionResult AddToBasket(string sku, string quantity, string variant = null)
{

     if (Session["orderInProcess"] != null)
     {
         if (bool.Parse(Session["orderInProcess"].ToString()))
         {
             return Json(new
             {
                  Success = false,
                  ErrorMessage = "Order is currently in process."
             });
          }
      }
   .....
}

我希望这有帮助。

于 2016-08-29T13:45:08.017 回答