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.