2
Transactions
$viva->transactions
Vente, capture de pré-autorisation, remboursements, rebate et actions sur le terminal.
Montants toujours en centimes.
Body vide sur succès. La plupart des endpoints /ecr/v1/transactions:* répondent HTTP 200 sans body — c'est le succès du dispatch vers le terminal, pas le résultat du paiement. Chaque méthode retourne array{session_id, response} : pollez la session pour le résultat réel.
— Empty body on success: poll the session for the actual payment outcome.
sale(string|int $terminalId, int $amount, string $cashRegisterId, ...): array
Initier une vente — POST /ecr/v1/transactions:sale.
| Paramètre |
Type |
Défaut |
Description |
terminalId | string|int | requis | ID du terminal cible (ex : '16000010') |
amount | int | requis | Montant à autoriser, en centimes |
cashRegisterId | string | requis | Identification de la caisse (défini par le marchand) |
merchantReference | ?string | null | Référence marchand (défaut : "SDK-{sessionId}") |
currencyCode | string | '978' | Code ISO 4217 numérique en string ('978' = EUR) |
tipAmount | int | 0 | Pourboire en centimes (incompatible avec preauth) |
preauth | ?bool | null | Flag de pré-autorisation (nécessite activation Viva) |
customerTrns | ?string | null | Référence client (texte libre) |
paymentMethod | ?string | null | Méthode de paiement affichée (ex : 'CardPresent') |
skipSurcharge | ?bool | null | Désactiver la surcharge pour cette transaction |
showTransactionResult | ?bool | null | Afficher le résultat sur le terminal |
showReceipt | ?bool | null | Afficher le reçu + résultat sur le terminal |
sessionId | ?string | null | UUID de session (auto-généré si null) |
extra | array | [] | Champs API additionnels fusionnés tels quels (ex : fiscalisationData) |
Retourne :
array{session_id: string, response: array<string, mixed>}
$sale = $viva->transactions->sale(
terminalId: '16000010',
amount: 2599, // 25,99 EUR
cashRegisterId: 'CR-01',
customerTrns: 'Table 12',
showReceipt: true,
);
$final = $viva->pollUntilComplete($sale['session_id'], timeoutSeconds: 90);
capturePreauth(string $parentSessionId, string|int $terminalId, int $amount, string $cashRegisterId, ...): array
Capturer une transaction pré-autorisée — POST /ecr/v1/transactions:preauth-completion.
Capture le montant retenu par la pré-autorisation identifiée par parentSessionId.
Champs optionnels : merchantReference, currencyCode, customerTrns,
showTransactionResult, showReceipt, sessionId, extra.
Retourne : array{session_id: string, response: array<string, mixed>}
// Pré-autoriser (nécessite preauth activé sur le compte Viva)
$preauth = $viva->transactions->sale(
terminalId: '16000010',
amount: 5000,
cashRegisterId: 'CR-01',
preauth: true,
);
$viva->pollUntilComplete($preauth['session_id']);
// Plus tard, capturer le montant final (peut être inférieur à l'autorisé)
$capture = $viva->transactions->capturePreauth(
parentSessionId: $preauth['session_id'],
terminalId: '16000010',
amount: 4200,
cashRegisterId: 'CR-01',
);
$viva->pollUntilComplete($capture['session_id']);
refund(string $parentSessionId, string|int $terminalId, int $amount, string $cashRegisterId, ...): array
Rembourser une vente, en référençant la session originale — POST /ecr/v1/transactions:refund.
Un nouveau sessionId est généré pour le remboursement ; parentSessionId
référence la vente originale. Champs optionnels : merchantReference, currencyCode,
customerTrns, showTransactionResult, showReceipt, sessionId, extra.
Retourne : array{session_id: string, response: array<string, mixed>}
$refund = $viva->transactions->refund(
parentSessionId: $sale['session_id'],
terminalId: '16000010',
amount: 1170,
cashRegisterId: 'CR-01',
);
$viva->pollUntilComplete($refund['session_id']);
unreferencedRefund(string|int $terminalId, int $amount, string $cashRegisterId, ...): array
Remboursement autonome (non référencé), non lié à une vente originale —
POST /ecr/v1/transactions:unreferenced-refund. Champs optionnels :
merchantReference, currencyCode, customerTrns,
showTransactionResult, showReceipt, sessionId, extra.
Retourne : array{session_id: string, response: array<string, mixed>}
$refund = $viva->transactions->unreferencedRefund(
terminalId: '16000010',
amount: 1500,
cashRegisterId: 'CR-01',
);
$viva->pollUntilComplete($refund['session_id']);
fastRefund(string|int $terminalId, int $amount, string $cashRegisterId, ...): array
Remboursement rapide (swift) sur Visa / Mastercard / Maestro —
POST /ecr/v1/transactions:fast-refund. Mêmes paramètres optionnels que
unreferencedRefund().
Retourne : array{session_id: string, response: array<string, mixed>}
$refund = $viva->transactions->fastRefund(
terminalId: '16000010',
amount: 1170,
cashRegisterId: 'CR-01',
);
$viva->pollUntilComplete($refund['session_id']);
rebate(string|int $terminalId, int $amount, string $cashRegisterId, ...): array
Rabais vers une carte Visa / Mastercard / Maestro — POST /ecr/v1/transactions:rebate.
Mêmes paramètres optionnels que unreferencedRefund().
Retourne : array{session_id: string, response: array<string, mixed>}
$rebate = $viva->transactions->rebate(
terminalId: '16000010',
amount: 500,
cashRegisterId: 'CR-01',
);
$viva->pollUntilComplete($rebate['session_id']);
createAction(array $payload): array
Créer une action à invoquer sur un terminal (ex : aade-fim-control) —
POST /ecr/v1/actions. Le payload est transmis tel quel (camelCase) et doit inclure
terminalId, cashRegisterId, actionType et request.
Retourne : array{terminalId?, cashRegisterId?, actionType?, actionId?}
$action = $viva->transactions->createAction([
'terminalId' => '16000010',
'cashRegisterId' => 'XDE384678UY',
'actionType' => 'aade-fim-control',
'request' => ['token' => 'ECR0210U/RCFB77000041/CMAC_K:299BFD51...:CC5FFF'],
]);
echo $action['actionId']; // f7287549-e93a-4d33-b936-000027d326d0
getAction(string $actionId): array
Récupérer le résultat d'une action — GET /ecr/v1/actions/{actionId}. Retourne HTTP 202
(body vide → []) tant que l'action est en cours, ou le résultat une fois terminée.
Retourne : array<string, mixed> (successfullyProcessed, response, …)
$result = $viva->transactions->getAction('f7287549-e93a-4d33-b936-000027d326d0');
if (($result['successfullyProcessed'] ?? false) === true) {
echo $result['response']['status']; // 'success'
echo $result['response']['message']; // 'Set decimal amount successful'
}
3
Sessions
$viva->sessions
Récupération, listing, abort et polling des sessions. Une session représente le cycle de vie d'une
transaction sur un terminal. Après avoir initié une transaction, pollez la session par son id pour
observer son résultat (eventId, success, transactionId, …).
get(string $sessionId): array
Récupérer une session par son id — GET /ecr/v1/sessions/{sessionId}.
Retourne : array<string, mixed> (success, eventId, transactionId, amount, …)
$session = $viva->sessions->get($sale['session_id']);
echo $session['eventId']; // 0 = succès
echo $session['transactionId']; // UUID de la transaction Viva
listByDate(string $date, ?bool $aadeAutonomouslyOnly = null): array
Lister toutes les sessions d'une date — GET /ecr/v1/sessions?date=Y-m-d.
| Paramètre |
Type |
Défaut |
Description |
date | string | requis | Date au format Y-m-d |
aadeAutonomouslyOnly | ?bool | null | Filtrer aux sessions AADE-autonomes uniquement (Grèce) |
Retourne : array<int|string, mixed>
$sessions = $viva->sessions->listByDate('2026-06-06');
foreach ($sessions as $session) {
echo ($session['sessionId'] ?? '') . ' — ' . ($session['eventId'] ?? '') . "\n";
}
abort(string $sessionId, string $cashRegisterId): array
Annuler une session active — DELETE /ecr/v1/sessions/{sessionId}?cashRegisterId=….
Seule la caisse ayant créé la transaction peut l'annuler.
Retourne : array<string, mixed>
$viva->sessions->abort($sale['session_id'], cashRegisterId: 'CR-01');
pollUntilComplete(string $sessionId, int $timeoutSeconds = 120, int $intervalMs = 3000): array
Poll une session jusqu'à un état terminal ou expiration du timeout. Continue tant que
eventId vaut IN_PROGRESS (1100), en dormant intervalMs entre
les tentatives. S'arrête aussi sur un eventId inconnu (fail-safe). Disponible sur la
ressource sessions et comme raccourci sur le client.
| Paramètre |
Type |
Défaut |
Description |
sessionId | string | requis | UUID de la session à poller |
timeoutSeconds | int | 120 | Temps d'attente total maximum (secondes) |
intervalMs | int | 3000 | Délai entre deux tentatives (millisecondes) |
Retourne : array<string, mixed> — l'état final. En cas de timeout :
['success' => false, 'eventId' => 1003, 'message' => 'SDK poll timeout'].
use QrCommunication\VivaCloudTerminal\Enums\EcrEventId;
// Sur le client (raccourci)
$result = $viva->pollUntilComplete($sale['session_id'], timeoutSeconds: 90);
// Ou sur la ressource sessions
$result = $viva->sessions->pollUntilComplete($sale['session_id'], 90, 2000);
$event = EcrEventId::tryFrom($result['eventId'] ?? -1);
if ($event?->isSuccessful()) {
// Paiement confirmé
}