Comment ça marche
De la clé d'API à des livres réconciliés en cinq étapes.
WalletD est une API REST devant un registre de référence. Voici le chemin que suit un paiement unique, de l'intégration d'un utilisateur à un mouvement que vos auditeurs peuvent recalculer.
Comment ça marche
La forme d'une intégration
1. Reflétez votre utilisateur
Créez un utilisateur de portefeuille avec votre propre id externe. WalletD ouvre des comptes par finalité (espèces, points) la première fois que chacun est utilisé, il n'y a donc rien à provisionner au préalable.
2. Alimentez le portefeuille
Démarrez un rechargement via Stripe. Le solde n'est crédité que lorsque la passerelle confirme par un webhook signé ou une requête de réconciliation, jamais sur un rappel client.
3. Déplacez l'argent
Envoyez en pair-à-pair, prenez un paiement avec un blocage, ou répartissez une vente sur la marketplace. Chaque appel porte une clé d'idempotence et inscrit des lignes équilibrées dans le registre en une seule transaction.
4. Récompenses et règlement suivent
Le cashback et les points sont octroyés au moment de la capture ; les frais et la commission sont répartis ; les versements produisent un relevé de règlement. Tout cela est inscrit dans les mêmes livres.
5. Lisez et vérifiez
Lisez les soldes et l'historique via l'API, recevez des webhooks signés pour chaque événement, et laissez le vérificateur intégré recontrôler les invariants du registre selon un calendrier.
Alimentez un portefeuille, puis envoyez de l'argent
Alimentez un portefeuille, puis envoyez de l'argent
La même requête dans six langages. Les montants sont des unités mineures entières ; le registre s'occupe du reste.
# Fund a wallet, then send money. Balances only move on the ledger.
curl -sS -X POST "$WALLETD_API/v1/users" \
-H "Authorization: Bearer $WALLETD_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: usr-42-create" \
-d '{"external_id":"user-42","kind":"consumer","display_name":"Ada Lovelace","handle":"ada"}'
curl -sS -X POST "$WALLETD_API/v1/transfers" \
-H "Authorization: Bearer $WALLETD_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: xfer-ada-grace-001" \
-d '{"from":"user-42","to":"@grace","amount":2500,"currency":"USD"}'client := walletd.New(os.Getenv("WALLETD_API"), os.Getenv("WALLETD_API_KEY"))
var transfer walletd.Transfer
err := client.Do(ctx, http.MethodPost, "/v1/transfers", map[string]any{
"from": "user-42",
"to": "@grace",
"amount": 2500, // minor units, $25.00, never a float
"currency": "USD",
}, &transfer, "xfer-ada-grace-001") // idempotency key
if err != nil {
return fmt.Errorf("transfer: %w", err)
}client = WalletD() # reads WALLETD_API / WALLETD_API_KEY
transfer = client.request(
"POST",
"/v1/transfers",
{
"from": "user-42",
"to": "@grace",
"amount": 2500, # minor units, $25.00
"currency": "USD",
},
idempotency_key="xfer-ada-grace-001",
)
print(transfer["status"]) # "settled"const res = await fetch(`${API}/v1/transfers`, {
method: "POST",
headers: {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": "xfer-ada-grace-001",
},
body: JSON.stringify({
from: "user-42",
to: "@grace",
amount: 2500, // minor units, $25.00
currency: "USD",
}),
});
const transfer = await res.json();$transfer = $walletd->request('POST', '/v1/transfers', [
'from' => 'user-42',
'to' => '@grace',
'amount' => 2500, // minor units, $25.00
'currency' => 'USD',
], idempotencyKey: 'xfer-ada-grace-001');
echo $transfer['status']; // "settled"var body = Map.of(
"from", "user-42",
"to", "@grace",
"amount", 2500, // minor units, $25.00
"currency", "USD");
Transfer transfer = client.post(
"/v1/transfers", body, "xfer-ada-grace-001", Transfer.class);Des principes qui tiennent à chaque étape
Idempotent par défaut
Chaque appel de mouvement d'argent prend une clé d'idempotence. Les nouvelles tentatives sont sûres ; le registre rejoue le résultat stocké octet par octet.
Équilibré en une seule transaction
Frais, blocages, plafonds et reprises sont appliqués à l'intérieur de la même écriture, si bien que les livres ne sont jamais brièvement faux.
Confirmé, pas supposé
L'argent bouge sur confirmation vérifiée de la passerelle et se règle dans le registre, pas sur une réponse client optimiste.
Vérifié en continu
Un vérificateur planifié recalcule la conservation, les soldes et les planchers, et échoue bruyamment dès que quoi que ce soit dérive.
Accès anticipé
Devenez partenaire de conception.
Nous travaillons avec un petit nombre d'équipes qui construisent des produits de portefeuille et de paiement sur WalletD. Si c'est votre cas, parlons-en. Vous aurez un accès direct aux personnes qui l'ont conçu.