Créer un paiement sécurisé
curl --request POST \
--url https://api.example.com/v1/secure-ordersimport requests
url = "https://api.example.com/v1/secure-orders"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://api.example.com/v1/secure-orders', 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://api.example.com/v1/secure-orders",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v1/secure-orders"
req, _ := http.NewRequest("POST", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/v1/secure-orders")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/secure-orders")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
response = http.request(request)
puts response.read_bodySecure Orders
Créer un paiement sécurisé
Créer une commande dont le paiement reste bloqué jusqu’à la livraison
POST
/
v1
/
secure-orders
Créer un paiement sécurisé
curl --request POST \
--url https://api.example.com/v1/secure-ordersimport requests
url = "https://api.example.com/v1/secure-orders"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://api.example.com/v1/secure-orders', 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://api.example.com/v1/secure-orders",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v1/secure-orders"
req, _ := http.NewRequest("POST", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/v1/secure-orders")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/secure-orders")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
response = http.request(request)
puts response.read_bodyCréer un paiement sécurisé
Pilote sur activation :
404 SECURE_ORDERS_DISABLED si le service n’est pas ouvert pour votre compte.
Voir le guide.Endpoint
POST /v1/secure-orders
Headers
| Header | Requis | Description |
|---|---|---|
Authorization | ✅ | Bearer sk_xxx |
X-Idempotency-Key | Recommandé | Rejeu sûr de la création |
Body
| Paramètre | Type | Requis | Description |
|---|---|---|---|
amount | integer | ✅ | Montant en XOF (100 à 10 000 000) |
description | string | ✅ | Description visible par l’acheteur (2 à 200 caractères) |
customer_phone | string | ✅ | Téléphone de l’acheteur, 8 à 15 chiffres, + initial optionnel |
customer_name | string | Nom de l’acheteur (100 caractères max) | |
delivery_deadline_hours | integer | Délai de livraison après paiement, 1 à 720 (défaut 72) | |
client_reference | string | Votre référence de commande (64 caractères max) |
Exemple
curl -X POST https://api.sahelpay.ml/v1/secure-orders \
-H "Authorization: Bearer sk_test_xxx" \
-H "Content-Type: application/json" \
-H "X-Idempotency-Key: order-778" \
-d '{
"amount": 15000,
"description": "Robe wax taille M",
"customer_phone": "+22370000000",
"delivery_deadline_hours": 48,
"client_reference": "order-778"
}'
Réponse
201 Created, data = objet paiement sécurisé :
{
"success": true,
"data": {
"id": "5f0c2c55-...",
"reference": "...",
"status": "CREATED",
"is_test": true,
"amount": 15000,
"currency": "XOF",
"amount_charged": 15000,
"fee_total": 0,
"amount_merchant_net": null,
"description": "Robe wax taille M",
"customer_phone": "+22370000000",
"client_reference": "order-778",
"payment_intent_id": null,
"payment_status": null,
"buyer_url": "https://app.sahelpay.ml/securise/<token>",
"delivery_url": "https://app.sahelpay.ml/livraison/<token>",
"delivery_window_hours": 48,
"pay_before": "2026-10-10T10:00:00.000Z",
"delivery_deadline": null,
"code_attempts_remaining": 5,
"code_locked": false,
"created_at": "2026-10-03T10:00:00.000Z"
}
}
- Envoyez
buyer_urlà l’acheteur : il y paie et retrouve son code après paiement. - Envoyez
delivery_urlau livreur : il y saisit le code de l’acheteur.
Erreurs
| HTTP | Code | Cause |
|---|---|---|
400 | — | Champ invalide |
404 | SECURE_ORDERS_DISABLED | Service non activé pour votre compte |
409 | IDEMPOTENCY_CONFLICT | Clé déjà utilisée pour une autre commande (montant, téléphone ou description différents) |