curl --request POST \
--url https://egimgarsud.gimpayapp.com/api/v1/operations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'requestId: <requestid>' \
--data '
{
"libelle": "Paiement facture électricité",
"montant": 15000,
"refInstrumentPaiementInitiateur": "<string>",
"refService": "<string>",
"refContributeurBeneficiaire": "<string>",
"refInstrumentPaiementBeneficiaire": "<string>",
"msisdnBeneficiaire": "<string>",
"panBeneficiaire": "<string>",
"compteBeneficiaire": "<string>",
"codeClientBeneficiaire": "<string>",
"refContributeurInitiateur": "<string>",
"authData": "<string>",
"callbackUrl": "<string>"
}
'import requests
url = "https://egimgarsud.gimpayapp.com/api/v1/operations"
payload = {
"libelle": "Paiement facture électricité",
"montant": 15000,
"refInstrumentPaiementInitiateur": "<string>",
"refService": "<string>",
"refContributeurBeneficiaire": "<string>",
"refInstrumentPaiementBeneficiaire": "<string>",
"msisdnBeneficiaire": "<string>",
"panBeneficiaire": "<string>",
"compteBeneficiaire": "<string>",
"codeClientBeneficiaire": "<string>",
"refContributeurInitiateur": "<string>",
"authData": "<string>",
"callbackUrl": "<string>"
}
headers = {
"requestId": "<requestid>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
requestId: '<requestid>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
libelle: 'Paiement facture électricité',
montant: 15000,
refInstrumentPaiementInitiateur: '<string>',
refService: '<string>',
refContributeurBeneficiaire: '<string>',
refInstrumentPaiementBeneficiaire: '<string>',
msisdnBeneficiaire: '<string>',
panBeneficiaire: '<string>',
compteBeneficiaire: '<string>',
codeClientBeneficiaire: '<string>',
refContributeurInitiateur: '<string>',
authData: '<string>',
callbackUrl: '<string>'
})
};
fetch('https://egimgarsud.gimpayapp.com/api/v1/operations', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://egimgarsud.gimpayapp.com/api/v1/operations",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'libelle' => 'Paiement facture électricité',
'montant' => 15000,
'refInstrumentPaiementInitiateur' => '<string>',
'refService' => '<string>',
'refContributeurBeneficiaire' => '<string>',
'refInstrumentPaiementBeneficiaire' => '<string>',
'msisdnBeneficiaire' => '<string>',
'panBeneficiaire' => '<string>',
'compteBeneficiaire' => '<string>',
'codeClientBeneficiaire' => '<string>',
'refContributeurInitiateur' => '<string>',
'authData' => '<string>',
'callbackUrl' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"requestId: <requestid>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://egimgarsud.gimpayapp.com/api/v1/operations"
payload := strings.NewReader("{\n \"libelle\": \"Paiement facture électricité\",\n \"montant\": 15000,\n \"refInstrumentPaiementInitiateur\": \"<string>\",\n \"refService\": \"<string>\",\n \"refContributeurBeneficiaire\": \"<string>\",\n \"refInstrumentPaiementBeneficiaire\": \"<string>\",\n \"msisdnBeneficiaire\": \"<string>\",\n \"panBeneficiaire\": \"<string>\",\n \"compteBeneficiaire\": \"<string>\",\n \"codeClientBeneficiaire\": \"<string>\",\n \"refContributeurInitiateur\": \"<string>\",\n \"authData\": \"<string>\",\n \"callbackUrl\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("requestId", "<requestid>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://egimgarsud.gimpayapp.com/api/v1/operations")
.header("requestId", "<requestid>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"libelle\": \"Paiement facture électricité\",\n \"montant\": 15000,\n \"refInstrumentPaiementInitiateur\": \"<string>\",\n \"refService\": \"<string>\",\n \"refContributeurBeneficiaire\": \"<string>\",\n \"refInstrumentPaiementBeneficiaire\": \"<string>\",\n \"msisdnBeneficiaire\": \"<string>\",\n \"panBeneficiaire\": \"<string>\",\n \"compteBeneficiaire\": \"<string>\",\n \"codeClientBeneficiaire\": \"<string>\",\n \"refContributeurInitiateur\": \"<string>\",\n \"authData\": \"<string>\",\n \"callbackUrl\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://egimgarsud.gimpayapp.com/api/v1/operations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["requestId"] = '<requestid>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"libelle\": \"Paiement facture électricité\",\n \"montant\": 15000,\n \"refInstrumentPaiementInitiateur\": \"<string>\",\n \"refService\": \"<string>\",\n \"refContributeurBeneficiaire\": \"<string>\",\n \"refInstrumentPaiementBeneficiaire\": \"<string>\",\n \"msisdnBeneficiaire\": \"<string>\",\n \"panBeneficiaire\": \"<string>\",\n \"compteBeneficiaire\": \"<string>\",\n \"codeClientBeneficiaire\": \"<string>\",\n \"refContributeurInitiateur\": \"<string>\",\n \"authData\": \"<string>\",\n \"callbackUrl\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"message": "<string>",
"status": 123,
"timestamp": "2023-11-07T05:31:56Z",
"body": {
"referenceOperation": "<string>",
"dateHeureOperation": "2023-11-07T05:31:56Z",
"dateHeureAnnulationOperation": "2023-11-07T05:31:56Z",
"libelleOperation": "<string>",
"montantHToperation": 123,
"montantHTfraisOperation": 123,
"montantADebiter": 123,
"montantACrediter": 123,
"montantTotalOperation": 123,
"typeOperation": "P2P",
"natureOperation": "A2A",
"statutOperation": "INITIEE",
"refUsagerInitiateur": "<string>",
"typeInstrumentPaiementDebite": "COMPTE_BANCAIRE",
"identifiantInstrumentPaiementDebite": "<string>",
"refUsagerBeneficiaire": "<string>",
"typeInstrumentPaiementCredite": "COMPTE_BANCAIRE",
"identifiantInstrumentPaiementCredite": "<string>",
"refContributeurInitiateur": "<string>",
"refContributeurBeneficiaire": "<string>",
"dateDernierStatut": "2023-11-07T05:31:56Z",
"refService": "<string>",
"raisonEchec": "<string>"
}
}{
"message": "<string>",
"status": 123,
"timestamp": "2023-11-07T05:31:56Z",
"body": null
}{
"message": "<string>",
"status": 123,
"timestamp": "2023-11-07T05:31:56Z",
"body": null
}{
"message": "<string>",
"status": 123,
"timestamp": "2023-11-07T05:31:56Z",
"body": null
}{
"message": "<string>",
"status": 123,
"timestamp": "2023-11-07T05:31:56Z",
"body": null
}Exécuter une opération
Exécuter une opération financière entre deux instruments de paiement de l’écosystème GIMpay.
curl --request POST \
--url https://egimgarsud.gimpayapp.com/api/v1/operations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'requestId: <requestid>' \
--data '
{
"libelle": "Paiement facture électricité",
"montant": 15000,
"refInstrumentPaiementInitiateur": "<string>",
"refService": "<string>",
"refContributeurBeneficiaire": "<string>",
"refInstrumentPaiementBeneficiaire": "<string>",
"msisdnBeneficiaire": "<string>",
"panBeneficiaire": "<string>",
"compteBeneficiaire": "<string>",
"codeClientBeneficiaire": "<string>",
"refContributeurInitiateur": "<string>",
"authData": "<string>",
"callbackUrl": "<string>"
}
'import requests
url = "https://egimgarsud.gimpayapp.com/api/v1/operations"
payload = {
"libelle": "Paiement facture électricité",
"montant": 15000,
"refInstrumentPaiementInitiateur": "<string>",
"refService": "<string>",
"refContributeurBeneficiaire": "<string>",
"refInstrumentPaiementBeneficiaire": "<string>",
"msisdnBeneficiaire": "<string>",
"panBeneficiaire": "<string>",
"compteBeneficiaire": "<string>",
"codeClientBeneficiaire": "<string>",
"refContributeurInitiateur": "<string>",
"authData": "<string>",
"callbackUrl": "<string>"
}
headers = {
"requestId": "<requestid>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
requestId: '<requestid>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
libelle: 'Paiement facture électricité',
montant: 15000,
refInstrumentPaiementInitiateur: '<string>',
refService: '<string>',
refContributeurBeneficiaire: '<string>',
refInstrumentPaiementBeneficiaire: '<string>',
msisdnBeneficiaire: '<string>',
panBeneficiaire: '<string>',
compteBeneficiaire: '<string>',
codeClientBeneficiaire: '<string>',
refContributeurInitiateur: '<string>',
authData: '<string>',
callbackUrl: '<string>'
})
};
fetch('https://egimgarsud.gimpayapp.com/api/v1/operations', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://egimgarsud.gimpayapp.com/api/v1/operations",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'libelle' => 'Paiement facture électricité',
'montant' => 15000,
'refInstrumentPaiementInitiateur' => '<string>',
'refService' => '<string>',
'refContributeurBeneficiaire' => '<string>',
'refInstrumentPaiementBeneficiaire' => '<string>',
'msisdnBeneficiaire' => '<string>',
'panBeneficiaire' => '<string>',
'compteBeneficiaire' => '<string>',
'codeClientBeneficiaire' => '<string>',
'refContributeurInitiateur' => '<string>',
'authData' => '<string>',
'callbackUrl' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"requestId: <requestid>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://egimgarsud.gimpayapp.com/api/v1/operations"
payload := strings.NewReader("{\n \"libelle\": \"Paiement facture électricité\",\n \"montant\": 15000,\n \"refInstrumentPaiementInitiateur\": \"<string>\",\n \"refService\": \"<string>\",\n \"refContributeurBeneficiaire\": \"<string>\",\n \"refInstrumentPaiementBeneficiaire\": \"<string>\",\n \"msisdnBeneficiaire\": \"<string>\",\n \"panBeneficiaire\": \"<string>\",\n \"compteBeneficiaire\": \"<string>\",\n \"codeClientBeneficiaire\": \"<string>\",\n \"refContributeurInitiateur\": \"<string>\",\n \"authData\": \"<string>\",\n \"callbackUrl\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("requestId", "<requestid>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://egimgarsud.gimpayapp.com/api/v1/operations")
.header("requestId", "<requestid>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"libelle\": \"Paiement facture électricité\",\n \"montant\": 15000,\n \"refInstrumentPaiementInitiateur\": \"<string>\",\n \"refService\": \"<string>\",\n \"refContributeurBeneficiaire\": \"<string>\",\n \"refInstrumentPaiementBeneficiaire\": \"<string>\",\n \"msisdnBeneficiaire\": \"<string>\",\n \"panBeneficiaire\": \"<string>\",\n \"compteBeneficiaire\": \"<string>\",\n \"codeClientBeneficiaire\": \"<string>\",\n \"refContributeurInitiateur\": \"<string>\",\n \"authData\": \"<string>\",\n \"callbackUrl\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://egimgarsud.gimpayapp.com/api/v1/operations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["requestId"] = '<requestid>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"libelle\": \"Paiement facture électricité\",\n \"montant\": 15000,\n \"refInstrumentPaiementInitiateur\": \"<string>\",\n \"refService\": \"<string>\",\n \"refContributeurBeneficiaire\": \"<string>\",\n \"refInstrumentPaiementBeneficiaire\": \"<string>\",\n \"msisdnBeneficiaire\": \"<string>\",\n \"panBeneficiaire\": \"<string>\",\n \"compteBeneficiaire\": \"<string>\",\n \"codeClientBeneficiaire\": \"<string>\",\n \"refContributeurInitiateur\": \"<string>\",\n \"authData\": \"<string>\",\n \"callbackUrl\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"message": "<string>",
"status": 123,
"timestamp": "2023-11-07T05:31:56Z",
"body": {
"referenceOperation": "<string>",
"dateHeureOperation": "2023-11-07T05:31:56Z",
"dateHeureAnnulationOperation": "2023-11-07T05:31:56Z",
"libelleOperation": "<string>",
"montantHToperation": 123,
"montantHTfraisOperation": 123,
"montantADebiter": 123,
"montantACrediter": 123,
"montantTotalOperation": 123,
"typeOperation": "P2P",
"natureOperation": "A2A",
"statutOperation": "INITIEE",
"refUsagerInitiateur": "<string>",
"typeInstrumentPaiementDebite": "COMPTE_BANCAIRE",
"identifiantInstrumentPaiementDebite": "<string>",
"refUsagerBeneficiaire": "<string>",
"typeInstrumentPaiementCredite": "COMPTE_BANCAIRE",
"identifiantInstrumentPaiementCredite": "<string>",
"refContributeurInitiateur": "<string>",
"refContributeurBeneficiaire": "<string>",
"dateDernierStatut": "2023-11-07T05:31:56Z",
"refService": "<string>",
"raisonEchec": "<string>"
}
}{
"message": "<string>",
"status": 123,
"timestamp": "2023-11-07T05:31:56Z",
"body": null
}{
"message": "<string>",
"status": 123,
"timestamp": "2023-11-07T05:31:56Z",
"body": null
}{
"message": "<string>",
"status": 123,
"timestamp": "2023-11-07T05:31:56Z",
"body": null
}{
"message": "<string>",
"status": 123,
"timestamp": "2023-11-07T05:31:56Z",
"body": null
}Avant d’appeler
Générez une clé d'idempotence
requestId est obligatoire : une chaîne unique par opération, à vous de la générer (par exemple un UUID). Voir la section dédiée ci-dessous.Vérifiez le solde de l'initiateur
GET /wallets/{referenceWallet}/balance — le solde doit couvrir le montant et les frais si le mode d’application est ADDITION.Calculez les frais
GET /services/{referenceService}/fees vous donne montantFrais et surtout modeApplication, qui change le montant à envoyer ici.Obtenez puis validez un OTP
authData.Le header requestId : clé anti-doublon
Chaque appel doit porter un header requestId unique, propre à cette tentative d’opération. GIMpay s’en sert pour détecter les rejeux : si vous réutilisez un requestId déjà accepté, l’appel échoue avec un 409.
409 sur cet endpoint ne signifie pas que l’opération a échoué : il signifie que ce requestId a déjà été traité. Ne le réessayez pas avec un nouveau requestId sans d’abord vérifier le statut de l’opération d’origine (par exemple via GET /wallets/{referenceWallet}/operations), sous peine de débiter l’initiateur deux fois pour la même intention métier.Montant et frais : la subtilité à connaître
Le champmontant correspond au montant à débiter hors frais lorsque le mode est ADDITION. Le comportement diffère selon ce que retourne le calcul de frais :
modeApplication | Ce que vous envoyez dans montant | Ce qui est débité | Ce que reçoit le bénéficiaire |
|---|---|---|---|
ADDITION | Le montant net souhaité | montant + frais | montant |
SOUSTRACTION | Le montant total | montant | montant − frais |
ADDITION, le débit réel dépasse ce montant. Assurez-vous que le solde le couvre et que l’utilisateur en est informé avant validation.Désigner le bénéficiaire
Deux cas de figure, selon que le bénéficiaire est déjà connu de GIMpay ou non :- Bénéficiaire interne à GIMpay
- Bénéficiaire chez un contributeur tiers
refInstrumentPaiementBeneficiaire avec la référence GIMpay de son instrument de paiement.| Champ | Type d’instrument |
|---|---|
msidnBeneficiaire | Mobile wallet |
panBeneficiaire | Carte bancaire |
compteBeneficiaire | Compte bancaire |
codeClientBeneficiaire | Carte prépayée |
Points de vigilance
Un statut retourné ne signifie pas toujours « terminé »
Un statut retourné ne signifie pas toujours « terminé »
statutOperation peut valoir INITIEE, ENCOURS ou SUSPENDUE : l’opération n’est pas finalisée. Ne considérez comme définitifs que SUCCES, ECHOUE, ANNULEE et EXTOURNE. En cas d’échec, raisonEchec en donne le motif.Pour un suivi asynchrone, renseignez callbackUrl : GIMpay y notifiera l’évolution de l’état.Réponses
Le corps utile arrive dansbody, à l’intérieur de l’enveloppe commune { message, status, body, timestamp }. Consultez le glossaire pour les valeurs de statutOperation et natureOperation.
En cas d’erreur, un 400 signale une donnée incorrecte ou indisponible (solde insuffisant, OTP invalide…), un 404 une entité introuvable, un 409 un requestId déjà utilisé. Voir la référence des codes d’erreur.
Et ensuite ?
Annuler une opération
PUT /operations/{referenceOperation}/cancel pour extourner une opération.Consulter l'historique
GET /wallets/{referenceWallet}/operations et /movements.Authorizations
Jeton émis par POST /api/v1/auth/token.
Headers
Clé anti-doublon, unique par opération.
Body
Libellé de l'opération
"Paiement facture électricité"
Montant de l'opération
15000
Réference de l'instrument de paiement utilisé par l'initiateur de l'opération
P = particulier, B = business, G = gouvernement.
P2P, P2B, P2G, B2B, B2P, B2G, G2P, G2B La référence du service concerné par l'opération
La référence du contributeur émetteur de l'instrument de paiement du bénéficiaire
Réference de l'instrument de paiement utilisé par le bénéficiare de l'opération
Numéro mobile money du bénéficiaire (typo msisdn conforme au contrat).
Le numéro de carte bancaire du bénéficiaire
Le numéro de compte du bénéficiaire
Le code client du bénéficiaire
La référence du contributeur émetteur de l'instrument de paiement de l'initiateur
Donnée d'authentification (ex. OTP).
URL de callback pour l'opération