【问题标题】:Payment Authorization & Capture the Payment (Future) using PayPal-node-SDK (PayPal Express Checkout)使用 PayPal-node-SDK(PayPal Express Checkout)进行付款授权和捕获付款(未来)
【发布时间】:2015-11-11 14:45:35
【问题描述】:

我正在使用 PayPal Express Checkout,我需要做的是稍后分别授权和捕获付款,我当前的 PayPal 流程是,

1) 我使用以下代码创建付款:

var paypal = require('paypal-rest-sdk');

function createPayPal(req, res, itemsArray, redirectsTos) {
    var payment = {
        "intent": "sale",
        "payer": {},
        "transactions": [{
            "amount": {
                "currency": sails.config.currency,
                "total": itemsArray.totalArrayAmount,
                "details": {
                    "subtotal": itemsArray.totalArrayAmount,
                    "fee": sails.config.PayPalCreateFee
                }
            },
            "invoice_number": req.session.invNum,
            "item_list": {
                "items": itemsArray.itemsArray
            }
        }]
    };
    sails.log.info('payment obj :', JSON.stringify(payment))
    payment.payer.payment_method = sails.config.PayPalPaymentMethod;
    payment.redirect_urls = {
        "return_url": res.locals.return_url_buy,
        "cancel_url": res.locals.cancel_url_buy
    };

    paypal.payment.create(payment, function(error, payment) {
        if (error) {
            sails.log.error(error);
            redirectsTos(({
                message: 'failure',
                redirect: '/paypal/error'
            }), null);
        } else {
        sails.log.info('Payment ID = ', payment.id);
        sails.log.info('User ID = ', req.session.userSession);
        var redirectUrl;
        for (var i = 0; i < payment.links.length; i++) {
            var link = payment.links[i];
            if (link.method === 'REDIRECT') {
                redirectUrl = link.href;
                sails.log.info('goto:', redirectUrl)
                redirectsTos(null, ({
                    message: 'success',
                    redirect: redirectUrl
                }));
            }
        }
        }
    });
}

Paypal 将订单信息和重定向 urls 返回给我,我将用户重定向到 links 对象中的 href。然后当支付流返回给我的网站时,它会发送给我

{
    paymentId: 'PAY-5FB60654T5508144abcxyzZLQ',
    token: 'EC-26U68825EW2123428',
    PayerID: 'QSABTRW6AHYH6'
}

然后我使用以下代码执行付款。

function executePayPal(req, paymentId, payerId, executedPayPal) {
    sails.log.info('in executedPayPal');
    var details = {
        "payer_id": payerId
    };
    var payment = paypal.payment.execute(paymentId, details, function(error, payment) {
        if (error) {
            sails.log.error('error in payment id in executePayPal function of paypal controller', error);
            var err = JSON.stringify(error);
            var errParsed = JSON.parse(err);
            crashHandlingService.appCrash(errParsed, 101202);
            executedPayPal(({
                message: 'failure',
                redirect: '/paypal/error/'
            }), null);
        } else {
            executedPayPal(({
                message: 'success',
                redirect: '/paypal/success/'
            }), null);
        }
    });
}

现在这段代码主要做的是

  1. 创建付款,
  2. 将用户重定向到贝宝页面 C
  3. 获取付款。

而我真正想要实现的是

  1. 授权支付->
  2. 捕获付款,以便稍后在某些 cronJob 或服务中捕获付款。

    在上面的流程中间将用户重定向到paypal页面,我真的不知道如何授权,重定向然后捕获付款。

所以请在这方面指导我。

注意:我已阅读以下贝宝文档但无法理解。请记住,我需要在 paypal 页面上显示付款详情,并在付款页面上显示优惠券代码及其折扣。

https://developer.paypal.com/docs/integration/direct/capture-payment/#authorize-the-payment https://developer.paypal.com/docs/classic/express-checkout/ht_ec-singleAuthPayment-curl-etc/

提前致谢:)。

【问题讨论】:

标签: node.js sails.js paypal


