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).
dependencies {
implementation("net.avepay:mcf:0.1.0")
}<dependency>
<groupId>net.avepay</groupId>
<artifactId>mcf</artifactId>
<version>0.1.0</version>
</dependency>Certifier une facture
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)
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
McfInfo info = avepay.mcf("EL02000015-1").info();
avepay.mcf("EL02000015-1").cancelPending();
JsonObject me = avepay.me();Gestion d'erreurs
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
avepay.mcf("EL02000015-1")
.certifyAsync(invoice)
.thenAccept(r -> System.out.println(r.sig()));Webhooks
var event = avepay.webhooks().verify(rawBody, signatureHeader);
// event.type : "cert.issued" | "mcf.connected" | "mcf.disconnected"