> ## Documentation Index
> Fetch the complete documentation index at: https://developers.ligdicash.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Claude Code

> Configurer Claude Code pour générer du code d'intégration LigdiCash correct dès le premier essai

Claude Code est l'outil CLI d'Anthropic. En ajoutant un fichier `CLAUDE.md` à la racine de votre projet, vous lui transmettez le contexte LigdiCash une seule fois — il respectera ensuite les conventions API dans chaque réponse.

## Skill LigdiCash

<Card title="Skill LigdiCash pour Claude Code" icon="brain-circuit" color="#e11d48" href="/sdk/skill-ia">
  Installez le skill pour que Claude Code connaisse l'API LigdiCash dès le départ — téléchargement ZIP, installation via `npx skills` et prompts prêts à l'emploi.
</Card>

## Pré-requis

* [Claude Code installé](https://docs.anthropic.com/fr/claude-code) (`npm install -g @anthropic-ai/claude-code`)
* Un abonnement Claude Pro, Max ou un accès API Anthropic

## Fichier `CLAUDE.md` à créer

Créez un fichier `CLAUDE.md` à la racine de votre projet avec le contenu suivant :

````markdown theme={null}
# Intégration LigdiCash

## Contexte

LigdiCash est un agrégateur de paiement mobile money en Afrique de l'Ouest.
API base URL : https://app.ligdicash.com

## Headers obligatoires sur chaque requête

```
Apikey: {API_KEY}
Authorization: Bearer {AUTH_TOKEN}
Accept: application/json
Content-Type: application/json
```

## Format des données

- Numéros de téléphone : format E.164 sans `+` ni espaces — ex. `22670000000`
- Montants : entiers (XOF n'a pas de décimales) — ex. `5000`
- Devise : `XOF` exclusivement
- Clés API dans les exemples : toujours `{API_KEY}` et `{AUTH_TOKEN}`, jamais de vraies valeurs

## Règle d'or — identification des transactions

Le `token` retourné à la création est différent du `token` reçu dans le callback.
Ne jamais utiliser ce token pour identifier une transaction.

Toujours passer un identifiant marchand dans `custom_data` à la création :
```json
"custom_data": { "transaction_id": "ORD-2025-00042" }
```

Dans le callback, `custom_data` revient sous forme de tableau d'objets. LigdiCash y ajoute ses propres champs (`hash`, `logfile`). Extraire avec :
```javascript
const entry = custom_data.find(e => e.keyof_customdata === "transaction_id");
const transactionId = entry?.valueof_customdata;
```

## Payin avec redirection — pièges

- `customer` doit rester `""` — sinon LigdiCash filtre les opérateurs visibles
- Ne jamais ouvrir l'URL de paiement dans un `<iframe>` — utiliser le même onglet, un nouvel onglet, un popup ou une WebView native
- Popup : ouvrir `about:blank` avant le `await fetch`, puis naviguer après réception de l'URL

## Callback

- LigdiCash envoie deux POST : un `application/x-www-form-urlencoded` + un `application/json`. Dédupliquer.
- Re-vérifier chaque callback en appelant l'endpoint `confirm` avec le token stocké à la création. Ne jamais faire confiance au payload reçu.
````

## Prompts prêts à l'emploi

Copiez-collez ces messages dans Claude Code pour les cas d'usage les plus fréquents.

<AccordionGroup>
  <Accordion title="Payin avec redirection (checkout-invoice)">
    ```
    Implémente un payin LigdiCash avec redirection en [langage].

    - Endpoint : POST https://app.ligdicash.com/pay/v01/redirect/checkout-invoice/create
    - Montant : variable (paramètre de la fonction)
    - customer doit rester "" (vide)
    - Passer transaction_id dans custom_data (objet) : { "transaction_id": "..." }
    - Ouvrir l'URL retournée dans un nouvel onglet (pas d'iframe)
    - Gérer les erreurs HTTP et les response_code != "00"

    Retourner l'URL de paiement ou lever une exception.
    ```
  </Accordion>

  <Accordion title="Handler de callback sécurisé">
    ```
    Écris un handler de callback LigdiCash en [langage/framework].

    Comportement requis :
    1. Accepter POST en application/json ET application/x-www-form-urlencoded
    2. Dédupliquer par token (idempotence)
    3. Re-vérifier le statut en appelant l'endpoint confirm avec le token stocké en base
    4. custom_data dans le callback est un tableau d'objets — extraire via keyof_customdata === "transaction_id"
    5. Mettre à jour la commande en base seulement si le statut confirm est "00"
    ```
  </Accordion>

  <Accordion title="Payout vers mobile money">
    ```
    Implémente un payout LigdiCash direct vers mobile money en [langage].

    - Endpoint : POST https://app.ligdicash.com/pay/v01/straight/payout
    - Paramètres : montant, numéro de téléphone (format 22670XXXXXXX), description
    - Passer transaction_id dans custom_data (objet) : { "transaction_id": "..." }
    - Gérer les erreurs et logger la wiki URL en cas d'échec
    ```
  </Accordion>

  <Accordion title="Payin sans redirection (OTP USSD)">
    ```
    Implémente un payin LigdiCash sans redirection (mode OTP USSD) en [langage].

    - Endpoint : POST https://app.ligdicash.com/pay/v01/straight/checkout-invoice/create
    - external_id doit rester "" (vide)
    - L'utilisateur génère son OTP via le menu USSD de son opérateur AVANT la soumission
    - Passer transaction_id dans custom_data (objet) : { "transaction_id": "..." }
    - La confirmation définitive passe par le callback (ne pas implémenter de polling)
    ```
  </Accordion>
</AccordionGroup>

## Bonnes pratiques

<Tip>
  Lancez `claude` à la racine de votre projet — Claude Code lit automatiquement `CLAUDE.md` au démarrage et connaît d'emblée les conventions LigdiCash.
</Tip>
