PayPal 快速结账:点击按钮即可查看付款
Posted
技术标签:
【中文标题】PayPal 快速结账:点击按钮即可查看付款【英文标题】:PayPal express checkout: checking payment can be performed on button click 【发布时间】:2017-06-27 05:42:27 【问题描述】:我正在使用带有 asp.net mvc 的 PayPal express checkout (checkout.js V4.0.0) 来允许用户为数据交易付费。单击快速结帐按钮时,我需要做的是对数据库执行一些检查并确认 PayPal 可以继续(这也与时间相关,因为数据库可能处于 锁定 处理状态) .
我已经设置了Advanced Server Integration,然后我从paypal.Button.render
的支付部分调用了create-payment 控制器,但这需要返回一个带有PaymentID
元素的json
对象。如果 PayPal 无法继续,我什么时候可以在服务器端执行这些检查并中止 paypal 流程?如果检查失败,服务器端还需要返回适当的错误页面或消息来显示。
这是支付宝按钮代码:
<script src="https://www.paypalobjects.com/api/checkout.js"></script>
<script>
paypal.Button.render(
env: 'sandbox',
payment: function (resolve, reject)
var CREATE_PAYMENT_URL = '@Url.Action("PayTransactions","Pending")';
paypal.request.post(CREATE_PAYMENT_URL)
.then(function (data) resolve(data.paymentID); )
.catch(function (err) reject(err); );
,
onAuthorize: function(data)
var EXECUTE_PAYMENT_URL = 'https://my-store.com/paypal/execute-payment';
paypal.request.post(EXECUTE_PAYMENT_URL,
paymentID: data.paymentID,
payerID: data.payerID
)
.then(function(data) /* Go to a success page */ )
.catch(function (err) /* Go to an error page */ );
,
onCancel: function (data, actions)
return actions.redirect();
,
onError: function (err)
// Show an error page here, when an error occurs
, '#paypal-button');
</script>
在支付部分称之为:
public async Task<string> PayTransactions()
// check if payment is still necessary or end of month is running
var condition = await CheckDatabaseIsUsable();
switch (condition)
case 1:
ModelState.AddModelError("error", "some error message");
return RedirectToAction("Index", "Pending");
case 2:
ModelState.AddModelError("error", "some other error");
return RedirectToAction("Index", "Pending");
var paypalPayment = FormPayPalPaymentObject();
return JsonConvert.SerializeObject(new paymentID = paypalPayment.PaymentId );
问题是我现在混合了 ActionResult
和 json string
返回类型。
【问题讨论】:
【参考方案1】:您也可以为重定向响应返回 json,并在重定向或正常响应时使用 javascript 进行控制。
服务器端:
return JsonConvert.SerializeObject(new redirect= Url.Action("Index", "Pending") );
Javascript:
paypal.request.post(CREATE_PAYMENT_URL)
.then(function (data)
if(data.redirect)
//cancel the flow and redirect if needed
window.location.href = data.redirect;
else
resolve(data.paymentID);
)
.catch(function (err) reject(err); );
,
最好使用 IActionResult
对象作为 PayTransactions 的返回值
public async Task<IActionResult> PayTransactions()
...
return Json(new paymentID = paypalPayment.PaymentId );
还要考虑到由于重定向,您添加的模型状态错误是无用的。
【讨论】:
【参考方案2】:您可以拨打reject(error)
取消付款。
【讨论】:
我现在有机会添加我正在使用的代码,但我不确定如何从 mvc 控制器调用reject(error)
以便显示相应的错误消息.以上是关于PayPal 快速结账:点击按钮即可查看付款的主要内容,如果未能解决你的问题,请参考以下文章