【问题标题】:PayPal express checkout: checking payment can be performed on button clickPayPal 快速结账:点击按钮即可查看付款
【发布时间】: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 返回类型。

【问题讨论】:

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


    【解决方案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) 以便显示相应的错误消息.
      猜你喜欢
      • 2011-08-06
      • 2012-03-08
      • 2014-02-27
      • 2015-01-19
      • 2013-10-21
      • 2014-12-03
      • 2011-12-03
      • 1970-01-01
      • 2014-06-23
      相关资源
      最近更新 更多