PayRouterDocs

Transactions

Une transaction est la source unique de vérité d'un paiement. Vous la créez ; le switch la route vers un fournisseur ; le statut final arrive sur votre webhook. Cette page documente l'appel de création et l'objet transaction complet.

Prerequisites

  • Un jeton API valide (Authentification).
  • Un profil marchand complété — l'identité et le pays en sont dérivés.
  • Les codes de devise et de service que vous utiliserez (p. ex. CDF, Vodacom). Listez-les avec GET /api/organization/currency/ et GET /api/organization/service/.

Créer une transaction

POST/api/payments/transaction/Bearer · merchant

Votre marchand, votre utilisateur et votre pays sont dérivés de votre jeton et de votre profil — ne les envoyez jamais. Fournissez currency et service sous forme de codes lisibles ; PayRouter les résout.

cURL
curl -X POST https://payrouter.io/api/payments/transaction/ \
  -H "Authorization: Bearer $PAYROUTER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "merchant_reference": "INV-2026-0001",
    "amount": "100.00",
    "currency": "CDF",
    "service": "Vodacom",
    "customer_number": "0810000000",
    "operation": "debit",
    "callback_url": "https://your-app.com/payments/webhook"
  }'
JavaScript
const res = await fetch("https://payrouter.io/api/payments/transaction/", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${token}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    merchant_reference: "INV-2026-0001",
    amount: "100.00",
    currency: "CDF",
    service: "Vodacom",
    customer_number: "0810000000",
    operation: "debit",
    callback_url: "https://your-app.com/payments/webhook",
  }),
});
Python
res = requests.post(
    "https://payrouter.io/api/payments/transaction/",
    headers={"Authorization": f"Bearer {token}"},
    json={
        "merchant_reference": "INV-2026-0001",
        "amount": "100.00",
        "currency": "CDF",
        "service": "Vodacom",
        "customer_number": "0810000000",
        "operation": "debit",
        "callback_url": "https://your-app.com/payments/webhook",
    },
)
PHP
<?php
$payload = [
    "merchant_reference" => "INV-2026-0001",
    "amount" => "100.00",
    "currency" => "CDF",
    "service" => "Vodacom",
    "customer_number" => "0810000000",
    "operation" => "debit",
    "callback_url" => "https://your-app.com/payments/webhook",
];
$ch = curl_init("https://payrouter.io/api/payments/transaction/");
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => ["Authorization: Bearer {$token}", "Content-Type: application/json"],
    CURLOPT_POSTFIELDS => json_encode($payload),
]);
echo curl_exec($ch);

Champs de la requête

ChampTypeRequisDescription
merchant_referencestring (≤128)Votre référence pour le paiement. Doit être unique par marchand — un doublon renvoie 400.
amountchaîne décimaleMontant à 2 décimales, p. ex. "100.00". Doit être ≥ 0.01.
currencystringCode de devise, p. ex. "CDF" ou "USD". Insensible à la casse.
servicestringNom ou symbole du service, p. ex. "Vodacom", "Airtel", "Orange", "Africell". Insensible à la casse.
customer_numberstring (≤32)Le numéro mobile-money du payeur, p. ex. "0810000000".
operationenum"debit" (encaisser auprès du client) ou "credit" (verser au client).
provider_code_namestringForcer un fournisseur ("freshpay", "unipesa"). Omettez pour laisser le répartiteur de charge choisir.
callback_urlURLL'adresse où PayRouter envoie en POST le statut final. Fortement recommandé.
operation_typestringPar défaut "merchant".
transaction_typeenum"regular" (par défaut) ou "super".

Idempotence via merchant_reference

merchant_reference est unique par marchand. Réutilisez la même référence lors des relances et PayRouter rejette le doublon avec un 400 au lieu de créer un second paiement — une protection simple contre le double débit en cas de relances réseau.

Réponse

Un 201 renvoie la transaction complète. Le statut est contrôlé par le serveur et démarre toujours à Received — l'argent ne circule jamais lors de cette requête.

json
{
  "reference": "9F3A1C2D4E5B6A7C8D9E0F1A2B3C4D5E",
  "merchant_reference": "INV-2026-0001",
  "provider_reference": null,
  "amount": "100.00",
  "merchant_amount": "0.00",
  "commission_amount": "0.00",
  "currency_abbr": "CDF",
  "service_name": "Vodacom",
  "country_abbr": "DRC",
  "provider_code_name": "freshpay",
  "customer_number": "0810000000",
  "operation": "debit",
  "transaction_status": "Received",
  "transaction_status_code": "200000",
  "callback_url": "https://your-app.com/payments/webhook",
  "created_at": "2026-06-27T10:21:00Z",
  "updated_at": "2026-06-27T10:21:00Z"
}

Champs de réponse clés

ChampDescription
referenceL'identifiant permanent de PayRouter. Utilisez-le pour retrouver le paiement et faire correspondre les webhooks.
merchant_referenceReprise de votre référence.
provider_referenceL'identifiant du fournisseur. Renseigné une fois la transaction sollicitée.
transaction_statusÉtat du cycle de vie (voir ci-dessous).
transaction_status_codeCode numérique reflétant le statut.
currency_abbr / service_name / country_abbrLibellés lisibles des résolutions effectuées.
provider_code_nameLe fournisseur sélectionné par le switch.
amount / commission_amount / merchant_amountVentilation des montants ; les montants de commission/marchand se remplissent à mesure que le paiement se règle.
created_at / updated_atHorodatages (UTC, ISO-8601).

Statuts

StatutCodeSignification
Received200000Créé et mis en file d'attente pour sollicitation.
Pending300010Accepté par le fournisseur ; en attente du callback final.
Success200010Terminé avec succès.
Failed400000Rejeté ou échoué.
Cancelled400009Annulé.

Le cycle de vie est protégé : Received → Pending → Success | Failed | Cancelled. Les états terminaux (Success, Failed, Cancelled) sont immuables — une fois atteints, ils ne changent jamais.

Lire une transaction

cURL
# One transaction (by PayRouter reference)
curl https://payrouter.io/api/payments/transaction/9F3A1C2D…5E/ \
  -H "Authorization: Bearer $PAYROUTER_TOKEN"

# Its full status timeline
curl https://payrouter.io/api/payments/transaction/9F3A1C2D…5E/history/ \
  -H "Authorization: Bearer $PAYROUTER_TOKEN"

# Your transactions (paginated)
curl "https://payrouter.io/api/payments/transaction/?ordering=-created_at&page=1" \
  -H "Authorization: Bearer $PAYROUTER_TOKEN"

Le point de terminaison de liste est limité à vos transactions et prend en charge ?search= (reference / merchant_reference / customer_number / provider_reference), ?ordering=-created_at, et les filtres : transaction_status, operation, provider_code_name, service. Les réponses sont paginées (count, next, previous, results).

Paiements groupés (versements en masse)

Pour les lots de type paie, groupez les bénéficiaires et payez-les ensemble :

Point de terminaisonObjet
POST /api/payments/payment-groups/Créer un groupe : { "name": "June payroll" }
POST /api/payments/payment-request-members/Ajouter un membre : { payment_group, name, phone_number, amount, currency }
GET /api/payments/payment-requests/?payment_group=<id>Requêtes d'un groupe
GET /api/payments/payment-transactions/Historique de paiement par membre