PayPal Esempio di server Node Express


Esempio

In questo esempio, configureremo un'integrazione del server Express per visualizzare come elaborare un pagamento con PayPal, utilizzando l'SDK del nodo PayPal. Utilizzeremo una struttura JSON statica per i dettagli di pagamento per brevità.

Ci sono tre passaggi generali che seguiremo quando costruiremo le funzioni per gestire il pagamento PayPal:

  1. Creiamo un oggetto JSON contenente il pagamento che intendiamo elaborare tramite PayPal. Lo inviamo quindi a PayPal per ottenere un link per reindirizzare l'utente al fine di confermare il pagamento.
  2. Successivamente, reindirizziamo l'utente a PayPal per confermare il pagamento. Una volta confermato, PayPal reindirizza l'utente alla nostra applicazione.
  3. Una volta tornati all'app, completiamo il pagamento per conto dell'utente.

Interrompendo il tutto come una semplice app Node, iniziamo ottenendo l'SDK del Nodo PayPal da NPM:

npm install paypal-rest-sdk

Successivamente, impostiamo la configurazione dell'app e i pacchetti.

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
});

Richiediamo quattro requisiti per questa app:

  1. Il pacchetto HTTP per il nostro server.
  2. Il pacchetto SDK del nodo PayPal.
  3. Il pacchetto bodyParser per lavorare con i corpi codificati JSON.
  4. Il framework Express per il nostro server.

Le righe successive impostano le variabili per l'ID client e il segreto che sono stati ottenuti durante la creazione di un'applicazione . Quindi impostiamo bodyParser per consentire i corpi codificati JSON, quindi configura la nostra applicazione utilizzando i dettagli dell'applicazione e specifica l'ambiente in cui stiamo lavorando (live per la produzione o sandbox per i test).

Ora creiamo il percorso per la creazione di una richiesta di pagamento con 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');
            }
        }
    });
});

La prima cosa che facciamo è impostare l'oggetto JSON della richiesta di pagamento, che contiene le informazioni che dobbiamo fornire a PayPal per creare il pagamento. Definiamo l' intent di sale , specificare gli URL di reindirizzamento (dove PayPal deve inoltrare l'utente a dopo aver confermato / annullato il pagamento), aggiungere un payment_method di pagamento di paypal per segnalare che effettueremo un pagamento PayPal, quindi specificare le informazioni di transazione per il pagatore per confermare.

Chiamiamo quindi payment.create(...) , passando nel nostro oggetto payReq . Questo invierà la richiesta di pagamento di creazione a PayPal. Una volta che ritorna, e ha successo, possiamo scorrere i collegamenti HATEOAS forniti nell'oggetto return per estrarre l'URL a cui dobbiamo reindirizzare l'utente, che è etichettato sotto approval_url .

Il formato per i link HATEOAS può causare un codice di riferimento fragile se utilizzato direttamente, quindi eseguiamo un ciclo di tutti i collegamenti forniti e li inseriamo in un oggetto di riferimento migliore per la prova futura contro le modifiche. Se in questo oggetto viene quindi trovato approval_url , reindirizziamo l'utente.

A questo punto l'utente viene reindirizzato su PayPal per confermare il pagamento. Una volta che lo fanno, vengono reindirizzati al return_url che abbiamo specificato nella funzione createPayment(...) .

Ora dobbiamo fornire un percorso per gestire tale reso, al fine di completare il pagamento.

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');
            }
        }
    });
});

Quando l'utente viene restituito alla tua app, ci saranno tre parametri della stringa di query che verranno inviati insieme, il paymentId , il PayerID e il token . Dobbiamo solo occuparci dei primi due.

Estraiamo i parametri e posizioniamo il PayerID in un oggetto semplice per la necessità del passaggio di esecuzione del pagamento. Successivamente, viene effettuata una chiamata a payment.execute(...) , passando questi due parametri, per completare il pagamento.

Una volta effettuata la richiesta, vediamo se il pagamento è stato completato correttamente controllando se payment.state è impostato su approved . In tal caso, possiamo memorizzare ciò di cui abbiamo bisogno dall'oggetto di pagamento che viene restituito.

Il nostro ultimo passo è inizializzare il nostro server e ascoltare il traffico che arriva ai percorsi che abbiamo specificato.

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

Una volta che il server è stato inizializzato, andare a http://localhost:3000/create inizializza la procedura di pagamento.