Java

Coordonnée net.avepay:mcf (Maven)

Builders immuables, Receipt/McfInfo typés. HTTP via le HttpClient du JDK (Gson pour le JSON). Java 17+. API sync + variantes …Async (CompletableFuture).

build.gradle.kts
dependencies {
    implementation("net.avepay:mcf:0.1.0")
}
pom.xml
<dependency>
  <groupId>net.avepay</groupId>
  <artifactId>mcf</artifactId>
  <version>0.1.0</version>
</dependency>

Certifier une facture

certify
import net.avepay.mcf.*;

AvePay avepay = AvePay.builder()
        .apiKey(System.getenv("AVEPAY_API_KEY"))
        .isf("1")
        .build();

Receipt receipt = avepay.mcf("EL02000015-1").certify(
        Invoice.builder()
                .number("FV-2026-0001")
                .type(InvoiceType.FV)                       // FV | FT | EV | ET (défaut FV)
                .operator("1", "Awa")
                .customer(Customer.pp("Client Comptant"))
                .item(Item.of("Riz 25kg", TaxGroup.B, 15_000).quantity(1))
                .payment(Payment.cash(15_000))
                .build());

System.out.println(receipt.sig());        // signature SECEF (codeSecef)
System.out.println(receipt.qr());         // contenu QR
System.out.println(receipt.totalTtc());   // 15000
System.out.println(receipt.counters());   // Counters[tc=…, fvc=…, frc=…]

TaxGroup déduit le taxRate (A = 0 %, B = 18 %) ; Payment.cash/transfer/card/mobile/cheque/other(amount) → codes E/V/C/M/B/A. Échappatoire brute : mcf.certifyRaw(Map<String,Object> body).

Avoir (credit note)

creditNote
Receipt avoir = avepay.mcf("EL02000015-1").creditNote(
        CreditNote.builder()
                .number("FA-2026-0001")
                .from(receipt)                       // dérive creditNoteRef = "{nim}-{fvc}"
                // ou .ref("EL02000015-1-291")
                .nature(CreditNoteNature.COR)        // COR | RAN | RAM | RRR (défaut COR)
                .operator("1", "Awa")
                .customer(Customer.builder(ClientType.PP).build())
                .item(Item.of("Riz 25kg", TaxGroup.B, 15_000))
                .payment(Payment.cash(15_000))
                .build());

Info · cancel-pending · me

Autres appels
McfInfo info = avepay.mcf("EL02000015-1").info();
avepay.mcf("EL02000015-1").cancelPending();
JsonObject me = avepay.me();

Gestion d'erreurs

AvePayError
try {
    avepay.mcf("EL02000015-1").certify(invoice);
} catch (AvePayError e) {
    System.err.println(e.code() + " " + e.httpStatus() + " " + e.getMessage());
    if (e.isBridgeOffline()) { /* MCF hors ligne */ }
}

Retry réseau/5xx automatique (backoff + Idempotency-Key réutilisée entre tentatives).

Async

certifyAsync
avepay.mcf("EL02000015-1")
      .certifyAsync(invoice)
      .thenAccept(r -> System.out.println(r.sig()));

Webhooks

webhooks().verify
var event = avepay.webhooks().verify(rawBody, signatureHeader);
// event.type : "cert.issued" | "mcf.connected" | "mcf.disconnected"
© 2026 AvePay — AvePlus. Tous droits réservés.