Integrazione login con PayPal

L'autenticazione con PayPal consente a un utente di accedere a un sito Web o una app utilizzando le proprie credenziali PayPal.

Pubblicato da ,
Ultima modifica

In questo articolo vedremo come autenticare un utente tramite il login con PayPal, useremo la modalità sandbox per creare il flusso di lavoro, in particolare faremo riferimento alla seguente documetazione ufficiale

developer.paypal.com/docs/connect-with-paypal

1. Creare un'applicazione API REST PayPal, per ottenere Client ID e Secret ID.

Se si possiede già un account PayPal andare nella sezione My apps & credentials della Dashboard per sviluppatori e creare una nuova app in modalità sandbox

developer.paypal.com/developer/applications

scegliamo un nome per l'app e specifichiamo un url di ritorno

 

 

nel mio caso è http://localhost/response.php, creeremo dopo questo file quando svilupperemo la nostra applicazione, selezionare la voce "Connect with PayPal (formerly Log In with PayPal) Identity service that enables your customers to connect with their PayPal login", aprire le Opzioni Avanzate (Advanced options)

 

 

e selezionare quali dati condividere, selezioniamo Full name, Email e Street address

 

 

infine inseriamo l'URL dell'informativa sulla privacy e l'URL contratto utente, siccome stiamo lavorando in un ambiente di test possiamo scrivere https://example.com, e selezioniamo la casella in Autorizzazioni PayPal aggiuntive (Enable customers who have not yet confirmed their email with PayPal to log in to your app.)

 

 

prendiamo nota del Client Id e del Secret ID che ci serviranno per la nostra applicazione, e salviamo.

2. Scaricare PayPal-PHP-SDK per creare il flusso di lavoro.

Per scaricare SDK PHP di PayPal ci sono due opzioni, o scaricare il file .zip dal repository

github.com/paypal/PayPal-PHP-SDK

oppure da CLI clonare il repository in una cartella specifica con il seguente comando

git clone https://github.com/paypal/PayPal-PHP-SDK.git .

useremo questa seconda opzione, se il processo è andato a buon fine da CLI lanciamo il comando

composer update

per generare il file di autoload.

Per le richieste HTTP useremo HTTPFUL una libreria PHP, scarichiamo il file httpful.phar e salviamolo nella nostra cartella di lavoro.

A questo punto abbiamo tutto il necessario per poter incominciare a sviluppare la nostra applicazione.

Nella stessa cartella in cui abbiamo scaricato PayPal-PHP-SDK creiamo i file bootstrap.php e response.php, in particolare per l'autenticazione sul sito PayPal bisogna usare un apposito url

<a href="https://www.sandbox.paypal.com/connect/?flowEntry=static&client_id=<client-id>&response_type=code&scope=openid profile email address&redirect_uri=http://localhost/response.php&state=123456">login on PayPal</a>

inseriamo il Client ID come valore alla query client_id  presente nell'url e in redirect:_url scriviamo l'indirizzo di ritorno che abbiamo impostato nell'app, siccome siamo in un ambiente di test dobbiamo usare un account sandbox per autenticarci su PayPal, per crearne uno andare nella Dashboard per sviluppatori al seguente link

developer.paypal.com/developer/accountStatus

bootstrap.php

<?php
$composerAutoload = __DIR__ . '/vendor/autoload.php';
include (__DIR__ . '/httpful.phar');
if (!file_exists($composerAutoload))
{
    $composerAutoload = __DIR__ . '/vendor/autoload.php';

    if (!file_exists($composerAutoload))
    {
        echo "The 'vendor' folder is missing. You must run 'composer update' to resolve application dependencies.\nPlease see the README for more information.\n";
        exit(1);
    }
}
require $composerAutoload;

use PayPal\Auth\OAuthTokenCredential;
use PayPal\Rest\ApiContext;

date_default_timezone_set(@date_default_timezone_get());

error_reporting(E_ALL);
ini_set('display_errors', '1');

$clientId = '< Client ID >';
$clientSecret = '< Secret ID >';

if (isset($_GET['code']))
{
    $requestData = '?grant_type=authorization_code&code=' . $_GET['code'] . '&return_url=http://localhost/responce.php';
}

/**
 * All default curl options are stored in the array inside the PayPalHttpConfig class. To make changes to those settings
 * for your specific environments, feel free to add them using the code shown below
 * Uncomment below line to override any default curl options.
 */

/** @var \Paypal\Rest\ApiContext $apiContext */
$apiContext = getApiContext($clientId, $clientSecret);

return $apiContext;
/**
 * Helper method for getting an APIContext for all calls
 * @param string $clientId Client ID
 * @param string $clientSecret Client Secret
 * @return PayPal\Rest\ApiContext
 */
function getApiContext($clientId, $clientSecret)
{

    $apiContext = new ApiContext(new OAuthTokenCredential($clientId, $clientSecret));

    $apiContext->setConfig(array(
        'mode' => 'sandbox',
        'log.LogEnabled' => true,
        'log.FileName' => '../PayPal.log',
        'log.LogLevel' => 'DEBUG',
        'cache.enabled' => true,

    ));

    return $apiContext;
}

valorizziamo le variabili $clientId e $clientSecret rispettivamente con Client ID e Secret ID dell'app PayPal creata in precedenza

response.php

<?php
require __DIR__ . '/bootstrap.php';

use PayPal\Api\OpenIdTokeninfo;
use PayPal\Api\OpenIdUserinfo;

$response = \Httpful\Request::get('https://api-m.sandbox.paypal.com/v1/identity/openidconnect/tokenservice' . $requestData)->authenticateWith($clientId, $clientSecret)->send();

$jsonResponse = json_decode($response->raw_body);
$refreshToken = $jsonResponse->refresh_token;

$tokenInfo = new OpenIdTokeninfo();
$tokenInfo = $tokenInfo->createFromRefreshToken(array(
    'refresh_token' => $refreshToken
) , $apiContext);

$params = array(
    'access_token' => $tokenInfo->getAccessToken()
);
$userInfo = OpenIdUserinfo::getUserinfo($params, $apiContext);

var_dump($userInfo);

/*
object(PayPal\Api\OpenIdUserinfo)[17]
  private '_propMap' (PayPal\Common\PayPalModel) => 
    array (size=7)
      'user_id' => string 'https://www.paypal.com/......' (length=xx)
      'sub' => string 'https://www.paypal.com/.....' (length=xx)
      'name' => string '<here name>' (length=xx)
      'email' => string '<here email>' (length=xx)
      'verified' => string 'true' (length=4)
      'address' => 
        object(PayPal\Api\OpenIdAddress)[xx]
          private '_propMap' (PayPal\Common\PayPalModel) => 
            array (size=1)
              ...
      'email_verified' => string 'true' (length=4)
*/

l'oggetto $userInfo conterrà le informazioni dell'utente che si è autenticato, tra cui l'indirizzo email e il nome.