【解决方案1】:

我终于找到了解决方案,我想我应该在这里发布它,以便对其他人有所帮助。

所以基本上有以下4个步骤,你必须使用PayPal Node SDK

  • 创建付款。
  • 将用户重定向到 PayPal。
  • 执行授权付款。
  • 获取授权付款。

要创建付款,您可以使用 PayPal Node sdk here 的 payment.create 方法。

.Create 方法将返回"href" 中的 url 链接以将用户重定向到 PayPal 页面,从而将用户重定向到 PayPal 页面。

从支付 PayPal 页面返回后,您必须运行 PayPal Node SDK here 的 .execute 方法,使用从 PayPal 接收的 payer_idpaymentId

最后,当您需要获取授权交易的金额时,您必须通过 PayPal 节点 SDK here.authorization.capture 方法,通过提供金额和在执行授权响应中收到的 17 位授权 ID。

下面提供了代码和响应示例,以防链接将来无法使用。

.create Code

var create_payment_json = {
    "intent": "authorize",
    "payer": {
        "payment_method": "paypal"
    },
    "redirect_urls": {
        "return_url": "http://return.url",
        "cancel_url": "http://cancel.url"
    },
    "transactions": [{
        "item_list": {
            "items": [{
                "name": "item",
                "sku": "item",
                "price": "1.00",
                "currency": "USD",
                "quantity": 1
            }]
        },
        "amount": {
            "currency": "USD",
            "total": "1.00"
        },
        "description": "This is the payment description."
    }]
};

paypal.payment.create(create_payment_json, function (error, payment) {
    if (error) {
        console.log(error.response);
        throw error;
    } else {
        for (var index = 0; index < payment.links.length; index++) {
        //Redirect user to this endpoint for redirect url
            if (payment.links[index].rel === 'approval_url') {
                console.log(payment.links[index].href);
            }
        }
        console.log(payment);
    }
});

Response Sample

{
  "id": "PAY-17S8410768582940NKEE66EQ",
  "create_time": "2013-01-31T04:12:02Z",
  "update_time": "2013-01-31T04:12:04Z",
  "state": "approved",
  "intent": "authorize",
  "payer": {
    "payment_method": "credit_card",
    "funding_instruments": [
      {
        "credit_card": {
          "type": "visa",
          "number": "xxxxxxxxxxxx0331",
          "expire_month": "11",
          "expire_year": "2018",
          "first_name": "Betsy",
          "last_name": "Buyer",
          "billing_address": {
            "line1": "111 First Street",
            "city": "Saratoga",
            "state": "CA",
            "postal_code": "95070",
            "country_code": "US"
          }
        }
      }
    ]
  },
  "transactions": [
    {
      "amount": {
        "total": "7.47",
        "currency": "USD",
        "details": {
          "tax": "0.03",
          "shipping": "0.03"
        }
      },
      "description": "This is the payment transaction description.",
      "related_resources": [
        {
          "sale": {
            "id": "4RR959492F879224U",
            "create_time": "2013-01-31T04:12:02Z",
            "update_time": "2013-01-31T04:12:04Z",
            "state": "completed",
            "amount": {
              "total": "7.47",
              "currency": "USD"
            },
            "parent_payment": "PAY-17S8410768582940NKEE66EQ",
            "links": [
              {
                "href": "https://api.sandbox.paypal.com/v1/payments/sale/4RR959492F879224U",
                "rel": "self",
                "method": "GET"
              },
              {
                "href": "https://api.sandbox.paypal.com/v1/payments/sale/4RR959492F879224U/refund",
                "rel": "refund",
                "method": "POST"
              },
              {
                "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-17S8410768582940NKEE66EQ",
                "rel": "parent_payment",
                "method": "GET"
              }
            ]
          }
        }
      ]
    }
  ],
  "links": [
    {
      "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-17S8410768582940NKEE66EQ",
      "rel": "self",
      "method": "GET"
    }
  ]
}

.execute Code

var paymentId = 'PAYMENT id created in previous step';

