点击PayPal捐赠按钮后输入的捐赠金额存入数据库始终为0如何解决
问题修复方案
核心故障原因
- 表单
action属性直接配置为PayPal官方地址,提交请求直接发送到PayPal服务,根本没有请求你本地的控制器接口,自然无法获取金额存入本地数据库 - 金额输入框的
name属性为小写amount,和模型MoneyDonation里大写开头的Amount属性不匹配,就算请求发到本地接口,模型绑定也会失败,属性会被赋值为decimal类型的默认值0 - 现有逻辑没有做本地存库和跳转到PayPal支付的流程衔接,直接提交给第三方肯定拿不到本地需要的数据
具体修复步骤
- 第一步:调整表单提交目标,先提交到你本地的控制器接口
把原来的form标签替换为:
<form action="/你的控制器名称/Index" method="post">
- 第二步:修正金额输入框的属性,匹配模型字段名,建议替换为强类型输入组件降低绑定出错概率,把原金额输入行替换为:
@Html.TextBoxFor(model => model.Amount) @Html.LabelFor(model => model.Amount)
- 第三步:修改控制器逻辑,存库成功后构造PayPal支付参数,重定向到PayPal支付页即可
控制器修改后代码参考:
private ApplicationDbContext db = new ApplicationDbContext(); [HttpPost] public ActionResult Index([Bind(Include = "Id,Amount,User_Id")] MoneyDonation moneyDonation) { if(ModelState.IsValid && moneyDonation.Amount > 0) { moneyDonation.User_Id = User.Identity.GetUserId(); db.moneydonation.Add(moneyDonation); db.SaveChanges(); // 构造PayPal支付参数重定向 var payPalParams = new Dictionary<string, string> { {"cmd", "_xclick"}, {"business", "elias.odeh@hotmail.com"}, {"notify_url", "http://你的域名/notifypage.aspx"}, {"invoice", moneyDonation.Id.ToString()}, {"item_name", "Donation"}, {"item_number", "1"}, {"amount", moneyDonation.Amount.ToString()}, {"currency_code", "USD"}, {"bn", "PP-BuyNowBF"} }; var queryStr = string.Join("&", payPalParams.Select(kv => $"{kv.Key}={Uri.EscapeDataString(kv.Value)}")); return Redirect($"https://www.paypal.com/donate?{queryStr}"); } ModelState.AddModelError("", "请输入有效的捐赠金额"); return View(moneyDonation); }
- 可选优化:如果需要保证捐赠记录和实际支付结果一致,可以对接PayPal的IPN回调接口,收到官方的支付成功通知后再更新本地捐赠记录的支付状态,避免数据误差。
内容的提问来源于stack exchange,提问作者elias odeh
相关产品推荐
相关产品推荐

