> ## 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.

# Cursor

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

Cursor peut générer du code d'intégration LigdiCash en quelques secondes. En ajoutant un fichier de règles à votre projet, vous lui transmettez les conventions de l'API une seule fois.

## Skill LigdiCash

<Card title="Skill LigdiCash — téléchargement et installation" icon="brain-circuit" color="#e11d48" href="/sdk/skill-ia">
  Téléchargez le ZIP ou installez via `npx skills`. Les fichiers `references/` peuvent être glissés directement dans le chat Cursor comme contexte de session.
</Card>

## Pré-requis

* [Cursor](https://cursor.sh) installé
* Accès au projet à intégrer

## Fichier de règles à créer

Cursor supporte deux emplacements pour les règles de projet :

* **Cursor ≥ 0.45** : créez `.cursor/rules/ligdicash.mdc` à la racine
* **Ancienne version** : créez `.cursorrules` à la racine

Ajoutez 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

## 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

Utilisez ces prompts dans le chat Cursor (Cmd+L ou Ctrl+L).

<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>
</AccordionGroup>

<Tip>
  Activez **Codebase indexing** dans les paramètres Cursor pour qu'il analyse automatiquement vos fichiers existants et génère du code cohérent avec votre architecture.
</Tip>
