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_bodyPaiement sécurisé
Paiement sécurisé
Paiement à la livraison : fonds en séquestre jusqu’au code de l’acheteur
POST
/
v1
/
secure-orders
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_bodyPaiement sécurisé
L’acheteur paie à la commande ; les fonds restent en séquestre jusqu’à ce que le livreur saisisse le code à 6 chiffres remis à l’acheteur. Fonction activée par marchand, sur demande : sans activation, l’API répond404 SECURE_ORDERS_DISABLED.
Créer une commande
POST /v1/secure-orders
| Paramètre | Type | Requis | Description |
|---|---|---|---|
amount | integer | ✅ | Montant en XOF, 100 à 10 000 000 |
description | string | ✅ | Visible par l’acheteur, 2 à 200 caractères |
customer_phone | string | ✅ | Téléphone de l’acheteur (8 à 15 chiffres) |
customer_name | string | Nom de l’acheteur | |
delivery_deadline_hours | integer | Délai de livraison après paiement, 1 à 720 h (défaut 72) | |
client_reference | string | Votre référence de commande (64 caractères max) |
X-Idempotency-Key : rejouer la même clé renvoie la même commande. Limite : 20 créations par minute.
curl -X POST https://api.sahelpay.ml/v1/secure-orders \
-H "Authorization: Bearer sk_test_xxx" \
-H "X-Idempotency-Key: order-9" \
-H "Content-Type: application/json" \
-d '{ "amount": 15000, "description": "Robe wax taille M", "customer_phone": "+22370000000" }'
buyer_url (page de paiement de l’acheteur) et delivery_url (page du livreur).
Autres routes
| Endpoint | Méthode | Description |
|---|---|---|
/v1/secure-orders | GET | Lister (status, search, page, limit) |
/v1/secure-orders/{id} | GET | Détail |
/v1/secure-orders/{id}/cancel | POST | Annuler avant paiement (reason facultatif) |
/v1/secure-orders/{id}/confirm-delivery | POST | { "code": "482913" } : confirme la livraison et libère les fonds |
CREATED → PAID_HELD → RELEASED, ou REFUNDED / DISPUTED / CANCELLED. Après 5 codes erronés, la confirmation est bloquée (429).
Webhooks
secure_order.paid, secure_order.released, secure_order.refunded, secure_order.disputed, secure_order.cancelled.
SDKs
secureOrders.create() / list() / retrieve() / cancel() / confirmDelivery() (JS), secureOrders->create() / all() / get() / cancel() / confirmDelivery() (PHP), secure_orders.create() / list() / retrieve() / cancel() / confirm_delivery() (Python).