2017-02-09 103 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錯誤,你由於重定向,加入是無用的。