paypal 金额 总错配

Posted

技术标签:

【中文标题】paypal 金额 总错配【英文标题】:paypal Amount Total mismatch 【发布时间】:2018-10-31 07:37:49 【问题描述】:

当我使用 Paypal 登录我的网站时,它给了我这样的消息:“结帐错误 - 金额总不匹配”我使用 Microsoft 教程来实现 PayPal:

https://docs.microsoft.com/en-us/aspnet/web-forms/overview/getting-started/getting-started-with-aspnet-45-web-forms/checkout-and-payment-with-paypal

我完全按照它所说的做了,我什至做了两次,但不知何故一直收到这个错误感谢您的帮助谢谢

public partial class CheckoutReview : System.Web.UI.Page

    protected void Page_Load(object sender, EventArgs e)
    
        if (!IsPostBack)
        
            NVPAPICaller payPalCaller = new NVPAPICaller();

            string retMsg = "";
            string token = "";
            string PayerID = "";
            NVPCodec decoder = new NVPCodec();
            token = Session["token"].ToString();

            bool ret = payPalCaller.GetCheckoutDetails(token, ref PayerID, ref decoder, ref retMsg);
            if (ret)
            
                Session["payerId"] = PayerID;

                var myOrder = new Order();
                myOrder.OrderDate = Convert.ToDateTime(decoder["TIMESTAMP"].ToString());
                myOrder.Username = User.Identity.Name;
                myOrder.FirstName = decoder["FIRSTNAME"].ToString();
                myOrder.LastName = decoder["LASTNAME"].ToString();
                myOrder.Address = decoder["SHIPTOSTREET"].ToString();
                myOrder.City = decoder["SHIPTOCITY"].ToString();
                myOrder.State = decoder["SHIPTOSTATE"].ToString();
                myOrder.PostalCode = decoder["SHIPTOZIP"].ToString();
                myOrder.Country = decoder["SHIPTOCOUNTRYCODE"].ToString();
                myOrder.Email = decoder["EMAIL"].ToString();
                myOrder.Total = Convert.ToDecimal(decoder["AMT"].ToString());

                // Verify total payment amount as set on CheckoutStart.aspx.
                try
                
                    decimal paymentAmountOnCheckout = Convert.ToDecimal(Session["payment_amt"].ToString());
                    decimal paymentAmoutFromPayPal = Convert.ToDecimal(decoder["AMT"].ToString());
                    if (paymentAmountOnCheckout != paymentAmoutFromPayPal)
                    
                        Response.Redirect("CheckoutError.aspx?" + "Desc=Amount%20total%20mismatch.");
                    
                
                catch (Exception)
                
                    Response.Redirect("CheckoutError.aspx?" + "Desc=Amount%20total%20mismatch.");
                

                // Get DB context.
                ProductContext _db = new ProductContext();

                // Add order to DB.
                _db.Orders.Add(myOrder);
                _db.SaveChanges();

                // Get the shopping cart items and process them.
                using (WingtipToys.Logic.ShoppingCartActions usersShoppingCart = new WingtipToys.Logic.ShoppingCartActions())
                
                    List<CartItem> myOrderList = usersShoppingCart.GetCartItems();

                    // Add OrderDetail information to the DB for each product purchased.
                    for (int i = 0; i < myOrderList.Count; i++)
                    
                        // Create a new OrderDetail object.
                        var myOrderDetail = new OrderDetail();
                        myOrderDetail.OrderId = myOrder.OrderId;
                        myOrderDetail.Username = User.Identity.Name;
                        myOrderDetail.ProductId = myOrderList[i].ProductId;
                        myOrderDetail.Quantity = myOrderList[i].Quantity;
                        myOrderDetail.UnitPrice = myOrderList[i].Product.UnitPrice;

                        // Add OrderDetail to DB.
                        _db.OrderDetails.Add(myOrderDetail);
                        _db.SaveChanges();
                    

                    // Set OrderId.
                    Session["currentOrderId"] = myOrder.OrderId;

                    // Display Order information.
                    List<Order> orderList = new List<Order>();
                    orderList.Add(myOrder);
                    ShipInfo.DataSource = orderList;
                    ShipInfo.DataBind();

                    // Display OrderDetails.
                    OrderItemList.DataSource = myOrderList;
                    OrderItemList.DataBind();
                
            
            else
            
                Response.Redirect("CheckoutError.aspx?" + retMsg);
            
        
    

    protected void CheckoutConfirm_Click(object sender, EventArgs e)
    
        Session["userCheckoutCompleted"] = "true";
        Response.Redirect("~/Checkout/CheckoutComplete.aspx");
    

【问题讨论】:

【参考方案1】:

我在做教程时遇到了同样的问题,所以这是我的解决方案,以防有人遇到它。

这里的主要问题是 Asp.NET 将金额的字符串版本显示为 XX,XX 而不是 XX.XX。这是因为.ToString()-函数会显示当前区域中写入的小数。

为了解决这个问题,每个.ToString()Convert.ToDecimal() 都应该使用一个名为CultureInfo.InvariantCulture 的额外参数来调用,以确保字符串数量以XX.XX 格式存储在内存中。

我希望这对将来的人有所帮助。

【讨论】:

以上是关于paypal 金额 总错配的主要内容,如果未能解决你的问题,请参考以下文章

Paypal 显示一个金额,但收取另一个金额

“立即捐赠”按钮的 Paypal 自定义金额

Paypal 不返回实际总金额

如何在android中将金额从一个paypal帐户转移到另一个paypal帐户

Paypal订阅按钮,动态金额

如何将金额从 PayPal 转入信用卡