paypal.payment.execute(paymentId, execute_payment_json, function (error, payment) {
    if (error) {
        console.log(error.response);
        throw error;
    } else {
        console.log("Get Payment Response");
        console.log(JSON.stringify(payment));
    }
});

Response Sample

{
  "id": "PAY-34629814WL663112AKEE3AWQ",
  "create_time": "2013-01-30T23:44:26Z",
  "update_time": "2013-01-30T23:44:28Z",
  "state": "approved",
  "intent": "aurthorize",
  "payer": {
    "payment_method": "paypal",
    "payer_info": {
      "email": "bbuyer@example.com",
      "first_name": "Betsy",
      "last_name": "Buyer",
      "payer_id": "CR87QHB7JTRSC"
    }
  },
  "transactions": [
    {
      "amount": {
        "total": "7.47",
        "currency": "USD",
        "details": {
          "tax": "0.04",
          "shipping": "0.06"
        }
      },
      "description": "This is the payment transaction description.",
      "related_resources": [
        {
          "sale": {
            "id": "1KE4800207592173L",
            "create_time": "2013-01-30T23:44:26Z",
            "update_time": "2013-01-30T23:44:28Z",
            "state": "completed",
            "amount": {
              "currency": "USD",
              "total": "7.47"
            },
            "transaction_fee": {
              "value": "0.50",
              "currency": "USD"
            },
            "parent_payment": "PAY-34629814WL663112AKEE3AWQ",
            "links": [
              {
                "href": "https://api.sandbox.paypal.com/v1/payments/sale/1KE4800207592173L",
                "rel": "self",
                "method": "GET"
              },
              {
                "href": "https://api.sandbox.paypal.com/v1/payments/sale/1KE4800207592173L/refund",
                "rel": "refund",
                "method": "POST"
              },
              {
                "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-34629814WL663112AKEE3AWQ",
                "rel": "parent_payment",
                "method": "GET"
              }
            ]
          }
        }
      ]
    }
  ],
  "links": [
    {
      "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-34629814WL663112AKEE3AWQ",
      "rel": "self",
      "method": "GET"
    }
  ]
}

.authorization.capture Code

var capture_details = {
    "amount": {
        "currency": "USD",
        "total": "4.54"
    },
    "is_final_capture": true
};

paypal.authorization.capture("5RA45624N3531924N", capture_details, function (error, capture) {
    if (error) {
        console.error(error);
    } else {
        console.log(capture);
    }
});

Response Sample

{
  "id": "6BA17599X0950293U",
  "create_time": "2013-05-06T22:32:24Z",
  "update_time": "2013-05-06T22:32:25Z",
  "amount": {
    "total": "4.54",
    "currency": "USD"
  },
  "is_final_capture": true,
  "state": "completed",
  "parent_payment": "PAY-44664305570317015KGEC5DI",
  "links": [
    {
      "href": "https://api.sandbox.paypal.com/v1/payments/capture/6BA17599X0950293U",
      "rel": "self",
      "method": "GET"
    },
    {
      "href": "https://api.sandbox.paypal.com/v1/payments/capture/6BA17599X0950293U/refund",
      "rel": "refund",
      "method": "POST"
    },
    {
      "href": "https://api.sandbox.paypal.com/v1/payments/authorization/5RA45624N3531924N",
      "rel": "authorization",
      "method": "GET"
    },
    {
      "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-44664305570317015KGEC5DI",
      "rel": "parent_payment",
      "method": "GET"
    }
  ]
}

您可以从REST API ReferencePayPal-node-SDK 获得更多信息。

如果响应示例因我从 PayPal 网络复制而略有变化,请原谅我。

谢谢。

【讨论】:

    猜你喜欢
    • 2021-01-20
    • 2023-03-08
    • 2023-03-25
    • 1970-01-01
    • 2018-08-25
    • 2018-08-05
    • 2018-06-05
    • 2015-07-15
    • 2017-08-18
    相关资源
    最近更新 更多