index-soutien/api/donorbox-proxy.php
isUnknown 97766e6bb7 Refonte jauge : affichage des soutiens réguliers vers objectif 500
- Remplace le montant collecté par le nombre de soutiens réguliers actifs
  (plans Donorbox status=active + 98 soutiens historiques) avec objectif 500
- Proxy PHP : appel à /api/v1/plans pour compter les plans actifs toutes
  campagnes confondues, avec pagination et détail plans_detail dans la réponse
- Jauge initialisée à 19.6% (98/500) en fallback si l'API est indisponible
- Versions FR et EN mises à jour

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-06 08:45:11 +01:00

192 lines
5.9 KiB
PHP

<?php
/**
* Proxy pour l'API Donorbox
* Évite les problèmes CORS en faisant l'appel API côté serveur
*/
// Configuration CORS pour permettre les appels depuis votre domaine
header('Content-Type: application/json');
// IMPORTANT SÉCURITÉ : Remplacer '*' par votre domaine exact en production
// Exemple : header('Access-Control-Allow-Origin: https://www.index.ngo');
// Actuellement '*' permet à N'IMPORTE QUEL site d'utiliser votre clé API Donorbox
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET');
header('Access-Control-Allow-Headers: Content-Type');
// Gestion des requêtes OPTIONS (preflight)
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
http_response_code(200);
exit();
}
// Vérification que c'est bien une requête GET
if ($_SERVER['REQUEST_METHOD'] !== 'GET') {
http_response_code(405);
echo json_encode(['error' => 'Méthode non autorisée']);
exit();
}
// Configuration de l'API Donorbox
define('DONORBOX_EMAIL', 'contact@index.ngo');
define('DONORBOX_API_KEY', 'Q5oiaoxPwA5C2s1iafh_pihynM_5HOZbMZz6QwjVx2aLhWijOPI9rw');
define('CAMPAIGN_SLUG', 'soutenir-index-2025-don'); // Slug de la campagne à filtrer
define('DONORBOX_API_URL', 'https://donorbox.org/api/v1/campaigns');
// Gestion du cache (5 minutes)
$cacheFile = __DIR__ . '/cache/donorbox_data.json';
$cacheTime = 300; // 5 minutes en secondes
// Vérifier si le cache existe et est valide
if (file_exists($cacheFile) && (time() - filemtime($cacheFile) < $cacheTime)) {
// Utiliser le cache
$cachedData = file_get_contents($cacheFile);
echo $cachedData;
exit();
}
// Appel à l'API Donorbox avec Basic Auth (--user format)
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => DONORBOX_API_URL,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_USERPWD => DONORBOX_EMAIL . ':' . DONORBOX_API_KEY, // Format --user de cURL
CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'User-Agent: Index-NGO-Website'
],
CURLOPT_TIMEOUT => 10,
CURLOPT_SSL_VERIFYPEER => true
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curlError = curl_error($ch);
curl_close($ch);
// Gestion des erreurs
if ($response === false) {
http_response_code(500);
echo json_encode([
'error' => 'Erreur de connexion à Donorbox',
'details' => $curlError
]);
exit();
}
if ($httpCode !== 200) {
http_response_code($httpCode);
echo json_encode([
'error' => 'Erreur API Donorbox',
'http_code' => $httpCode,
'response' => json_decode($response)
]);
exit();
}
// Décoder et valider la réponse
$campaigns = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE) {
http_response_code(500);
echo json_encode([
'error' => 'Réponse JSON invalide',
'details' => json_last_error_msg()
]);
exit();
}
// Trouver la campagne correspondante par son slug/name
$campaign = null;
if (is_array($campaigns)) {
foreach ($campaigns as $camp) {
// Recherche par slug ou par name
if (isset($camp['slug']) && $camp['slug'] === CAMPAIGN_SLUG) {
$campaign = $camp;
break;
}
if (isset($camp['name']) && strpos(strtolower($camp['name']), strtolower(CAMPAIGN_SLUG)) !== false) {
$campaign = $camp;
break;
}
}
}
// Si aucune campagne trouvée, utiliser la première ou renvoyer une erreur
if ($campaign === null) {
if (is_array($campaigns) && count($campaigns) > 0) {
$campaign = $campaigns[0]; // Prendre la première campagne par défaut
} else {
http_response_code(404);
echo json_encode([
'error' => 'Aucune campagne trouvée',
'campaigns_count' => is_array($campaigns) ? count($campaigns) : 0
]);
exit();
}
}
// Compter tous les donateurs réguliers actifs (toutes campagnes confondues)
$recurring_count = 0;
$plans_page = 1;
do {
$plans_url = 'https://donorbox.org/api/v1/plans?per_page=100&page=' . $plans_page;
$ch_plans = curl_init();
curl_setopt_array($ch_plans, [
CURLOPT_URL => $plans_url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_USERPWD => DONORBOX_EMAIL . ':' . DONORBOX_API_KEY,
CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'User-Agent: Index-NGO-Website'],
CURLOPT_TIMEOUT => 10,
CURLOPT_SSL_VERIFYPEER => true
]);
$plans_response = curl_exec($ch_plans);
$plans_http_code = curl_getinfo($ch_plans, CURLINFO_HTTP_CODE);
curl_close($ch_plans);
if ($plans_response === false || $plans_http_code !== 200) {
break;
}
$plans = json_decode($plans_response, true);
if (!is_array($plans)) break;
foreach ($plans as $plan) {
if (isset($plan['status']) && $plan['status'] === 'active') {
$recurring_count++;
}
$status = $plan['status'] ?? 'unknown';
$type = $plan['type'] ?? 'unknown';
$plans_detail[$status . '|' . $type] = ($plans_detail[$status . '|' . $type] ?? 0) + 1;
}
$plans_page++;
} while (count($plans) === 100);
// Extraire uniquement les données nécessaires
$filteredData = [
'total_raised' => $campaign['total_raised'] ?? 0,
'goal_amt' => $campaign['goal_amt'] ?? 50000,
'currency' => $campaign['currency'] ?? 'EUR',
'donations_count' => $campaign['donations_count'] ?? 0,
'recurring_donors_count' => $recurring_count,
'campaign_name' => $campaign['name'] ?? 'Unknown',
'updated_at' => date('c'),
'plans_detail' => $plans_detail ?? []
];
$jsonResponse = json_encode($filteredData, JSON_PRETTY_PRINT);
// Sauvegarder dans le cache
if (!file_exists(dirname($cacheFile))) {
mkdir(dirname($cacheFile), 0755, true);
}
file_put_contents($cacheFile, $jsonResponse);
// Retourner la réponse
echo $jsonResponse;