Come stabilire la connettività con le API Payments in Node.js

1. Prima di iniziare

Questo è un codelab autoguidato che illustrerà come stabilire la connettività con le API Stanadard Payments.

Prerequisiti

  • Hai completato i passaggi 1 e 2 della procedura di implementazione.
  • Puoi ospitare il server Node.js fornito con terminazione TLS utilizzando Google App Engine o la tua soluzione nel dominio configurato con Google.
  • Node.js è installato nel tuo ambiente.

Obiettivi didattici

  • Come verificare la connettività inviando una richiesta valida all'API echo dei pagamenti standard di Google.
  • Come ricevere, decriptare e analizzare una richiesta di Google all'API Partner Hosted Echo.

2. Configurazione e requisiti

Scarica l'applicazione

Scarica il codice di esempio Node.js.

Installa dipendenze

Passa alla directory del progetto ed esegui il comando seguente per installare le dipendenze richieste. Se utilizzi App Engine, puoi saltare questo passaggio.

npm install

3. Configurare l'ID account di integrazione dei pagamenti (PIAID)

L'ID account integratore pagamenti (PIAID) è un identificatore utilizzato per identificare in modo univoco le integrazioni. Prima di iniziare questo tutorial, dovresti aver ricevuto il PIAID da Google completando i prerequisiti.

  1. Vai al file server.js nella directory del progetto.
  2. Imposta la variabile PIAID sul PIAID che ti è stato inviato da Google.
const PIAID = '{PAYMENT_INTEGRATOR_ACCOUNT_ID}';

4. Aggiungi chiavi PGP

Crea i seguenti file nella struttura del progetto e aggiungi le tue chiavi PGP per attivare la crittografia PGP.

  • Crea un file denominato public.key e aggiungi al file la chiave pubblica armoured ASCII.
  • Crea un file denominato private.key e aggiungi la chiave privata armour ASCII al file.
  • Crea un file denominato passphrase.txt e aggiungi la passphrase segreta al file.

Aggiunta di chiavi PGP

Ottimo, è tutto pronto per eseguire l'applicazione.

5. Esegui l'applicazione

Per avviare l'applicazione, esegui questo comando.

$ node server.js
Server listening on port 8080...

Se invece stai eseguendo un'istanza di App Engine preconfigurata, esegui questo comando.

$ gcloud app deploy

Per impostazione predefinita, il server rimane in ascolto sulla porta 8080.

6. Testare la connettività dell'API Google Standard Payments

Ora che l'applicazione è in esecuzione, è il momento di testare la connettività con l'API Google Standard Payments echo.

Esegui questo comando per avviare una chiamata dalla tua istanza dell'applicazione di esempio ai server di Google. L'API echo dell'applicazione di esempio accetta una richiesta POST in testo non crittografato. Dopo aver ricevuto la richiesta, viene inviata una richiesta successiva all'API ospitata da Google.

  $ curl -X POST -H 'Content-Type: text/plain' -d 'Hello from Little Bear' https://{HOSTNAME}/echo

Una richiesta API riuscita genererà la seguente risposta da parte di Google.

{
   "responseHeader":{
      "responseTimestamp":"1606710026723"
   },
   "clientMessage":"Hello from Little Bear",
   "serverMessage":"Server message."
}

Dettagli

Ora che una richiesta è stata inviata dal tuo server, vediamo come ha funzionato.

Crea la richiesta

buildEchoRequestBody in bodyHelpers.js crea la richiesta echo inviata all'API di Google.

const message = bodyHelpers.buildEchoRequestBody(req.body);

La richiesta generata include clientMessage e diversi campi di valori predefiniti.

{
   "requestHeader":{
      "protocolVersion":{
         "major":1,
         "minor":0,
         "revision":0
      },
      "requestId":"ddfe0fd0-ffdc-4fcf-991a-f0611ec83970",
      "requestTimestamp":"1606715389040"
   },
   "clientMessage":"Hello from Little Bear"
}

Cripta la richiesta

Tutte le richieste sono criptate e con codifica Base64url. In questo esempio, crypto.js contiene metodi helper che eseguono la crittografia e la decriptazione per tuo conto. Il metodo crypto.encrypt esegue la crittografia utilizzando la chiave pubblica di Google.

const encrypted = await crypto.encrypt(message);

Invia la richiesta POST con codifica base64url

Il messaggio criptato è codificato in base64url con il pacchetto base64url e inviato tramite una richiesta POST utilizzando axios.

const response = await axios.post(ECHO_URL, base64url(encrypted), AXIOS_CONFIG);

Decripta e restituisce la risposta

La risposta positiva di Google è codificata e criptata in base64url, quindi deve essere decodificata e decriptata anche per poter essere restituita come testo non crittografato.

const encryptedMessage = base64url.toBuffer(response.data);
const decryptedResponse = await crypto.decrypt(encryptedMessage);
res.status(200);
res.send(decryptedResponse);

7. Testa la connettività dell'API Partner

Per testare la connettività dell'API echo del partner, Google invia una richiesta all'API Partner Hosted echo.

Quando è tutto pronto, collabora con il tuo punto di contatto Google per attivare questa richiesta da parte di Google.

Il test eco è completo quando sei in grado di leggere la richiesta di eco in entrata di Google e rispondere con una risposta eco valida.

Dettagli

Ora che il tuo server ha ricevuto e gestito correttamente una richiesta, vediamo come ha funzionato.

Base64url decodifica la richiesta

Quando ricevi la richiesta, devi prima decodificarla in base64url.

const encryptedRequest = base64url.toBuffer(req.body);

Decripta la richiesta

Una volta che base64url ha decodificato la richiesta, devi decriptarla.

const decryptedRequest = await crypto.decrypt(encryptedRequest);

Ricevi la richiesta

Una volta decodificato e decriptato, Google ha inviato un payload del messaggio simile al seguente.

{
  "requestHeader": {
    "protocolVersion": {
      "major": 1
    },
    "requestId": "G1MQ0YERJ0Q7LPM",
    "requestTimestamp": {
      "epochMillis":1481899949606
    },
    "paymentIntegratorAccountId": "abcdef123456"
  },
  "clientMessage": "echo Me"
}

Crea la risposta

Dopo aver letto correttamente la richiesta di eco in entrata, puoi creare la risposta.

clientMessage = JSON.parse(decryptedRequest).clientMessage;
responseBody = bodyHelpers.buildEchoResponseBody(clientMessage);

La risposta include il messaggio di Google, un timestamp e un messaggio del server.

{
  "responseHeader": {
    "responseTimestamp": {
      "epochMillis":1481899950236
    }
  },
  "clientMessage": "echo Me",
  "serverMessage": "Debug ID 12345"
}

Cripta e codifica la risposta in Base64

Una volta creato il messaggio di risposta, sei pronto per criptarlo e codificarlo in base64url.

encryptedResponse = await crypto.encrypt(responseBody);
const encodedResponse = base64url(encryptedResponse);

Restituire la risposta

Infine, potrai inviare la risposta POST.

res.send(encodedResponse);

8. Complimenti!

In questo codelab, hai stabilito con successo la connettività con l'API Echo.