2017-02-09 104 views
0

我使用贝宝快速结账(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返回类型。

回答

0

您可以拨打reject(error)取消付款。

+0

我现在有机会添加我正在使用的代码,但我不确定如何从mvc控制器调用'reject(error)',以便显示相应的错误消息。 – Ayb4btu

0

当它是重定向或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错误,你由于重定向,加入是无用的。