Table des matières
Installation
Démarrage rapide
Configuration
Ressources
Orders
Transactions
Sources
Wallets
BankAccounts
NativeCheckout
DataServices
Webhooks
Account
Enums
Gestion des erreurs
Guide d'intégration Webhooks
Carte de test
Installation
Installez le SDK via Composer. Requiert PHP 8.2+ avec les extensions ext-json et ext-curl.
Install the SDK via Composer. Requires PHP 8.2+ with ext-json and ext-curl extensions.
composer require qrcommunication/viva-merchant-sdk
Compatible avec Laravel, Symfony, ou tout projet PHP standard.
Démarrage rapide
Quick Start
<?php
use QrCommunication\VivaMerchant\VivaClient;
$viva = new VivaClient(
merchantId: 'votre-merchant-uuid',
apiKey: 'votre-api-key',
clientId: 'xxx.apps.vivapayments.com',
clientSecret: 'votre-client-secret',
environment: 'demo', // ou 'production'
);
// Créer un ordre de paiement — Create a payment order
$order = $viva->orders->create(
amount: 1500,
customerDescription: 'Consultation',
);
// Rediriger le client vers $order['checkout_url']
// Vérifier une transaction après paiement — Verify a transaction after payment
$txn = $viva->transactions->getV2('transaction-uuid');
// Rembourser (partiel) — Partial refund
$viva->transactions->cancel('transaction-uuid', amount: 500);
// Capturer une pré-autorisation — Capture a pre-authorization
$viva->transactions->capture('preauth-uuid', amount: 1500);
// Charge récurrente — Recurring charge
$viva->transactions->recurring('initial-txn-uuid', amount: 1500);
// Apple Pay / Google Pay (NativeCheckout)
$token = $viva->nativeCheckout->createChargeToken(1500, $applePayData);
$txn = $viva->nativeCheckout->createTransaction($token['chargeToken'], 1500);
// Tester la connexion — Test connection
$ok = $viva->testConnection(); // true ou false
Configuration
Le constructeur VivaClient accepte 5 paramètres. L'authentification OAuth2 est gérée automatiquement — le token est mis en cache et rafraîchi avant expiration.
The VivaClient constructor accepts 5 parameters. OAuth2 authentication is handled automatically — the token is cached in memory and refreshed before expiry.
Paramètre
Type
Requis
Description
merchantId
string
Oui
UUID du marchand Viva Wallet
apiKey
string
Oui
Clé API (Legacy API — Basic Auth)
clientId
string
Oui
Client ID OAuth2 (format xxx.apps.vivapayments.com)
clientSecret
string
Oui
Secret OAuth2
environment
string|Environment
Non
'demo' (défaut) ou 'production'
Architecture d'authentification
Le SDK utilise deux mécanismes d'authentification selon la ressource utilisée :
API
Méthode
Ressources
Legacy API
Basic Auth (merchantId:apiKey)
Orders, Transactions, Sources
New API
Bearer OAuth2 (auto-refresh)
Wallets, BankAccounts, NativeCheckout, DataServices, Account
Ressources
1
Orders
$viva->orders
Ordres de paiement Smart Checkout. Crée des liens de paiement hébergés sur les serveurs Viva Wallet.
Smart Checkout payment orders. Creates hosted payment links on Viva Wallet's servers.
create()
Créer un ordre de paiement.
Paramètre
Type
Défaut
Description
amount
int
requis
Montant en centimes (ex : 1500 = 15,00 EUR)
customerDescription
?string
null
Texte affiché au client sur la page de paiement
merchantReference
?string
null
Référence interne (visible dans les exports)
sourceCode
?string
null
Code source de paiement (null = source par défaut)
allowRecurring
bool
false
Tokeniser la carte pour les charges futures
preauth
bool
false
Pré-autorisation uniquement (capture séparée)
maxInstallments
int
0
Nombre max de versements (0 = désactivé)
Retourne :
array{order_code: int, checkout_url: string}
$order = $viva->orders->create(
amount: 1500, // 15,00 EUR
customerDescription: 'Consultation',
merchantReference: 'session_123',
allowRecurring: true,
preauth: false,
maxInstallments: 3,
);
echo $order['order_code']; // 1234567890
echo $order['checkout_url']; // https://demo.vivapayments.com/web/checkout?ref=1234567890
// Rediriger le client
header('Location: ' . $order['checkout_url']);
get(int $orderCode): array
Récupérer le statut d'un ordre.
$order = $viva->orders->get(orderCode: 1234567890);
cancel(int $orderCode): array
Annuler un ordre non payé.
$viva->orders->cancel(orderCode: 1234567890);
checkoutUrl(int $orderCode): string
Générer l'URL de checkout à partir d'un code de commande existant. Aucun appel API — calcul local.
$url = $viva->orders->checkoutUrl(orderCode: 1234567890);
// 'https://demo.vivapayments.com/web/checkout?ref=1234567890'
2
Transactions
$viva->transactions
Consultation, remboursement, capture de pré-autorisation et paiements récurrents.
Transaction retrieval, refunds, pre-authorization captures, and recurring payments.
get(string $transactionId): array
Détails complets via Legacy API (Basic Auth). Retourne des clés PascalCase incluant frais, commission, infos carte.
$txn = $viva->transactions->get('transaction-uuid');
echo $txn['Transactions'][0]['Amount']; // en centimes
echo $txn['Transactions'][0]['StatusId']; // 'F', 'A', 'C', etc.
echo $txn['Transactions'][0]['Fee'];
echo $txn['Transactions'][0]['CreditCard']['Number']; // masqué
getV2(string $transactionId): array
Détails allégés via New API (Bearer OAuth). Clés camelCase. Recommandé pour vérifier les paiements Smart Checkout.
$txn = $viva->transactions->getV2('transaction-uuid');
echo $txn['email']; // email acheteur
echo $txn['amount']; // en EUR (pas en centimes)
echo $txn['statusId']; // 'F' = finalisée
echo $txn['orderCode']; // code de commande
echo $txn['cardNumber']; // numéro masqué
echo $txn['currencyCode']; // ex: 978 (EUR)
echo $txn['recurringSupport']; // true si tokenisée
listByDate(string $date): array
Lister les transactions pour une date (format Y-m-d).
Retourne :
array<int, array<string, mixed>>
$transactions = $viva->transactions->listByDate('2026-03-18');
foreach ($transactions as $txn) {
echo $txn['TransactionId'] . ' — ' . $txn['Amount'] . "\n";
}
cancel(string $transactionId, ?int $amount = null, ?string $sourceCode = null): array
Annuler ou rembourser une transaction. Même jour = annulation (void). Jour passé = remboursement (refund).
Paramètre
Type
Défaut
Description
transactionId
string
requis
UUID de la transaction
amount
?int
null
Centimes (null = remboursement total)
sourceCode
?string
null
Code source de paiement
Retourne :
array{TransactionId: string}
// Remboursement total — Full refund
$result = $viva->transactions->cancel('transaction-uuid');
// Remboursement partiel (5,00 EUR) — Partial refund
$result = $viva->transactions->cancel('transaction-uuid', amount: 500);
echo $result['TransactionId']; // UUID du remboursement
capture(string $transactionId, int $amount): array
Capturer une pré-autorisation. Lève ApiException si la capture échoue.
$result = $viva->transactions->capture(
transactionId: 'preauth-uuid',
amount: 1500, // 15,00 EUR
);
recurring(string $initialTransactionId, int $amount, ?string $sourceCode = null): array
Effectuer une charge récurrente sur une carte tokenisée.
Prérequis : l'ordre initial doit avoir été créé avec allowRecurring: true.
$result = $viva->transactions->recurring(
initialTransactionId: 'initial-txn-uuid',
amount: 1500,
sourceCode: '1234', // optionnel
);
3
Sources
$viva->sources
Gestion des sources de paiement : domaines autorisés et URLs de redirection après paiement.
Payment sources management: authorized domains and post-payment redirect URLs.
list(): array
Lister toutes les sources de paiement du compte.
$sources = $viva->sources->list();
foreach ($sources as $source) {
echo $source['Name'] . ' — ' . $source['SourceCode'] . "\n";
}
create(string $name, string $sourceCode, ?string $domain, ?string $pathSuccess, ?string $pathFail): array
Créer une nouvelle source de paiement.
Paramètre
Type
Défaut
Description
name
string
requis
Nom d'affichage de la source
sourceCode
string
requis
Code à 4 chiffres
domain
?string
null
Domaine du site (ex : www.example.com)
pathSuccess
?string
null
Chemin de redirection après paiement réussi
pathFail
?string
null
Chemin de redirection après échec
$source = $viva->sources->create(
name: 'Mon site web',
sourceCode: '1234',
domain: 'www.example.com',
pathSuccess: '/paiement/succes',
pathFail: '/paiement/echec',
);
4
Wallets
$viva->wallets
Gestion des portefeuilles (sous-comptes), soldes et transferts internes.
Wallet management (sub-accounts), balances, and internal transfers.
list(): array
Lister les portefeuilles du compte.
$wallets = $viva->wallets->list();
balance(): array
Solde agrégé de tous les portefeuilles.
Retourne :
array{available: float, pending: float, reserved: float, currency: string}
$balance = $viva->wallets->balance();
echo $balance['available']; // 150.50
echo $balance['pending']; // 25.00
echo $balance['reserved']; // 0.00
echo $balance['currency']; // 'EUR'
transfer(int $amount, string $sourceWalletId, string $targetWalletId, ?string $description = null): array
Transfert entre deux portefeuilles du même compte.
Prérequis : activer « Allow transfers between accounts » dans Settings > API Access.
$viva->wallets->transfer(
amount: 5000, // 50,00 EUR
sourceWalletId: 'source-uuid',
targetWalletId: 'target-uuid',
description: 'Transfert mensuel',
);
listDetailed(): array
Liste enrichie avec IBAN, SWIFT, solde et indicateur de portefeuille principal.
$wallets = $viva->wallets->listDetailed();
foreach ($wallets as $wallet) {
echo $wallet['iban'] . ' — ' . $wallet['amount'] . "\n";
echo $wallet['isPrimary'] ? 'Principal' : 'Secondaire';
}
create(string $friendlyName, string $currencyCode = 'EUR'): array
Créer un nouveau portefeuille.
$viva->wallets->create(
friendlyName: 'Compte secondaire',
currencyCode: 'EUR',
);
update(int $walletId, string $friendlyName): array
Renommer un portefeuille existant.
$viva->wallets->update(walletId: 12345, friendlyName: 'Nouveau nom');
searchTransactions(array $params): array
Rechercher les transactions d'un portefeuille sur une plage de dates.
$transactions = $viva->wallets->searchTransactions([
'date_from' => '2026-03-01',
'date_to' => '2026-03-31',
'walletId' => 12345,
]);
getTransaction(string $transactionId): array
Détails d'une transaction de compte (wallet transaction).
$txn = $viva->wallets->getTransaction('transaction-uuid');
5
BankAccounts
$viva->bankAccounts
Gestion des comptes bancaires IBAN et virements SEPA (standard et instantané).
IBAN bank accounts management and SEPA transfers (standard and instant).
link(string $iban, string $beneficiaryName, ?string $friendlyName = null): array
Lier un IBAN externe au compte Viva Wallet.
$result = $viva->bankAccounts->link(
iban: 'FR7630006000011234567890189',
beneficiaryName: 'Jean Dupont',
friendlyName: 'Compte principal',
);
echo $result['bankAccountId']; // UUID du compte lié
echo $result['isVivaIban']; // false (IBAN externe)
transferOptions(string $bankAccountId): array
Récupérer les options de transfert disponibles pour un compte lié.
$options = $viva->bankAccounts->transferOptions('bank-account-uuid');
feeCommand(string $bankAccountId, int $amount, string $walletId, bool $isInstant = false, string $instructionType = 'SHA'): array
Calculer les frais avant d'exécuter un virement. Le bankCommandId retourné doit être passé à send().
$fees = $viva->bankAccounts->feeCommand(
bankAccountId: 'bank-account-uuid',
amount: 10000, // 100,00 EUR
walletId: 'source-wallet-uuid',
isInstant: true, // SEPA instantané
instructionType: 'SHA', // frais partagés
);
echo $fees['bankCommandId']; // à passer à send()
echo $fees['fee']; // frais en centimes
send(string $bankAccountId, int $amount, string $walletId, ?string $bankCommandId = null, ?string $description = null): array
Exécuter un virement SEPA vers un compte lié.
$result = $viva->bankAccounts->send(
bankAccountId: 'bank-account-uuid',
amount: 10000,
walletId: 'source-wallet-uuid',
bankCommandId: 'fee-command-uuid', // optionnel
description: 'Virement mensuel',
);
echo $result['commandId']; // UUID du virement
echo $result['isInstant']; // true/false
echo $result['fee']; // frais en centimes
list(): array
Lister les comptes bancaires liés au compte.
$accounts = $viva->bankAccounts->list();
get(string $bankAccountId): array
Détails d'un compte bancaire lié.
$account = $viva->bankAccounts->get('bank-account-uuid');
6
NativeCheckout
$viva->nativeCheckout
Paiements natifs Apple Pay et Google Pay directement depuis votre application mobile ou web.
Native Apple Pay and Google Pay payments directly from your mobile or web application.
Le flux NativeCheckout se déroule en deux étapes : d'abord générer un chargeToken à partir des données de paiement mobile, puis créer la transaction avec ce token.
createChargeToken()
Générer un token de charge à partir des données Apple Pay ou Google Pay.
Paramètre
Type
Défaut
Description
amount
int
requis
Montant en centimes
paymentData
string
requis
Données Apple Pay ou Google Pay (JSON sérialisé)
paymentMethod
string
'applepay'
'applepay' ou 'googlepay'
sourceCode
?string
null
Code source de paiement
dynamicDescriptor
?string
null
Descripteur dynamique sur le relevé bancaire
Retourne :
array{chargeToken: string, redirectToACSForm: ?string}
$token = $viva->nativeCheckout->createChargeToken(
amount: 1500,
paymentData: $applePayPaymentDataString, // JSON string
paymentMethod: 'applepay', // ou 'googlepay'
sourceCode: '1234',
);
echo $token['chargeToken']; // à passer à createTransaction()
echo $token['redirectToACSForm']; // formulaire 3DS (si applicable)
createTransaction()
Finaliser la transaction à partir du token de charge.
Paramètre
Type
Défaut
Description
chargeToken
string
requis
Token issu de createChargeToken()
amount
int
requis
Montant en centimes
currencyCode
int
978
Code ISO 4217 numérique (978 = EUR)
sourceCode
?string
null
Code source de paiement
merchantTrns
?string
null
Référence interne marchand
customerTrns
?string
null
Description visible par le client
preauth
bool
false
Pré-autorisation uniquement
tipAmount
int
0
Pourboire en centimes
installments
?int
null
Nombre de versements
Retourne :
array{transactionId: string, statusId: string, amount: int, orderCode: int}
$txn = $viva->nativeCheckout->createTransaction(
chargeToken: $token['chargeToken'],
amount: 1500,
currencyCode: 978, // EUR (ISO 4217 numérique)
merchantTrns: 'ref_123',
customerTrns: 'Consultation',
);
echo $txn['transactionId']; // UUID
echo $txn['statusId']; // 'F' = finalisée
echo $txn['amount']; // 1500
echo $txn['orderCode']; // code de commande
7
DataServices
$viva->dataServices
Rapports MT940 et souscriptions webhook pour la génération de fichiers de données.
MT940 reports and webhook subscriptions for data file generation.
mt940(string $date): array
Récupérer le rapport MT940 pour une date donnée (format Y-m-d).
$report = $viva->dataServices->mt940('2026-03-18');
createSubscription(string $url, string $eventType): array
Créer une souscription webhook pour recevoir les notifications de fichiers.
$sub = $viva->dataServices->createSubscription(
url: 'https://example.com/webhooks/viva-files',
eventType: 'SaleTransactionsFileGenerated',
);
echo $sub['subscriptionId'];
updateSubscription(string $subscriptionId, ?string $url, ?string $eventType): array
Mettre à jour une souscription existante (null = conserver la valeur actuelle).
$viva->dataServices->updateSubscription(
subscriptionId: 'sub-uuid',
url: 'https://example.com/webhooks/new-url',
eventType: null, // conserver l'eventType actuel
);
deleteSubscription(string $subscriptionId): void
Supprimer une souscription webhook.
$viva->dataServices->deleteSubscription('sub-uuid');
listSubscriptions(): array
Lister toutes les souscriptions webhook actives.
$subs = $viva->dataServices->listSubscriptions();
foreach ($subs as $sub) {
echo $sub['subscriptionId'] . ' → ' . $sub['url'] . "\n";
}
requestFile(string $date): void
Déclencher la génération asynchrone d'un fichier pour une date donnée.
Utilisez une souscription webhook pour être notifié de la disponibilité du fichier.
$viva->dataServices->requestFile('2026-03-18');
// Génération asynchrone — attendre le webhook 'sale.transactions.file'
8
Webhooks
$viva->webhooks
Vérification et parsing des webhooks Viva Wallet. Aucun appel API — traitement entièrement local.
Viva Wallet webhook verification and parsing. No API calls — fully local processing.
verificationResponse(string $verificationKey): array
Répondre à la requête GET de vérification initiale de Viva Wallet.
Retourne :
array{StatusCode: int, Key: string}
// Route GET /webhooks/viva
public function verify()
{
return response()->json(
$viva->webhooks->verificationResponse('votre-verification-key')
);
// Réponse : {"StatusCode": 0, "Key": "votre-verification-key"}
}
parse(string $rawBody): array
Parser le payload JSON d'un webhook POST.
Lève \InvalidArgumentException si le JSON est invalide.
Retourne :
array{event_type: string, event_type_id: int, event_data: array}
// Route POST /webhooks/viva
public function handle(Request $request)
{
$event = $viva->webhooks->parse($request->getContent());
echo $event['event_type']; // 'transaction.payment.created'
echo $event['event_type_id']; // 1796
// $event['event_data'] // données de l'événement
match ($event['event_type']) {
'transaction.payment.created' => $this->onPayment($event['event_data']),
'transaction.refund.created' => $this->onRefund($event['event_data']),
'transaction.preauth.created' => $this->onPreauth($event['event_data']),
'transaction.preauth.completed' => $this->onCapture($event['event_data']),
default => logger()->info('Webhook ignoré : ' . $event['event_type']),
};
return response()->json(['status' => 'ok']);
}
isKnownEvent(int $eventTypeId): bool
Vérifier si un ID d'événement est reconnu par le SDK.
$viva->webhooks->isKnownEvent(1796); // true
$viva->webhooks->isKnownEvent(9999); // false
eventTypeIds(): array
Retourner la liste de tous les IDs d'événements connus.
$ids = $viva->webhooks->eventTypeIds();
// [1796, 1797, 1798, ..., 1828]
21 types d'événements supportés
ID
Type d'événement
Description
1796 transaction.payment.createdPaiement créé / reçu
1797 transaction.refund.createdRemboursement créé
1798 transaction.payment.cancelledPaiement annulé
1799 transaction.reversal.createdAnnulation (void) créée
1800 transaction.preauth.createdPré-autorisation créée
1801 transaction.preauth.completedPré-autorisation capturée
1802 transaction.preauth.cancelledPré-autorisation annulée
1810 pos.session.createdSession POS créée
1811 pos.session.failedSession POS échouée
1812 transaction.price.calculatedPrix calculé (frais dynamiques)
1813 transaction.failedTransaction échouée
1819 account.connectedCompte connecté
1820 account.verification.status.changedStatut de vérification du compte modifié
1821 account.transaction.createdTransaction de compte (wallet) créée
1822 command.bank.transfer.createdVirement bancaire initié
1823 command.bank.transfer.executedVirement bancaire exécuté
1824 transfer.createdTransfert entre wallets créé
1825 obligation.createdObligation créée
1826 obligation.capturedObligation capturée
1827 order.updatedOrdre mis à jour
1828 sale.transactions.fileFichier de transactions disponible
9
Account
$viva->account
Informations et portefeuilles du compte marchand.
Merchant account information and wallets.
info(): array
Informations générales du compte marchand.
$info = $viva->account->info();
echo $info['merchantId'];
echo $info['businessName'];
echo $info['email'];
wallets(): array
Portefeuilles associés au compte marchand.
$wallets = $viva->account->wallets();
Enums
Environment
Environnement Viva Wallet. Accepté en string ou en instance d'enum.
Constante
Valeur
Description
Environment::DEMO
'demo'
Environnement de test
Environment::PRODUCTION
'production'
Environnement de production
use QrCommunication\VivaMerchant\Enums\Environment;
$env = Environment::DEMO;
$env = Environment::from('demo');
$env->value; // 'demo'
$env->apiUrl(); // 'https://demo-api.vivapayments.com'
$env->legacyUrl(); // 'https://demo.vivapayments.com'
$env->checkoutUrl(); // 'https://demo.vivapayments.com/web/checkout'
$env->accountsUrl(); // 'https://demo-accounts.vivapayments.com'
Currency
Codes ISO 4217 numériques pour les 12 devises supportées.
Constante
Valeur ISO numérique
Code ISO
Currency::EUR978 EUR
Currency::GBP826 GBP
Currency::USD840 USD
Currency::PLN985 PLN
Currency::RON946 RON
Currency::BGN975 BGN
Currency::CZK203 CZK
Currency::HRK191 HRK
Currency::HUF348 HUF
Currency::DKK208 DKK
Currency::SEK752 SEK
Currency::NOK578 NOK
use QrCommunication\VivaMerchant\Enums\Currency;
Currency::EUR->value; // 978
Currency::EUR->iso(); // 'EUR'
Currency::fromIso('GBP'); // Currency::GBP (826)
TransactionStatus
Statuts de transaction Viva Wallet avec méthodes helpers.
Valeur
Constante
isSuccessful()
isPending()
isFailed()
label()
'F'FINALIZEDoui Finalized
'A'PENDINGoui Pending
'C'CLEARINGoui Clearing
'E'ERRORoui Error
'M'MANUALLY_REVERSEDoui Reversed
'X'REQUIRES_ACTIONRequires Action
'R'REFUNDEDRefunded
use QrCommunication\VivaMerchant\Enums\TransactionStatus;
$status = TransactionStatus::from('F');
$status->isSuccessful(); // true
$status->isPending(); // false
$status->isFailed(); // false
$status->label(); // 'Finalized'
// Usage typique
$txn = $viva->transactions->getV2('transaction-uuid');
$status = TransactionStatus::from($txn['statusId']);
if ($status->isSuccessful()) {
// Paiement confirmé
}
Gestion des erreurs
Error Handling
Toutes les exceptions héritent de VivaException (extends RuntimeException).
RuntimeException
└── VivaException (base — httpStatus, responseBody, getErrorCode(), getErrorText())
├── ApiException (erreurs 4xx / 5xx générales)
├── AuthenticationException (401 — identifiants invalides)
└── ValidationException (422 — erreurs de validation)
Propriétés et méthodes
Membre
Type
Description
$httpStatus
int
Code HTTP de la réponse
$responseBody
?array
Corps JSON décodé de la réponse Viva
getErrorCode()
?int
Code d'erreur Viva (ErrorCode)
getErrorText()
?string
Message d'erreur Viva (ErrorText, message, ou detail)
$errors (ValidationException uniquement)
array<string, string[]>
Erreurs de validation par champ
use QrCommunication\VivaMerchant\Exceptions\ApiException;
use QrCommunication\VivaMerchant\Exceptions\AuthenticationException;
use QrCommunication\VivaMerchant\Exceptions\ValidationException;
use QrCommunication\VivaMerchant\Exceptions\VivaException;
try {
$order = $viva->orders->create(amount: 1500);
} catch (AuthenticationException $e) {
// Identifiants invalides — httpStatus = 401
echo $e->getMessage();
} catch (ValidationException $e) {
// Erreur de validation — httpStatus = 422
foreach ($e->errors as $field => $messages) {
echo "$field : " . implode(', ', $messages) . "\n";
}
} catch (ApiException $e) {
// Erreur API générale
echo $e->httpStatus; // ex: 400, 404, 500
echo $e->getErrorCode(); // code Viva
echo $e->getErrorText(); // message Viva
print_r($e->responseBody); // corps JSON complet
} catch (VivaException $e) {
// Toute autre erreur SDK
echo $e->getMessage();
}
Guide d'intégration Webhooks
Webhooks Integration Guide
1. Configurer dans le Dashboard Viva
Aller dans Settings > API Access > Webhooks , ajouter l'URL de votre endpoint et noter la clé de vérification .
2. Gérer la vérification (GET)
Viva envoie une requête GET pour vérifier la disponibilité de l'endpoint.
// Route GET /webhooks/viva
public function verify()
{
return response()->json(
$viva->webhooks->verificationResponse('votre-clé-de-vérification')
);
}
3. Recevoir les événements (POST)
// Route POST /webhooks/viva
public function handle(Request $request)
{
$event = $viva->webhooks->parse($request->getContent());
match ($event['event_type']) {
'transaction.payment.created' => $this->onPayment($event['event_data']),
'transaction.refund.created' => $this->onRefund($event['event_data']),
'transaction.preauth.created' => $this->onPreauth($event['event_data']),
'transaction.preauth.completed' => $this->onCapture($event['event_data']),
default => logger()->info('Webhook ignoré : ' . $event['event_type']),
};
return response()->json(['status' => 'ok']);
}
Laravel :
Exclure l'URL webhook du middleware VerifyCsrfToken dans bootstrap/app.php.
Carte de test
Test Card
Pour l'environnement demo uniquement. Aucun 3DS n'est requis en mode démo.
Champ
Valeur
Numéro de carte
4111 1111 1111 1111
Expiration
Toute date future
CVV
111
3DS
Non requis en mode demo