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 金额 总错配的主要内容,如果未能解决你的问题,请参考以下文章