PayPal快速结账:检查付款可以点击链接
问题描述:
我使用贝宝快速结账(checkout.js V4.0.0)与asp.net的MVC以允许用户支付交易数据来进行。点击快速结账按钮时需要执行的操作是对数据库执行一些检查,并确认PayPal可以继续(这也与时间有关,因为数据库可能处于锁定的处理状态)。PayPal快速结账:检查付款可以点击链接
我设置了Advanced Server Integration,然后我打电话从支付部的创建支付控制器paypal.Button.render
,但预计要返回一个json
对象与PaymentID
元素。如果PayPal无法继续,我能在什么时候在服务器端执行这些检查并从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
返回类型。
答
您可以拨打reject(error)
取消付款。
答
当它是重定向或ok响应时,您可以返回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 });
}
亦认为的ModelState错误,你由于重定向,加入是无用的。
我现在有机会添加我正在使用的代码,但我不确定如何从mvc控制器调用'reject(error)',以便显示相应的错误消息。 – Ayb4btu