Node Express 伺服器示例

在此示例中,我們將使用 PayPal Node SDK 設定 Express 伺服器整合以顯示如何使用 PayPal 處理付款。為簡潔起見,我們將使用靜態 JSON 結構作為付款細節。

在構建處理 PayPal 付款的功能時,我們將遵循三個一般步驟:

  1. 我們建立一個 JSON 物件,其中包含我們打算通過 PayPal 處理的付款。然後,我們將其傳送到 PayPal 以獲取用於重定向使用者的連結以確認付款。
  2. 接下來,我們將使用者重定向到 PayPal 以確認付款。確認後,PayPal 會將使用者重定向回我們的應用程式。
  3. 退回應用後,我們代表使用者完成付款。

打破這個簡單的 Node 應用程式,我們首先從 NPM 獲取 PayPal Node SDK:

npm install paypal-rest-sdk

接下來,我們設定應用程式配置和包。

var http = require('http'),
    paypal = require('paypal-rest-sdk'),
    bodyParser = require('body-parser'),
    app = require('express')();

var client_id = 'YOUR APPLICATION CLIENT ID';
var secret = 'YOUR APPLICATION SECRET';

//allow parsing of JSON bodies
app.use(bodyParser.json());

//configure for sandbox environment
paypal.configure({
    'mode': 'sandbox', //sandbox or live
    'client_id': client_id,
    'client_secret': secret
});

我們要求此應用有四個要求:

  1. 我們伺服器的 HTTP 包。
  2. PayPal 節點 SDK 包。
  3. bodyParser 包用於處理 JSON 編碼的主體。
  4. 我們伺服器的 Express 框架。

接下來的幾行為建立應用程式時獲取的客戶機 ID 和機密設定變數。然後我們設定 bodyParser 以允許 JSON 編碼的主體,然後使用應用程式詳細資訊配置我們的應用程式,並指定我們正在使用的環境(用於生產或沙箱進行測試)。

現在讓我們建立使用 PayPal 建立付款請求的路線。

app.get('/create', function(req, res){
    //build PayPal payment request
    var payReq = JSON.stringify({
        'intent':'sale',
        'redirect_urls':{
            'return_url':'http://localhost:3000/process',
            'cancel_url':'http://localhost:3000/cancel'
        },
        'payer':{
            'payment_method':'paypal'
        },
        'transactions':[{
            'amount':{
                'total':'7.47',
                'currency':'USD'
            },
            'description':'This is the payment transaction description.'
        }]
    });

    paypal.payment.create(payReq, function(error, payment){
        if(error){
            console.error(error);
        } else {
            //capture HATEOAS links
            var links = {};
            payment.links.forEach(function(linkObj){
                links[linkObj.rel] = {
                    'href': linkObj.href,
                    'method': linkObj.method
                };
            })
        
            //if redirect url present, redirect user
            if (links.hasOwnProperty('approval_url')){
                res.redirect(links['approval_url'].href);
            } else {
                console.error('no redirect URI present');
            }
        }
    });
});

我們要做的第一件事就是設定付款請求 JSON 物件,其中包含我們提供 PayPal 以建立付款所需的資訊。我們將 intent 設定為 sale,指定重定向 URL(PayPal 應在確認/取消付款後轉發使用者),新增 payment_method paypal 以表明我們將進行 PayPal 付款,然後指定交易資訊付款人確認。

然後我們呼叫 payment.create(...),傳入我們的 payReq 物件。這會將建立付款請求傳送給 PayPal。一旦返回併成功,我們就可以遍歷返回物件中提供的 HATEOAS 連結,以提取我們需要將使用者重定向到的 URL,該 URL 在 approval_url 下標記。

如果直接使用,HATEOAS 連結的格式可能會導致脆弱的引用程式碼,因此我們遍歷所有提供的連結並將它們放在一個更好的引用物件中,以便將來證明更改。如果然後在該物件中找到 approval_url,我們將重定向使用者。

此時,使用者被重定向到 PayPal 以確認付款。一旦他們這樣做,他們將被重定向回我們在 createPayment(...) 函式中指定的 return_url

我們現在必須提供處理該退貨的路線,以便完成付款。

app.get('/process', function(req, res){
    var paymentId = req.query.paymentId;
    var payerId = { 'payer_id': req.query.PayerID };

    paypal.payment.execute(paymentId, payerId, function(error, payment){
        if(error){
            console.error(error);
        } else {
            if (payment.state == 'approved'){ 
                res.send('payment completed successfully');
            } else {
                res.send('payment not successful');
            }
        }
    });
});

當使用者返回到你的應用程式時,將會傳送三個查詢字串引數,即 paymentIdPayerIDtoken。我們只需要處理前兩個問題。

我們提取引數,並將 PayerID 放在一個簡單的物件中,以滿足付款執行步驟的需要。接下來,撥打 payment.execute(...),傳遞這兩個引數,以完成付款。

一旦提出請求,我們通過檢查 payment.state 是否設定為 approved 來檢視付款是否成功完成。如果是這樣,我們可以從返回的付款物件中儲存我們需要的內容。

我們的最後一步是初始化我們的伺服器並監聽進入我們指定路由的流量。

//create server
http.createServer(app).listen(3000, function () {
   console.log('Server started: Listening on port 3000');
});

初始化伺服器後,轉到 http://localhost:3000/create 會初始化付款流程。