curl --request POST \
--url https://i-pay.money/api/v1/payments \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Ipay-Payment-Type: <ipay-payment-type>' \
--header 'Ipay-Target-Environment: <ipay-target-environment>' \
--data '
{
"amount": 1000,
"country": "NE",
"currency": "XOF",
"msisdn": "40410000000",
"transaction_id": "ORDER-SANDBOX-001",
"customer_name": "Client Test"
}
'const options = {
method: 'POST',
headers: {
'Ipay-Target-Environment': '<ipay-target-environment>',
'Ipay-Payment-Type': '<ipay-payment-type>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
amount: 1000,
country: 'NE',
currency: 'XOF',
msisdn: '40410000000',
transaction_id: 'ORDER-SANDBOX-001',
customer_name: 'Client Test'
})
};
fetch('https://i-pay.money/api/v1/payments', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://i-pay.money/api/v1/payments"
payload = {
"amount": 1000,
"country": "NE",
"currency": "XOF",
"msisdn": "40410000000",
"transaction_id": "ORDER-SANDBOX-001",
"customer_name": "Client Test"
}
headers = {
"Ipay-Target-Environment": "<ipay-target-environment>",
"Ipay-Payment-Type": "<ipay-payment-type>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://i-pay.money/api/v1/payments",
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([
'amount' => 1000,
'country' => 'NE',
'currency' => 'XOF',
'msisdn' => '40410000000',
'transaction_id' => 'ORDER-SANDBOX-001',
'customer_name' => 'Client Test'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Ipay-Payment-Type: <ipay-payment-type>",
"Ipay-Target-Environment: <ipay-target-environment>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}require 'uri'
require 'net/http'
url = URI("https://i-pay.money/api/v1/payments")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Ipay-Target-Environment"] = '<ipay-target-environment>'
request["Ipay-Payment-Type"] = '<ipay-payment-type>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amount\": 1000,\n \"country\": \"NE\",\n \"currency\": \"XOF\",\n \"msisdn\": \"40410000000\",\n \"transaction_id\": \"ORDER-SANDBOX-001\",\n \"customer_name\": \"Client Test\"\n}"
response = http.request(request)
puts response.read_bodyHttpResponse<String> response = Unirest.post("https://i-pay.money/api/v1/payments")
.header("Ipay-Target-Environment", "<ipay-target-environment>")
.header("Ipay-Payment-Type", "<ipay-payment-type>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": 1000,\n \"country\": \"NE\",\n \"currency\": \"XOF\",\n \"msisdn\": \"40410000000\",\n \"transaction_id\": \"ORDER-SANDBOX-001\",\n \"customer_name\": \"Client Test\"\n}")
.asString();Créer une transaction
Enregistrez une demande de paiement mobile money et récupérez les références à conserver.
curl --request POST \
--url https://i-pay.money/api/v1/payments \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Ipay-Payment-Type: <ipay-payment-type>' \
--header 'Ipay-Target-Environment: <ipay-target-environment>' \
--data '
{
"amount": 1000,
"country": "NE",
"currency": "XOF",
"msisdn": "40410000000",
"transaction_id": "ORDER-SANDBOX-001",
"customer_name": "Client Test"
}
'const options = {
method: 'POST',
headers: {
'Ipay-Target-Environment': '<ipay-target-environment>',
'Ipay-Payment-Type': '<ipay-payment-type>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
amount: 1000,
country: 'NE',
currency: 'XOF',
msisdn: '40410000000',
transaction_id: 'ORDER-SANDBOX-001',
customer_name: 'Client Test'
})
};
fetch('https://i-pay.money/api/v1/payments', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://i-pay.money/api/v1/payments"
payload = {
"amount": 1000,
"country": "NE",
"currency": "XOF",
"msisdn": "40410000000",
"transaction_id": "ORDER-SANDBOX-001",
"customer_name": "Client Test"
}
headers = {
"Ipay-Target-Environment": "<ipay-target-environment>",
"Ipay-Payment-Type": "<ipay-payment-type>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://i-pay.money/api/v1/payments",
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([
'amount' => 1000,
'country' => 'NE',
'currency' => 'XOF',
'msisdn' => '40410000000',
'transaction_id' => 'ORDER-SANDBOX-001',
'customer_name' => 'Client Test'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Ipay-Payment-Type: <ipay-payment-type>",
"Ipay-Target-Environment: <ipay-target-environment>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}require 'uri'
require 'net/http'
url = URI("https://i-pay.money/api/v1/payments")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Ipay-Target-Environment"] = '<ipay-target-environment>'
request["Ipay-Payment-Type"] = '<ipay-payment-type>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amount\": 1000,\n \"country\": \"NE\",\n \"currency\": \"XOF\",\n \"msisdn\": \"40410000000\",\n \"transaction_id\": \"ORDER-SANDBOX-001\",\n \"customer_name\": \"Client Test\"\n}"
response = http.request(request)
puts response.read_bodyHttpResponse<String> response = Unirest.post("https://i-pay.money/api/v1/payments")
.header("Ipay-Target-Environment", "<ipay-target-environment>")
.header("Ipay-Payment-Type", "<ipay-payment-type>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": 1000,\n \"country\": \"NE\",\n \"currency\": \"XOF\",\n \"msisdn\": \"40410000000\",\n \"transaction_id\": \"ORDER-SANDBOX-001\",\n \"customer_name\": \"Client Test\"\n}")
.asString();Ipay-Payment-Type: mobile (mobile money) ; les autres moyens de paiement passent par les liens de paiement. La liste des moyens est dans Reversement et frais.
- Compte validé. Le compte doit être validé pour l’environnement ciblé, sinon l’API répond
403sans créer de transaction. - Environnements. Sandbox et Live sont deux comptes distincts, avec des clés distinctes : une clé Sandbox utilisée avec
Ipay-Target-Environment: liveest refusée, et inversement. Voir Authentification. transaction_id. C’est votre propre référence de commande, unique pour votre compte. Vous la retrouverez sous le nomexternal_reference, et elle est acceptée comme identifiant par Consulter une transaction.- Montant minimum.
25XOF en Live pourmobile. Le minimum diffère en Sandbox : voir Sandbox et tests. - Références à conserver.
referenceest l’identifiant iMoney Encaissement de la transaction, accepté par les opérations de consultation.public_referenceest la référence affichable à votre client.
Doublons et idempotence
Il n’existe pas d’en-tête de clé d’idempotence. La création applique une détection de doublon au niveau applicatif surexternal_reference, c’est-à-dire sur le transaction_id que vous envoyez. En Live, un second appel avec la même valeur reçoit 422 ({"status": "failed", "message": "External Reference Not Valid"}) et ne crée pas de seconde transaction. En Sandbox, la forme de la réponse à un doublon n’est pas garantie identique à celle du Live : à confirmer auprès du support avant d’en faire une assertion de test automatisé.
transaction_id peuvent toutes les deux réussir. Générez un transaction_id unique par tentative, et vérifiez le statut avec Consulter une transaction avant de retenter une transaction dont vous n’avez pas reçu la réponse.Limites
Aucune limite de débit n’est documentée pour cette opération : à confirmer auprès du support avant un envoi massif. Les messages d’erreur communs à toutes les opérations sont regroupés dans Erreurs.Authorizations
Clé secrète du compte Sandbox ou Live
Headers
sandbox, live Méthode de paiement. POST /payments ne prend en charge que mobile (mobile money). Les autres moyens de paiement (carte bancaire et autres canaux) ne s'utilisent pas ici : ils sont disponibles via les liens de paiement (POST /external_payments). Liste complète : moyens de paiement.
"mobile""mobile"
Body
Corps requis pour créer un paiement mobile money (Ipay-Payment-Type: mobile). Le montant minimum est de 25 XOF (50 XOF en Sandbox). En dessous, l'API répond 400 Bad Request: Amount Not Valid. Pour les autres moyens de paiement, utilisez les liens de paiement.
Montant à débiter, en XOF (entier). Minimum : 25 XOF en Live, 50 XOF en Sandbox.
x >= 251000
NE, BJ "NE"
"XOF""40410000000"
Référence unique dans le compte
