Effectuer un retrait via l'API REST (Java)
Vous pouvez utiliser nos APIs pour effectuer des retraits d'argent.
C'est l'objet de ce tutoriel, dans lequel nous allons vous présenter une approche simple pour intégrer les APIs de MOALA dans le but de faire une opération de retrait d'argent.
Prérequis
Avant de commencer, assurez-vous d'avoir les éléments suivants :
- Un compte sur le portail MOALA avec des permissions nécessaires pour effectuer des retraits. Vous pouvez obtenir un compte Moala en suivant les étapes précisées ici Obtenir les clés d'accès
- Un environnement de développement avec Java installé
- La bibliothèque
Apache HttpClientpour effectuer des requêtes HTTP
1. Authentification
L'API de MOALA requiert trois headers pour l'authentification et la sécurité des transactions :
- LP-ACCESS-KEY : votre clé d'accès à l'API de MOALA (obtenue sur le portail de MOALA)
- LP-ACCESS-TIMESTAMP : l'horodatage de la requête en secondes
- LP-ACCESS-SIGN : une signature générée en utilisant la clé secrète LP-ACCESS-KEY
La signature LP-ACCESS-SIGN est générée en utilisant l'algorithme HMAC-SHA256 sur une concaténation de la clé, du timestamp et du corps de la requête.
2. Effectuer le retrait
Nous allons à présent effectuer une opération de retrait d'argent en utilisant les APIs REST de MOALA.
Endpoint de l'opération de retrait
Pour effectuer une opération de retrait, vous devez utiliser l'endpoint ci-dessous, avec le serviceCode correspondant à l'opérateur à utiliser.
POST https://api.moala.africa/v1/api/transaction/payment
Les serviceCode autorisés pour cet endpoint sont les suivants :
- CASHOUT_MTN_CM: Cashout MTN Cameroun
- CASHOUT_ORANGE_CM: Cashout Orange Cameroun
- CASHOUT_AIRTEL_GA: Cashout Airtel Gabon
- CASHOUT_MOOV_GA: Cashout Airtel Gabon
- PAIEMENTMARCHAND_MTN_CM: Paiement marchand MTN Cameroun
- PAIEMENTMARCHAND_ORANGE_CM: Paiement marchand Orange Cameroun
- PAIEMENTMARCHAND_AIRTEL_GA: Paiement marchand Airtel Gabon
- PAIEMENTMARCHAND_MOOV_GA: Paiement marchand Moov Gabon
Corps de la requête
Ci-dessous sont présentés les champs requis dans le corps de la requête à envoyer :
| Champ | Type | Description |
|---|---|---|
transactionType | string | Type de transaction à effectuer (valeur fixe: deposit) |
amount | float | Montant à retirer |
serviceCode | string | Le code du service qui sera utilisé (voir liste des serviceCode) |
phoneNumber | string | Le numéro de téléphone duquel le retrait est effectué |
partnerId | string | L'identifiant du partenaire qui effectue le retrait |
Génération de la signature
Nous allons ensuite écrire une fonction qui sera utilisée pour calculer la signature de chaque requête qui sera envoyée vers le serveur.
La fonction generateSignature calcule la signature de la requête à envoyer.
// Génération de la signature de la requête
import org.apache.commons.codec.digest.HmacUtils;
public class Utils {
public static String generateSignature(String secretKey, String timestamp, String method, String endpoint, String payload) throws Exception {
// Construction du message a hasher
String message = timestamp + method + endpoint + payload;
// Calcul de la signature
String signature = HmacUtils.hmacSha256Hex(secretKey, message);
// Renvoi de la signature
return signature;
}
}
Envoi de la requête de retrait
A présent, nous allons construire et envoyer une requête via l'API de retrait.
import Utils;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import com.google.gson.Gson;
import java.time.Instant;
import java.util.HashMap;
import java.util.Map;
public class Withdrawal {
private static final String API_KEY = "votre_api_key";
private static final String SECRET_KEY = "votre_secret_key";
private static final String API_BASE_URL = "https://api.moala.africa";
public static void makeWithdrawal(Float amount, String serviceCode, String phoneNumber, String partnerId) {
try (CloseableHttpClient client = HttpClients.createDefault()) {
String endpoint = "/v1/api/transaction/payment";
String url = API_BASE_URL + endpoint;
// Récupération du timestamp
long timestamp = Instant.now().getEpochSecond();
// Construction du corps de la requête
Map body = new HashMap<>();
body.put("amount", amount);
body.put("transactionType", "withdrawal");
body.put("serviceCode", serviceCode);
body.put("phoneNumber", phoneNumber);
body.put("partnerId", partnerId);
String payload = new Gson().toJson(body);
// Construction des entêtes
String method = "POST";
String signature = Utils.generateSignature(SECRET_KEY, String.valueOf(timestamp), method, endpoint, payload);
HttpPost req = new HttpPost(API_URL);
req.setHeader("LP-ACCESS-KEY", API_KEY);
req.setHeader("LP-ACCESS-TIMESTAMP", String.valueOf(timestamp));
req.setHeader("LP-ACCESS-SIGN", signature);
req.setHeader("Content-Type", "application/json");
req.setEntity(payload);
CloseableHttpResponse response = client.execute(post);
System.out.println(EntityUtils.toString(response.getEntity()));
} catch (Exception e) {
e.printStackTrace();
}
}
}
Le champ partnerId doit être unique pour chaque transaction, sinon l'envoi de la requête va échouer.
3. Vérifier le statut de l'opération
Une fois que la requête de retrait a été envoyée, on peut vérifier le succès de l'opération en faisant un nouvel appel d'API.
Endpoint de vérification
L'endpoint ci-dessous permet de vérifier le statut de la transaction de retrait précédemment réalisée.
GET https://api.moala.africa/v1/api/transaction/check/{partnerId}
Envoi de la requête de vérification
import Utils;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.time.Instant;
public class StatusCheck {
private static final String API_KEY = "votre_api_key";
private static final String SECRET_KEY = "votre_secret_key";
private static final String API_BASE_URL = "https://api.moala.africa";
public static void checkStatus(String partnerId) {
try (CloseableHttpClient client = HttpClients.createDefault()) {
String endpoint = "/v1/api/transaction/check/" + partnerId;
String url = API_BASE_URL + endpoint;
// Récupération du timestamp
long timestamp = Instant.now().getEpochSecond();
String payload = "";
// Construction des entêtes
String method = "GET";
String signature = Utils.generateSignature(SECRET_KEY, String.valueOf(timestamp), method, endpoint, payload);
HttpGet get = new HttpGet(url);
get.setHeader("LP-ACCESS-KEY", API_KEY);
get.setHeader("LP-ACCESS-TIMESTAMP", String.valueOf(timestamp));
get.setHeader("LP-ACCESS-SIGN", signature);
CloseableHttpResponse response = client.execute(get);
System.out.println(EntityUtils.toString(response.getEntity()));
} catch (Exception e) {
e.printStackTrace();
}
}
}
4. Exécuter le code
A présent, nous allons exécuter le code présenté ci-dessus.
Pour cela, nous allons tenter de faire un retrait de 500F.
import Withdrawal;
import StatusCheck;
public static void main(String args[]) {
// Définition des Variables
String API_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
String SECRET_KEY = "yyyyyyyyyyyyyyyyyyyyyyyyyyy";
String serviceCode = "CASHOUT_ORANGE_CM";
String phoneNumber = "XXXXXXXXX";
String partnerId = "xxxxxxxx";
Float amount = 1000;
// 1. Effectuer le retrait
Withdrawal withdrawal = new Withdrawal();
withdrawal.API_KEY = API_KEY;
withdrawal.SECRET_KEY = SECRET_KEY;
withdrawal.makeWithdrawal(amount, serviceCode, phoneNumber, partnerId);
// 2. Vérifier le statut de la transaction
StatusCheck statusCheck = new StatusCheck();
statusCheck.API_KEY = API_KEY;
statusCheck.SECRET_KEY = SECRET_KEY;
statusCheck.checkStatus(partnerId);
}
5. Conclusion
Arrivés au terme de ce tutoriel, vous savez maintenant comment intégrer les APIs de MOALA pour réaliser une opération de retrait d'argent.