SDK PHP
Ciblez l'URL de base de l'API la plus à jour
Nous vous encourageons à toujours cibler l'URL de base de l'API la plus à jour lors de l'envoi de requêtes à notre plateforme. Consultez notre guide dédié pour un aperçu complet.
Pour vous permettre une transition en douceur, les anciennes URL de base de l'API restent disponibles jusqu'à nouvel ordre.
Pour créer des paiements, vous devez connecter votre serveur à notre plateforme via l'une de nos modes d'intégration.
Notre SDK PHP est la solution idéale pour vous connecter à notre plateforme si vous souhaitez le faire en utilisant le langage PHP.
En choisissant le SDK PHP, vous pouvez :
- Accéder à toutes les fonctionnalités de notre API
- Utiliser toutes les modes d'intégration de notre plateforme (Hosted Checkout Page / Hosted Tokenization Page / Server-to-server).
- Effectuer tous les appels liés à la création et au traitement des paiements (c'est-à-dire CreateHostedCheckout, CreatePayment, RefundPayment et bien d'autres).
Pour tirer pleinement parti de ce SDK, assurez-vous de répondre aux exigences suivantes :
- PHP 7.4 ou supérieur
- Recommandé : Installation de l'outil Composer
Vous pouvez télécharger et installer la dernière version du SDK PHP en :
- Utilisant le système Git et notre repo Github
- Installant le code fourni par Composer
- Installant notre bibliothèque manuellement sur votre système
Retrouvez plus de détails sur GitHub. Consultez également les Spécification de notre API. Une fois que tout est prêt, consultez les liens ci-dessous pour utiliser au mieux le SDK.
Cette page vous a fournit un aperçu général des fonctionnalités du SDK. Pour connaître en détail le fonctionnement des différentes modes d'intégrationn, consultez les guides dédiés expliquant chaque étape avec des exemples de code complets :
Initialisation
Pour connecter votre système à notre plateforme en utilisant le SDK, vous devez d'abord passer par une étape d'initialisation.
- Créez un PSPID de test / de production
- Créez une API Key et une API Secret pour le PSPID créé ci-dessus
- Utilisez la API Key et le API Secret pour établir la connexion à notre plateforme
Après cette initialisation, vous pouvez commencer à passer des transactions via votre PSPID. Découvrez comment cela fonctionne dans ce chapitre dédié.
Consultez l'exemple de code couvrant les étapes mentionnées ci-dessus :
Assurez-vous de bien utiliser les classes suivantes :
- CommunicatorConfiguration
- V1HmacAuthenticator
- Communicator
- Client
- ProxyConfiguration
// Your PSPID in either our test or live environment
$merchantId = "PSPID";
// Put the value of the API Key which you can find in the Merchant Portal
$apiKey = 'API KEY';
// Put the value of the API Secret which you can find in the Merchant Portal
$apiSecret = 'API Secret';
// This endpoint is pointing to the TEST server
// Note: Use the endpoint without the /v2/ part here
$apiEndpoint = 'https://payment.preprod.direct.worldline-solutions.com/';
// Additional settings to easily identify your company in our logs.
$integrator = 'YOUR COMPANY NAME';
$proxyConfiguration = null;
/*
* To use proxy, you should uncomment the section below
* and replace proper settings with your settings of the proxy.
* (additionally, you can comment on the previous setting).
*/
/*
$proxyConfiguration = new ProxyConfiguration(
'proxyHost',
'proxyPort',
'proxyUserName',
'proxyPassword'
);
*/
$communicatorConfiguration = new CommunicatorConfiguration(
$apiKey,
$apiSecret,
$apiEndpoint,
$integrator,
$proxyConfiguration
);
$authenticator = new V1HmacAuthenticator($communicatorConfiguration);
$communicator = new Communicator($communicatorConfiguration, $authenticator);
$client = new Client($communicator);
$merchantClient = $client->merchant($merchantId);
Le tableau suivant fournit un aperçu des variables utilisées :
| Variables |
|---|
|
Vous pouvez réutiliser les mêmes instances MerchantClient et Client pour différents appels :
- L'instance MerchantClient peut servir pour tous les appels du même PSPID
$merchantClient = $client->merchant($merchantId); - L'instance Client peut servir pour créer des instances MerchantClient pour différents ou le même PSPID
Après avoir initialisé le SDK, vous pouvez envoyer des requêtes à notre plateforme via votre PSPID. Apprenez comment faire cela dans le chapitre suivant.
Comme nos SDK intègrent toujours la dernière version de notre API, vous pouvez omettre le paramètre "v2" dans votre code, comme montré dans l'exemple ci-dessus.
N'oubliez pas de prêter attention à la correspondance entre l'environnement et les clés. La API Key et le API Secret sont différents pour les environnements de test et de production.
Le chemin complet des endpoints API est
- environnement de test: https://payment.preprod.direct.worldline-solutions.com/v2/
- environnement de production: https://payment.direct.worldline-solutions.com/v2/
Si vous êtes prêt à passer à l'environnement de production, remplacez le lien du endpoint apiEndpoint = 'https://payment.preprod.direct.worldline-solutions.com/' par le lien de l'environnement de production apiEndpoint = 'https://payment.direct.worldline-solutions.com/'
Pour les transactions sans impact financier, utilisez le endpoint de test. Les transactions seront envoyées à notre environnement de test, et donc à votre compte de test.
Pour les transactions avec impact financier, utilisez le endpoint de production. Les transactions seront envoyées à notre environnement de production, et donc à votre compte de production.
Utiliser le SDK
Après cette étape d'initialisation, grâce à la création réussie de l'instance Client, vous avez un accès complet à notre API :
- Vous pouvez envoyer des demandes de création de transactions via l'une de nos modes d'intégration
- Vous pouvez obtenir le statut actuel de vos transactions
- Vous pouvez effectuer des opérations de maintenance (c'est-à-dire des captures, des remboursements, etc) sur vos transactions existantes
Assurez-vous que la méthode de paiement que vous souhaitez utiliser est activée dans votre compte de test/production. Vérifiez cela dans le Merchant Portal via Entreprise > Moyens de paiement.
Vous utilisez le Back Office ?
Vous pouvez vérifier le statut d'activation de la méthode de paiement via Configuration > Activation PM.
Consultez nos cas de test sur GitHub, incluant des exemples de code complets, et notre API Reference pour découvrir tout ce qui est possible de faire. Voici la liste des actions les plus courantes :
- Créer de nouvelles transactions
- Obtenir le statut d'une transaction
- Effectuer une opération de maintenance
Créer de nouvelles transactions
Pour créer une nouvelle transaction, vous pouvez utiliser soit l'instance Client, soit l'instance MerchantClient avec l'une de nos modes d'intégration. Cela peut se faire par :
- Acheminer la requête de votre PSPID vers notre plateforme (pour Client)
- Créer une requête pour la mode d'intégration respective
L'instance du SDK ne garde trace que des données utilisées pour l'initialiser. Elle ne suit ni les sessions actives ni les demandes précédentes. Votre système est responsable de la gestion des sessions et des paiements de Direct.
Les sessions et les paiements n'impactent pas les autres sessions et paiements.
Vous trouverez ci-dessous des exemples de code pour chachune des modes d'intégration:
Hosted Checkout Page
Pour utiliser cette méthode d'intégration, vous devez faire un appel à CreateHostedCheckoutRequest. Cet appel doit contenir au moins un objet Order.
Assurez-vous d'utiliser les classes suivantes :
- CreateHostedCheckoutRequests
- Order
- AmountOfMoney
/*
*…. Initialisation....
*/
/*
* L'objet HostedCheckoutClient est basé sur l'objet MerchantClient
* créé lors de l'initialisation
*/
$hostedCheckoutClient = $merchantClient->hostedCheckout();
$createHostedCheckoutRequest = new CreateHostedCheckoutRequest();
$order = new Order();
// Example object of the AmountOfMoney
$amountOfMoney = new AmountOfMoney();
$amountOfMoney->setCurrencyCode("EUR");
$amountOfMoney->setAmount(100);
$order->setAmountOfMoney($amountOfMoney);
$createHostedCheckoutRequest->setOrder($order);
// Obtenez la réponse pour le HostedCheckoutClient
$createHostedCheckoutResponse = $hostedCheckoutClient->createHostedCheckout($createHostedCheckoutRequest);
Vous pouvez spécifier une returnUrl optionnelle, qui sera utilisée pour rediriger votre client vers votre site web.
Cet appel retourne un objet CreateHostedCheckoutResponse. Stockez le hostedCheckoutId et le RETURNMAC qu'il contient, ainsi que toute autre information pertinente pour vous. Vous aurez besoin de ces éléments pour les étapes décrites dans les chapitres suivants.
Cette réponse contient également un partialRedirectUrl. Vous devez concaténer l'URL de base "https://payment." avec partialRedirectUrl selon la formule suivante :
https://payment. + partialRedirectUrl
et réaliser une redirection de votre client vers cette URL. Une fois que le client visite la Hosted Checkout Page, le processus de paiement se poursuit là-bas.
La dernière version de notre SDK retourne également le chemin complet dans redirectUrl, vous permettant de ne pas avoir à concaténer l'URL de base "https://payment." avec partialRedirectUrl. Pour en savoir plus, visitez le lien Hosted Checkout Page.
Hosted Tokenization Page
Pour utiliser cette méthode d'intégration, vous devez :
- Créer et télécharger un modèle tel que décrit dans notre guide Hosted Tokenization Page.
Assurez-vous d'utiliser les classes suivantes :
- CreateHostedTokenizationRequest
/*
*…. Initialisation....
*/
/*
* L'objet HostedTokenizationClient est basé sur l'objet
* MerchantClient créé lors de l'initialisation
*/
$hostedTokenizationClient = $merchantClient->hostedTokenization();
$createHostedTokenizationRequest = new CreateHostedTokenizationRequest();
$createHostedTokenizationRequest->setVariant("my-custom-template.html");
// Obtenez la réponse pour le HostedTokenizationClient
$createHostedTokenizationResponse = $hostedTokenizationClient->createHostedTokenization($createHostedTokenizationRequest);
A partir de l'objet $createHostedTokenizationResponse, récupérez les données $hostedTokenizationId et hostedTokenizationUrl. Utilisez le $hostedTokenizationUrl pour l'iframe et le $hostedTokenizationId ou $tokenId (voir infobox) pour créer le paiement réel via la méthode Server-to-server.
Vous pouvez utiliser soit le tokenID, soit le hostedTokenizationId dans l'appel CreatePayment. Pour en savoir plus sur l'utilisation de chaque option, vous pouvez lire les chapitres dédiés de notre guide Hosted Tokenization Page :
$hostedTokenizationId = $createHostedTokenizationResponse->getHostedTokenizationId();
$hostedTokenizationUrl = $createHostedTokenizationResponse->getHostedTokenizationUrl();
$createPaymentRequest = new CreatePaymentRequest();
$createPaymentRequest->setHostedTokenizationId($hostedTokenizationId);
$order = new Order();
$amountOfMoney = new AmountOfMoney();
$amountOfMoney->setCurrencyCode("EUR");
$amountOfMoney->setAmount(100);
$order->setAmountOfMoney($amountOfMoney);
$createPaymentRequest->setOrder($order);
// Obtenez la réponse pour le PaymentsClient
$createPaymentResponse = $merchantClient->payments()->createPayment($createPaymentRequest);
Server-to-server
Une CreatePaymentRequest minimale nécessite que vous définissiez au moins un objet Order et un moyen de paiement :
Assurez-vous d'utiliser les classes suivantes :
- CreatePaymentRequest
- AmountOfMoney
- Card
- CardPaymentMethodSpecificInput
- Order
/*
*…. Initialisation....
*/
$merchantClient = $client->merchant($merchantId);
/*
* L'objet PaymentsClient est basé sur le MerchantClient
* créé lors de l'initialisation
*/
$paymentsClient = $merchantClient->payments();
$createPaymentRequest = new CreatePaymentRequest();
$order = new Order();
// Exemple de l'objet AmountOfMoney
$amountOfMoney = new AmountOfMoney();
$amountOfMoney->setCurrencyCode("EUR");
$amountOfMoney->setAmount(100);
$order->setAmountOfMoney($amountOfMoney);
$createPaymentRequest->setOrder($order);
$cardPaymentMethodSpecificInput = new CardPaymentMethodSpecificInput();
// Exemple de l'objet Card
$card = new Card();
$card->setCvv("123");
$card->setCardNumber("4111111111111111"); // Trouvez plus de données de test ici
$card->setExpiryDate("1236");
$card->setCardholderName("Wile E. Coyote");
$cardPaymentMethodSpecificInput->setCard($card);
$createPaymentRequest->setCardPaymentMethodSpecificInput($cardPaymentMethodSpecificInput);
// Obtenez la réponse pour le PaymentsClient
$createPaymentResponse = $paymentsClient->createPayment($createPaymentRequest);
Nous avons des guides dédiés pour chacune des modes d'intégration:
Ces documents contiennent tous les détails cruciaux dont vous avez besoin pour tirer profit des modes d'intégration, incluant les flux de transactions complets, des exemples de code et d'autres fonctionnalités utiles.
Obtenir le statut de la transaction
Notre API vous permet de demander le statut d'une transaction à tout moment grâce à l'un de nos appels GET :
Un appel GetPaymentDetails ressemble à ceci :
// Obtenez la réponse pour le PaymentsClient
$createPaymentResponse = $merchantClient->payments()->createPayment($createPaymentRequest);
// Ici, vous obtenez $paymentId que vous pouvez utiliser dans le code suivant
$paymentId = $createPaymentResponse->getPayment()->getId();
// Obtenez l'objet PaymentResponse avec les informations de statut
// concernant le paiement de l'ID donné
$paymentResponse = $merchantClient->payments()->getPaymentDetails($paymentId);
| Variables |
|---|
| string $paymentID: La référence unique de votre transaction sur notre plateforme. Cette référence peut être récupérée à partir de l'objet $createPaymentResponse ou de l'objet $createHostedCheckoutResponse créé dans la section précédente. |
Pour plus d'informations sur les statuts, visitez la page de documentation des statuts.
Effectuer une opération de maintenance
Pour effectuer des opérations de maintenance sur des transactions existantes (c'est-à-dire des captures ou des remboursements), utilisez respectivement nos API CapturePayment et RefundPayment.
CapturePayment
Assurez-vous d'utiliser les classes suivantes :
- CapturePaymentRequest
/*
*…. Initialisation....
*/
$merchantClient = $client->merchant($merchantId);
// Ici, vous obtenez $paymentId que vous pouvez utiliser dans le code suivant
$paymentID = $createPaymentResponse->getPayment()->getId();
$capturePaymentRequest = new CapturePaymentRequest();
$capturePaymentRequest->setAmount(100);
$capturePaymentRequest->setIsFinal(true);
// Obtenez l'objet CaptureResponse
$captureResponse = $merchantClient->payments()->capturePayment($paymentID, $capturePaymentRequest);
Rembourser le paiement
Assurez-vous d'utiliser les classes suivantes :
- RefundRequest
- AmountOfMoney
/*
*…. Initialisation....
*/
$merchantClient = $client->merchant($merchantId);
// Ici, vous obtenez $paymentId que vous pouvez utiliser dans le code suivant
$paymentID = $createPaymentResponse->getPayment()->getId();
$refundRequest = new RefundRequest();
$amountOfMoney = new AmountOfMoney();
$amountOfMoney->setCurrencyCode("EUR");
$amountOfMoney->setAmount(100);
$refundRequest->setAmountOfMoney($amountOfMoney);
// Obtenez l'objet RefundResponse
$refundResponse = $merchantClient->payments()->refundPayment($paymentID, $refundRequest );
| Variables |
|---|
| string $paymentID: La référence unique de votre transaction sur notre plateforme. Cette référence peut être récupérée à partir de l'objet $createPaymentResponse ou de l'objet $createHostedCheckoutResponse créé dans la section précédente. |
Gérer les exceptions
Si une transaction est rejetée, notre plateforme fournit des informations détaillées avec l'objet Exception. Le code HTTP status associé vous aide également à diagnostiquer l'erreur.
Vous pouvez rencontrer deux types d'exceptions : exceptions de transaction et exceptions HTTP.
Exceptions de transaction
Ce type d'exception fait référence aux demandes de transaction qui sont techniquement correctes mais ont été rejetées par l'émetteur de votre client ou par votre acquéreur. Si la transaction est retournée dans l'exception, cela signifie qu'elle a été créée dans nos systèmes mais n'a pas été traitée avec succès.
Les exemples de code suivants utilisent des méthodes fournies à titre d'exemple. Vous êtes censé fournir votre propre implémentation de celles-ci ou les remplacer par une logique similaire :
- isNotSuccessful : Vérifiez si la transaction est réussie selon les données de GetPayment status/statusOutput.statusCategory/status.statusCode.
- handleError : Traitez la transaction selon son statut.
- CreateRequest : Créez une demande de transaction spécifique selon les besoins.
| Type d'exception / Code d'état HTTP |
Exemple de code |
|---|---|
| Transactions rejetées / Divers (voir l'objet PaymentResponse) |
|
| Remboursement rejeté / Divers (voir l'objet PaymentResponse) |
|
Exceptions HTTP
Ce type d'exception fait référence à divers problèmes causés par des erreurs techniques dans l'appel API ou dans la demande de paiement.
Vous pouvez combiner l'un des extraits de code suivants avec un appel API CreatePayment :
Assurez-vous d'utiliser les classes suivantes :
- ApiException
/*
*…. Initialisation....
*/
$createPaymentRequest = new CreatePaymentRequest();
$order = new Order();
// L'objet exemple de AmountOfMoney
$amountOfMoney = new AmountOfMoney();
$amountOfMoney->setCurrencyCode("EUR");
$amountOfMoney->setAmount(100);
$order->setAmountOfMoney($amountOfMoney);
$createPaymentRequest->setOrder($order);
$cardPaymentMethodSpecificInput =
new CardPaymentMethodSpecificInput();
// L'objet exemple de la carte – vous pouvez trouver des cartes de test sur
// /documentation/test-cases/
$card = new Card();
$card->setCvv("123");
$card->setCardNumber("4111111111111111");
$card->setExpiryDate("1236");
$card->setCardholderName("Wile E. Coyote");
$cardPaymentMethodSpecificInput->setCard($card);
$createPaymentRequest->setCardPaymentMethodSpecificInput(
$cardPaymentMethodSpecificInput
);
try {
// Obtenez la réponse pour le PaymentsClient
$createPaymentResponse =
$paymentsClient
->createPayment($createPaymentRequest);
} catch (ApiException $e) {
// reportez-vous à la liste ci-dessous pour voir comment des
// implémentations spécifiques de ApiException peuvent être gérées.
}
| Type d'exception / Code d'état HTTP |
Exemple de Code |
|---|---|
| ValidationException / 400 |
|
| AuthorizationException / 403 |
|
| IdempotenceException / 409 |
|
| ReferenceException / 404/409/410 |
|
| PaymentPlatformException / 500/502/503 |
|
| ApiException / Autres codes |
|
Codes d'état HTTP
Toutes nos exceptions sont liées à un ou plusieurs codes d'état HTTP, indiquant la cause profonde de nombreux possibles erreurs.
| Code d'état | Description | Type d'exception |
|---|---|---|
| 200 |
Réussi |
- |
| 201 |
Créé |
- |
| 204 |
Aucun contenu |
- |
| Divers clé paymentResult est dans la réponse |
Paiement rejeté |
|
| Divers clé payoutResult est dans la réponse |
Paiement rejeté |
|
|
Divers |
Remboursement rejeté |
|
| 400 |
Mauvaise Demande |
|
| 403 |
Non Autorisé |
|
| 404 |
Non Trouvé |
|
| 409 |
Conflit
|
|
| 410 |
Parti |
|
| 500 |
Erreur Interne du Serveur |
|
| 502 | Mauvaise Passerelle Notre plateforme n'a pas pu traiter un message d'un partenaire/acquéreur en aval |
|
| 503 | Service Indisponible Le service auquel vous essayez d'accéder est temporairement indisponible. Veuillez réessayer plus tard |
|
| Autres | Erreur imprévue Une erreur imprévue s'est produite |
|
Fonctionnalités supplémentaires
Le SDK a beaucoup plus à offrir. Découvrez les fonctionnalités suivantes, car elles vous aideront à construire la solution parfaite.
- Obtenir les méthodes de paiement disponibles
- Envoyer des requêtes idempotentes
- Utiliser la Logging
- Mise en pool de connexions
- Personnaliser la communication
- Webhooks
Obtenir les méthodes de paiement disponibles
Avant d'initier le processus de paiement réel, vous pouvez faire un appel GetPaymentProducts. La réponse contiendra la liste des moyens de paiement disponibles pour votre PSPID. Vous pouvez laisser vos clients sélectionner le moyen de paiement de leur choix grâce à notre Hosted Checkout Page ou héberger vous-même votre propre page de sélection puis faire des appels à CreatePayment.
Assurez-vous d'utiliser les classes suivantes :
- GetPaymentProductsParams
/*
*…. Initialisation....
*/
$merchantClient = $client->merchant($merchantId);
// Préparer la demande pour obtenir toutes les méthodes de paiement actives de votre PSPID
$queryParams = new GetPaymentProductsParams();
// Paramètres d'exemple
$queryParams->setCountryCode("BE");
$queryParams->setCurrencyCode("EUR");
// Envoyer la demande et obtenir la réponse
$paymentProductsResponse = $merchantClient->products()->getPaymentProducts($queryParams);
Envoyer des requêtes idempotentes
Une des principales fonctionnalités de l'API est sa capacité à détecter et à empêcher l'envoi accidentel de requêtes de paiement en double. Le SDK vous facilite grandement la tâche pour vous assurer que vous n'envoyez que des requêtes uniques – idempotentes – à notre plateforme.
Utilisez l'argument supplémentaire CallContext et définissez sa propriété nommée $idempotenceKey en appelant le setter setIdempotenceKey() sur l'objet créé précédemment et appelez la fonction API CreatePayment. Le SDK enverra un en-tête X-GCS-Idempotence-Key avec la clé d'idempotence comme valeur.
Si vous envoyez des requêtes de cette manière à notre plateforme, nous vérifierons ce qui suit :
- Si vous envoyez une requête subséquente avec la même clé d'idempotence, la réponse contient un en-tête X-GCS-Idempotence-Request-Timestamp. Le SDK définira la propriété $idempotenceRequestTimestamp de l'argument CallContext.
- Si la première demande n'est pas encore terminée, l'API renverra un code de statut 409. Dans ce cas, le SDK déclenchera une IdempotenceException avec la clé d'idempotence d'origine et le timestamp de la requête d'idempotence.
Assurez-vous d'utiliser les classes suivantes :
- CallContext
- IdempotenceException
/*
*…. Initialisation....
*/
$merchantClient = $client->merchant($merchantId);
$createPaymentRequest = new CreatePaymentRequest();
$idempotenceKey = "VotreCléPourLePaiement";
$callContext = new CallContext();
$callContext->setIdempotenceKey($idempotenceKey);
try {
$createPaymentResponse = $merchantClient
->payments()
->createPayment(
$createPaymentRequest,
$callContext
);
} catch (IdempotenceException $e) {
// une demande avec le même $idempotenceKey est toujours en cours, essayez à nouveau après une brève pause
// $e->getIdempotenceRequestTimestamp() contient la valeur de l'en-tête
// X-GCS-Idempotence-Request-Timestamp
} finally {
$idempotenceRequestTimestamp =
$callContext->getIdempotenceRequestTimestamp();
// $idempotenceRequestTimestamp contient la valeur de l'en-tête
// X-GCS-Idempotence-Request-Timestamp
// si $idempotenceRequestTimestamp n'est pas vide, ce n'était pas la première demande
}
Si une clé d'idempotence est envoyée pour un appel qui ne prend pas en charge l'idempotence, l'API ignorera la clé et traitera la demande comme une première demande.
Utiliser la Logging
Le SDK prend en charge la Logging des requêtes, des réponses, et des exceptions. Cela peut être utile pour le dépannage ou le suivi des étapes dans un flux de paiement.
Le SDK offre deux implémentations de la fonctionnalité de Logging :
- SplFileObjectLogger (en utilisant SplFileObject)
- ResourceLogger
Assurez-vous d'utiliser les classes suivantes :
- ResourceLogger
Vous pouvez activer/désactiver la logging en appelant :
/*
*…. Initialisation....
*/
$client = new Client($communicator);
// Vous pouvez entrer un pointeur de fichier vers le fichier
// dans lequel vous souhaitez enregistrer les données à la place de STDOUT
$logger = new ResourceLogger(STDOUT);
$client->enableLogging($logger);
//... Effectuez quelques appels
$client->disableLogging();
Le SDK obfusque les données sensibles dans le journaliseur.
Mise en pool de connexions
Vous pouvez gérer vos ressources réseau en limitant le nombre de connexions possibles que le SDK crée et maintient. Les instances de Client créées comme discuté dans le chapitre Initialiser le SDK disposeront de leur propre pool de connexions. Les instances de Client créées avec le même objet Communicator partagent un même pool de connexions.
Si vous utilisez plusieurs instances de Client pour partager un seul pool de connexions, assurez-vous de suivre ces étapes :
- Créer un Communicator partagé.
- Créer des instances de Client avec ce Communicator.
/*
*…. Initialisation....
*/
// Créez une instance de CommunicatorConfiguration
// avec les paramètres appropriés
$sharedCommunicatorConfiguration =
new CommunicatorConfiguration(
$apiKey,
$apiSecret,
$apiEndpoint,
$integrator,
$proxyConfiguration
);
$connection = new DefaultConnection();
// Instance de Communicator
$communicator = new Communicator(
$connection,
$sharedCommunicatorConfiguration
);
$client1 = new Client($communicator);
$client2 = new Client($communicator);
Personnaliser la communication
Les instances de Client utilisent une instance de Communicator pour communiquer avec notre plateforme. Tandis que Communicator utilise Connection pour effectuer les requêtes HTTP réelles et une ConnectionResponse pour contenir la réponse HTTP.
Connection et ConnectionResponse sont des interfaces. Le SDK fournit une implémentation par défaut de ces interfaces via les classes DefaultConnection et DefaultConnectionResponse.
- La classe DefaultConnection utilise cURL via les liaisons PHP/cURL standard pour implémenter les méthodes get(), delete(), post() et put().
- DefaultConnectionResponse offre une implémentation simple des méthodes getHttpStatusCode(), getHeaders(), getHeaderValue() et getBody(), et est utilisée par DefaultConnection.
Vous pouvez fournir votre propre implémentation de l'interface de Connection à utiliser dans l'objet Communicator, par exemple la classe YourConnection.
/*
*…. Initialisation....
*/
$merchantClient = $client->merchant($merchantId);
$createPaymentRequest = new CreatePaymentRequest();
$idempotenceKey = "VotreCléPourLePaiement";
$callContext = new CallContext();
$callContext->setIdempotenceKey($idempotenceKey);
try {
$createPaymentResponse = $merchantClient
->payments()
->createPayment(
$createPaymentRequest,
$callContext
);
} catch (IdempotenceException $e) {
// une requête avec la même $idempotenceKey est toujours en cours, essayez à nouveau après une brève pause
// $e->getIdempotenceRequestTimestamp() contient la valeur de l'en-tête
// X-GCS-Idempotence-Request-Timestamp
} finally {
$idempotenceRequestTimestamp =
$callContext->getIdempotenceRequestTimestamp();
// $idempotenceRequestTimestamp contient la valeur de l'en-tête
// X-GCS-Idempotence-Request-Timestamp
// si $idempotenceRequestTimestamp n'est pas vide, ce n'était pas la première requête
}
Webhooks
La partie du SDK qui gère le support des webhooks est appelée le helper des webhooks. Il gère de manière transparente à la fois la validation des signatures par rapport aux corps des événements envoyés par le système de webhooks (y compris la recherche de la clé secrète pour les ID de clés - à ne pas confondre avec la API Key et API Secret ), et le désérialisation de ces corps en objets. Cela vous permet de vous concentrer sur l'essentiel, sans devoir passer par toutes les informations supplémentaires et extraire celles qui vous intéressent. Pour en savoir plus sur les webhooks, lisez notre guide dédié.
Fournissez des clés secrètes
Configurez le "WebhooksKey" / "WebhooksKeySecret" et les API endpoints de vos webhooks serveur dans le Merchant Portal :
$keyId = "WebhooksKey";
$secretKey = "WebhooksKeySecret";
Les clés secrètes sont fournies à l'aide d'une fonction qui prend deux arguments :
- L'ID de la clé pour laquelle vous souhaitez obtenir la clé secrète.
- Une fonction de rappel qui prend soit une erreur comme premier argument, soit la clé secrète pour l'ID de clé donné comme second argument (dans ce cas, le premier argument doit être null).
Le SDK fournit une implémentation pour cette fonction : InMemorySecretKeyStore::getSecretKey($keyId). Cela récupérera les clés secrètes à partir d'un magasin de clés en mémoire pour le $keyId approprié.
Les clés peuvent être ajoutées ou supprimées à l'aide des fonctions suivantes :
- InMemorySecretKeyStore::storeSecretKey($keyId, $secretKey) pour stocker une clé secrète pour un ID de clé.
- InMemorySecretKeyStore::removeSecretKey($keyId) pour supprimer la clé secrète stockée pour un ID de clé.
- InMemorySecretKeyStore::clear() pour supprimer toutes les clés secrètes stockées.
Si un stockage plus avancé est requis, par exemple en utilisant une base de données ou un système de fichiers, nous vous recommandons d'écrire votre propre implémentation.
Initialisez le helper des webhooks
Incluez et initialisez le helper des webhooks comme suit :
$keyId = 'dummy-key-id';
$secretKey = 'dummy-secret-key’';
$secretKeys = array(
$keyId => $secretKey
);
$secretKeyStore = new InMemorySecretKeyStore($secretKeys);
// À ce moment, les $secretKeys sont stockées car elles ont été données au constructeur
// mais vous pouvez définir un tableau vide de $secretKeys et après cela vous pouvez
// utiliser les fonctions de InMemorySecretKeyStore comme mentionné ci-dessus
// ou même vous pouvez étendre la classe InMemorySecretKeyStore pour
// implémenter vos propres méthodes pour gérer les $secretKeys
$helper = new WebhooksHelper($secretKeyStore);
Utilisez le helper des webhooks
À partir d'un point d'entrée que vous avez créé vous-même, appelez la méthode de désérialisation du helper des webhooks. Elle prend les arguments suivants :
- Le corps, sous forme de chaîne ou de tampon. Cela doit être le corps brut tel que reçu du système de webhooks.
- Un objet contenant les en-têtes de requête tels que reçus du système de webhooks. Les clés doivent être les noms des en-têtes.
// Initialisation
$bodyOfRequest = 'JSON_Body_Of_The_Request';
// Récupérez les en-têtes du message webhook, cela dépend de votre implémentation.
$webhookHeaders = $request->getHeaders();
// Transformez les en-têtes reçus
$requestHeaders = [];
foreach ($webhookHeaders as $webhookHeader) {
$requestHeaders[$webhookHeader->getName()] = $webhookHeader->getValue();
}
try {
$webhook_event = $helper->unmarshal($bodyOfRequest, $requestHeaders);
} catch (SignatureValidationException $e) {
// Votre code pour gérer les erreurs
}