PayPal快速结账:可以在点击按钮时执行支票付款

时间:2017-02-09 09:31:57

标签: c# asp.net paypal express-checkout

我正在使用PayPal express checkout (checkout.js V4.0.0)和 asp.net mvc 来允许用户为数据交易付费。单击快速结账按钮时我需要做的是对数据库执行一些检查并确认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返回类型。

2 个答案:

答案 0 :(得分:0)

您可以致电TABLE a; id_a | name ------+------ 2 | foo (1 row) test=# TABLE b; id_b | id_a | val ------+------+----- 1 | 2 | 42 取消付款。

答案 1 :(得分: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 });
}

还要考虑由于重定向而导致的模型状态错误无用。