Guide
Guide C pour créer et payer une transaction YKNPG (libcurl).
Guide C pour créer et payer une transaction YKNPG (libcurl).
Pré-requis
- GCC/Clang et en-têtes de développement libcurl.
- Variables d'environnement
YKNPG_API_TOKENet optionnellementYKNPG_BASE_URL.
- Créer le dossier du projet
mkdir -p demo_c && cd demo_c
- Écrire le programme d'assistance
- Fichier :
transaction.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
struct memory {
char *response;
size_t size;
};
static size_t write_callback(void *contents, size_t size, size_t nmemb, void *userp) {
size_t realsize = size * nmemb;
struct memory *mem = (struct memory *)userp;
mem->response = realloc(mem->response, mem->size + realsize + 1);
memcpy(&(mem->response[mem->size]), contents, realsize);
mem->size += realsize;
mem->response[mem->size] = 0;
return realsize;
}
static char *base_url() {
char *env = getenv("YKNPG_BASE_URL");
return env ? env : "https://yknpg.ngoul.com/api/v1";
}
static CURL *init_curl(struct curl_slist **headers) {
CURL *curl = curl_easy_init();
char auth[512];
snprintf(auth, sizeof(auth), "Authorization: Bearer %s", getenv("YKNPG_API_TOKEN"));
*headers = curl_slist_append(*headers, "Content-Type: application/json");
*headers = curl_slist_append(*headers, auth);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, *headers);
return curl;
}
int main(int argc, char **argv) {
if (argc < 3) {
fprintf(stderr, "Usage: ./transaction <phone> <amount>\n");
return 1;
}
curl_global_init(CURL_GLOBAL_DEFAULT);
const char *phone = argv[1];
const char *amount = argv[2];
struct curl_slist *headers = NULL;
CURL *curl = init_curl(&headers);
struct memory chunk = {0};
char url[256];
snprintf(url, sizeof(url), "%s/transactions/", base_url());
const char *payload_template = "{\"amount\":%s,\"provider\":\"ORANGE_MONEY\",\"user_infos\":{\"number\":\"%s\"},\"callback_url\":\"http://example.com\",\"callback_method\":\"POST\",\"your_message\":\"pay this\",\"your_order_ref\":\"demo-1\",\"provider_fees_on_customer\":true}";
char payload[512];
snprintf(payload, sizeof(payload), payload_template, amount, phone);
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, payload);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
CURLcode res = curl_easy_perform(curl);
if (res != CURLE_OK) {
fprintf(stderr, "Create failed: %s\n", curl_easy_strerror(res));
return 1;
}
printf("Transaction response: %s\n", chunk.response);
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
free(chunk.response);
return 0;
}
- Compiler
gcc transaction.c -o transaction -lcurl
- Exécuter
YKNPG_API_TOKEN=token ./transaction <phone> <amount>
Remarques
- Par souci de brièveté, cet exemple affiche uniquement la réponse de création ; ajoutez d'autres appels libcurl pour
/pay/et le polling du statut en suivant le même modèle (POST puis GET jusqu'à sortie denew/paying). - Gardez le JSON compact pour éviter les erreurs de chaîne manuelle ; en production, utilisez une bibliothèque JSON (cJSON).