FastCoins est un réseau de publishers PTC (Paid-To-Click). Intègre nos publicités sur ton site, tes utilisateurs gagnent des récompenses en tokens en les regardant, et tu perçois automatiquement une part des revenus.
Crée un compte publisher, vérifie que le domaine t'appartient et reçois tes identifiants API une fois qu'il est examiné.
-
1Crée un compte publisher sur FastCoins.com/publisher_dashboard. Il te faut un nom de site et une URL.
-
2Ajoute un domaine dans l'onglet Domains. Chaque domaine a sa propre API Key, Secret Key, Bearer Token, configuration de token et URL de postback.
-
3Définis ton URL de postback — l'endpoint sur ton serveur qui reçoit les notifications de récompense (voir la section Postback ci-dessous).
-
4Génère un Bearer Token depuis l'onglet Domains. Indispensable pour authentifier les appels à l'API PTC.
-
5Envoie un postback de test depuis l'onglet Domains pour vérifier que ton endpoint répond correctement avant la mise en production.
Une notification serveur à serveur envoyée à ton site web quand un utilisateur termine la vue d'une publicité, pour que tu puisses créditer les récompenses automatiquement, sans aucun code côté client.
🔐 Exigences de sécurité
- IP serveur autorisées:
62.171.140.250,2a02:c207:2329:8601::1— vérifie ceci uniquement contre$_SERVER['REMOTE_ADDR']. Il s'agit d'un appel direct de serveur à serveur, pas d'une requête de navigateur : aucun proxy/CDN de notre part ne s'intercale ; un en-tête commeX-Forwarded-Forest fourni par le client et trivialement falsifiable, ne te fie donc pas à lui pour cette vérification. userIpest obligatoire, pas seulement informatif — rejette le callback s'il est absent ou si ce n'est pas une IP valide. Nous résolvons et envoyons toujours l'IP réelle du visiteur qui a terminé la publicité (via Cloudflare de notre côté) précisément pour que tu puisses t'y fier : détection de fraude, limites par IP, contrôles d'utilisateurs en double — un endpoint qui l'ignore perd complètement ce signal.- Réponse HTTP requise : exactement
ok— en minuscules, sans espaces, sans HTML, HTTP 200 - Algorithme de signature (recommandé) :
signature_sha256=HMAC-SHA256(subId + transId + reward, secret_key)—secret_keyest la clé HMAC, elle n'est pas concaténée dans le message.userIpn'en fait pas partie. - Algorithme de signature (ancien, toujours envoyé à chaque callback) :
signature=MD5(subId + transId + reward + secret_key)— valeurs concaténées sans séparateur. Maintenu indéfiniment pour les intégrations créées avant l'existence designature_sha256; rien à changer si tu vérifies déjà celle-ci. - Besoin de plus de 8 décimales ? Chaque callback transporte aussi
reward_precise(10 décimales) avec son propresignature_sha256_precise=HMAC-SHA256(subId + transId + reward_precise, secret_key)— totalement optionnel et additif, calculé de la même façon, simplement sur la chaîne plus précise.reward/signature_sha256/signaturecontinuent d'être envoyés exactement comme avant, que tu l'utilises ou non. - Prévention des doublons : vérifie toujours
transIddans ta base de données avant de créditer
📋 Paramètres du postback (GET)
Ton URL de postback reçoit ces paramètres via HTTP GET.
| Paramètre | Type | Requis | Description |
|---|---|---|---|
| subId | string | REQUIS | ID unique de l'utilisateur dans ton système — la valeur que tu as passée à l'appel du widget/API |
| transId | string | REQUIS | ID de transaction unique — vérifie-le toujours pour éviter les crédits en double |
| reward | float | REQUIS | Récompense dans ta devise de token (déjà convertie selon ton token_rate configuré), formatée à 8 décimales |
| reward_precise | float | Optionnel | La même récompense que reward, formatée à 10 décimales au lieu de 8 — à utiliser quand 8 décimales ne te suffisent pas |
| reward_name | string | REQUIS | Nom du token tel que configuré pour ton domaine (p. ex. POINTS, COINS) |
| reward_value | float | REQUIS | Identique à reward — inclus pour la compatibilité avec bitcotasks |
| offer_name | string | Optionnel | Titre de la publicité terminée — utile pour les journaux |
| offer_type | string | Optionnel | Toujours ptc pour les vues de publicités FastCoins |
| payout | float | Optionnel | Identique à reward — inclus pour la compatibilité avec des tiers |
| userIp | string | REQUIS | Adresse IP réelle de l'utilisateur qui a complété l'offre, résolue via Cloudflare de notre côté avant l'envoi de ce callback — rejette le callback s'il est absent ou échoue à FILTER_VALIDATE_IP. Sers-t'en pour la détection de fraude, les limites par IP, la détection d'utilisateurs en double, l'audit des conversions et les statistiques. |
| status | integer | REQUIS | 1 = Créditer la récompense | 2 = Rétrofacturation (déduire la récompense) |
| signature_sha256 | string | REQUIS | HMAC-SHA256 de subId + transId + reward, avec secret_key comme clé — recommandé pour les nouvelles intégrations |
| signature_sha256_precise | string | Optionnel | HMAC-SHA256 de subId + transId + reward_precise, avec secret_key comme clé — vérifie celle-ci au lieu de signature_sha256 seulement si tu lis aussi reward_precise |
| signature | string | REQUIS | Ancien : MD5 de subId + transId + reward + secret_key concaténés (sans séparateur). Toujours envoyé à chaque callback, à l'identique — conservé pour les intégrations créées avant l'existence de signature_sha256. |
| test | integer | Optionnel | 1 = postback de test depuis le tableau de bord — ne crédite pas de vraies récompenses |
🧮 Exemple : construction et vérification d'une URL signée
Un exemple complet et détaillé pour que tu puisses confronter ton propre calcul de signature au nôtre avant la mise en production. La clé secrète utilisée est inventée, purement pour illustrer.
Secret Key (example only, never a real one): demo_secret_do_not_use_9f8e7d6c Parameters for this conversion: subId = user_12345 transId = txn_987654321 reward = 0.50 status = 1 userIp = 127.0.0.1 signature_sha256 = HMAC-SHA256(subId + transId + reward, secret_key) = HMAC-SHA256("user_12345" . "txn_987654321" . "0.50", demo_secret_do_not_use_9f8e7d6c) = HMAC-SHA256("user_12345txn_9876543210.50", demo_secret_do_not_use_9f8e7d6c) = df3eafaa3e8cf4fe8fb40c7bed633f34bc7b964bca58d2d691314771a042d59c signature (legacy) = MD5(subId + transId + reward + secret_key) = MD5("user_12345" . "txn_987654321" . "0.50" . "demo_secret_do_not_use_9f8e7d6c") = MD5("user_12345txn_9876543210.50demo_secret_do_not_use_9f8e7d6c") = d1eb68e41cbd5770de9384c5be8ebb39 Resulting callback URL: https://yoursite.com/postback.php?subId=user_12345&transId=txn_987654321&reward=0.50&status=1&userIp=127.0.0.1&signature=d1eb68e41cbd5770de9384c5be8ebb39&signature_sha256=df3eafaa3e8cf4fe8fb40c7bed633f34bc7b964bca58d2d691314771a042d59c
reward_name, reward_value, offer_name, offer_type, payout et test par souci de concision — ton vrai callback les inclut tous, voir le tableau ci-dessus.📐 Optionnel : précision à 10 décimales (reward_precise)
Même clé secrète, même callback — juste une récompense avec plus de précision décimale que ne le permettent les 8 décimales de reward. Totalement additif : passe ton chemin si 8 décimales couvrent déjà ton cas.
Same secret key and subId/transId as above, but the underlying reward this time carries more precision: reward = 0.12345679 (8 decimals, rounded) reward_precise = 0.1234567890 (10 decimals) signature_sha256_precise = HMAC-SHA256(subId + transId + reward_precise, secret_key) = HMAC-SHA256("user_12345" . "txn_987654321" . "0.1234567890", demo_secret_do_not_use_9f8e7d6c) = 219d2101a528b8585161bd26c3bb80c5de8a6741d60d2f1778eb805a05f7a707
💻 Implémentation PHP — postback.php
Enregistre ceci sur ton serveur, renseigne ta Secret Key de l'onglet Domains, puis colle l'URL complète dans le champ Postback URL de ton domaine.
// ── 1. YOUR SECRET KEY (from Domains tab → Secret Key) ───── $secret = ""; // ← paste your secret key here // ── 2. IP VALIDATION (callback source) ────────────────────── // REMOTE_ADDR only — this call comes straight from our server to // yours, no browser and no proxy of ours in between, so it's the // one value here that can't be spoofed by whoever is calling you. // X-Forwarded-For (or any other header) is attacker-controlled and // must never be trusted for this check. $allowed_ips = ['62.171.140.250', '2a02:c207:2329:8601::1']; $ip = $_SERVER['REMOTE_ADDR'] ?? ''; if (!in_array($ip, $allowed_ips, true)) { echo "ERROR: Invalid source IP"; exit; } // ── 3. COLLECT PARAMETERS ─────────────────────────────────── $userId = $_GET['subId'] ?? null; $transId = $_GET['transId'] ?? null; $status = $_GET['status'] ?? null; $isTest = isset($_GET['test']) && $_GET['test'] == 1; $userIp = $_GET['userIp'] ?? null; // real IP of the ad viewer — required, see step 4 // ── 3b. DYNAMIC PRECISION ──────────────────────────────────── // Prefer reward_precise (10 decimals) when the callback carries it; // fall back to the standard reward (8 decimals) otherwise. Whichever // pair is picked, it's verified against its own matching signature in // step 6 — if that signature is valid, the postback is accepted. $hasPrecise = isset($_GET['reward_precise'], $_GET['signature_sha256_precise']); $reward = $hasPrecise ? $_GET['reward_precise'] : ($_GET['reward'] ?? null); $signature = $hasPrecise ? $_GET['signature_sha256_precise'] : ($_GET['signature_sha256'] ?? null); // ── 4. VALIDATE USER IP (required) ────────────────────────── // userIp is mandatory — this is the real IP of the person who // completed the offer, already resolved through Cloudflare on our // end. Reject the callback outright rather than silently accepting // one without it, since your fraud detection / IP-limit / duplicate- // user checks depend on this value actually being present and valid. if (!$userIp || !filter_var($userIp, FILTER_VALIDATE_IP)) { echo "ERROR: Invalid user IP"; exit; } // ── 5. VALIDATE REQUIRED PARAMS ───────────────────────────── if (!$userId || !$transId || $reward === null || !$signature) { echo "ERROR: Missing parameters"; exit; } // ── 6. VERIFY SIGNATURE ───────────────────────────────────── // Only subId + transId + reward go into this hash — userIp is NOT // part of it. $secret is the HMAC key, not concatenated into the // message. Don't add userIp here unless a different provider's docs // explicitly say their signature scheme includes it. $expected = hash_hmac('sha256', $userId . $transId . $reward, $secret); if (!hash_equals($expected, $signature)) { echo "ERROR: Signature mismatch"; exit; } // ── 7. HANDLE CHARGEBACK (status = 2) ─────────────────────── if ((int)$status === 2) { $reward = -abs((float)$reward); // negative = deduct } // ── 8. TEST CALLBACK ───────────────────────────────────────── // Authenticated and validated like any other callback, but must not // touch a real balance. if ($isTest) { echo "ok"; exit; } // ── 9. PREVENT DUPLICATES, CREDIT REWARD & STORE USER IP ────── // Replace with your actual DB logic. if (!isTransactionProcessed($transId)) { creditUserReward($userId, $reward, $transId); // If your credit function only takes these 3 args, store $userIp // with the conversion separately, e.g.: // saveConversionIp($transId, $userId, $userIp); } // ── 10. REQUIRED RESPONSE ─────────────────────────────────── echo "ok"; // MUST return exactly this, nothing else
🕓 Vérification ancienne — MD5
signature avec MD5 ? Il est toujours envoyé à chaque callback, parfaitement inchangé — ceci n'est là que pour référence. Aucune action requise. Les nouvelles intégrations doivent utiliser signature_sha256 ci-dessus.$signature = $_GET['signature'] ?? null; $expected = md5($userId . $transId . $reward . $secret); if (!hash_equals($expected, $signature)) { echo "ERROR: Signature mismatch"; exit; } // ...same IP check, userIp check, and crediting logic as the main example above.
🔀 Flux du callback
- 1Callback reçu
- 2Vérifie
REMOTE_ADDRcontre la liste blanche d'IP - 3Lis les paramètres, y compris
userIp - 4Valide
userIp— rejette s'il est absent ou si ce n'est pas une IP valide - 5Valide les autres paramètres requis
- 6Vérifie la signature
- 7Vérifie
status— traite comme une rétrofacturation si2 - 8Si
test=1, renvoieoksans rien créditer - 9Vérifie
transIddans ta base de données pour éviter les crédits en double - 10Crédite ou annule la récompense, et stocke
userIpavec la conversion - 11Renvoie
ok
Réponses possibles :
ok— callback traité (ou validé comme callback de test)ERROR: Invalid source IPERROR: Invalid user IPERROR: Missing parametersERROR: Signature mismatch
ok — sans espaces, sans retours à la ligne, sans HTML.transId.test=1 — ne crédite rien pour eux.Interroge les publicités PTC disponibles via une API REST et affiche-les avec ta propre interface. Aucun widget à intégrer.
🌐 Endpoint
| Segment | Description |
|---|---|
| API_KEY | L'API Key de ton domaine — à trouver dans l'onglet Domains de ton Espace Publisher |
| USER_ID | Identifiant unique de l'utilisateur dans ton système. Renvoyé en tant que subId dans le postback |
| USER_IP | Adresse IP réelle de l'utilisateur — utilisée pour le ciblage des publicités et la prévention de la fraude. Passe la vraie IP du client |
| DEVICE | Exactement desktop ou mobile — il n'existe pas de troisième valeur. Les tablettes (iPad, tablettes Android) comptent comme mobile. Le vrai appareil du visiteur est requis dès qu'un annonceur lance une campagne ciblée par appareil : comme tu appelles cette API depuis ton propre serveur, le User-Agent de ton serveur n'est pas celui du visiteur, nous ne pouvons donc pas le détecter à ta place — tu dois le détecter et le transmettre. Envoyer autre chose que desktop/mobile (y compris le littéral "tablet") est traité comme une omission — convertis toi-même en mobile. Une requête qui l'omet ou le mal orthographie renvoie HTTP 400 dans ce cas. |
[DEVICE], ajoute-le maintenant. C'est aujourd'hui ignoré silencieusement, mais cela renverra HTTP 400 dès que le ciblage par appareil sera actif — n'attends pas que ça casse ton flux.🔑 Authentification — Bearer Token
Authorization. Génères-en un par domaine depuis l'onglet Domains (bouton 🔄 à côté de "Bearer Token").💻 Exemple PHP
// ── YOUR CREDENTIALS (from Domains tab) ───────────────────── $apiKey = 'YOUR_API_KEY'; $bearerToken = 'YOUR_BEARER_TOKEN'; // ── USER DATA ──────────────────────────────────────────────── $userId = $_SESSION['user_id']; // your user's unique ID // REMOTE_ADDR by default — it's the one value here that can't be // spoofed by the visitor. Only read a proxy header instead (e.g. // CF-Connecting-IP) if your own server sits behind a reverse proxy // you control and trust — never a client-supplied header like // X-Forwarded-For, which the visitor's own browser can set to // anything. $userIp = $_SERVER['REMOTE_ADDR'] ?? ''; // Required once any advertiser runs a device-targeted campaign — this // script call happens during the visitor's own page load, so THIS // server's incoming User-Agent is theirs. Don't skip this: a call from a // background job/cron with no real visitor attached has no correct value // to send here. $userAgent = $_SERVER['HTTP_USER_AGENT'] ?? ''; $device = preg_match('/Mobi|Android|iPhone|iPod|iPad|BlackBerry|IEMobile|Opera Mini/i', $userAgent) ? 'mobile' : 'desktop'; // ── BUILD URL ──────────────────────────────────────────────── $url = 'https://FastCoins.com/api/' . $apiKey . '/' . urlencode($userId) . '/' . urlencode($userIp) . '/' . $device; // ── CURL REQUEST ───────────────────────────────────────────── $ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 10, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $bearerToken, 'Accept: application/json', ], ]); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); $data = json_decode($response, true); // ── HANDLE RESPONSE ────────────────────────────────────────── if ($httpCode === 200 && $data['status'] === '200') { foreach ($data['data'] as $ad) { // $ad['url'] already contains the user subId encoded echo '<a href="' . htmlspecialchars($ad['url']) . '" target="_blank">'; echo htmlspecialchars($ad['title']); echo ' — ' . $ad['reward'] . ' ' . $ad['currency_name']; echo '</a><br>'; } } else { echo 'No ads available.'; }
📦 Format de réponse
Les réponses réussies renvoient HTTP 200 avec cette structure JSON :
| Champ | Type | Description |
|---|---|---|
| id | string | Identifiant unique de la publicité |
| image | string | URL complète de l'image de la bannière — peut être vide |
| title | string | Titre à afficher — montre-le à tes utilisateurs |
| description | string | Description courte de la publicité |
| duration | string | Temps de visionnage requis en secondes : 2, 30 ou 60 |
| reward | float | Montant de la récompense dans la devise de token de ton domaine (déjà convertie) |
| currency_name | string | Nom du token tel que configuré pour ton domaine (p. ex. COINS, USDT) |
| url | string | Redirige l'utilisateur ici pour regarder la publicité. Le postback se déclenche automatiquement à la fin. Encode déjà le subId de l'utilisateur. |
| boosted_campaign | boolean | Indique s'il s'agit d'une publicité mise en avant — pense à les mettre en évidence dans ton interface |
| ad_type | string | Iframe = se joue dans un cadre | Redirect = l'utilisateur va sur la page de l'annonceur |
⚠️ Codes d'erreur
Les réponses d'erreur partagent la même structure JSON avec un champ de statut différent de 200.
| HTTP | status | Cause et résolution |
|---|---|---|
| 401 | 401 | Clé API invalide — vérifie le segment API_KEY dans l'URL, ou le Bearer Token est absent alors que le domaine en exige un |
| 403 | 403 | Bearer Token incorrect — régénère-le et mets-le à jour dans l'onglet Domains |
| 400 | 400 | Format USER_ID invalide — doit être alphanumérique (a-z, 0-9, _, -, .), 255 caractères maximum |
| 400 | 400 | Segment DEVICE manquant ou invalide — renvoyé seulement une fois le ciblage par appareil actif. Doit être exactement desktop ou mobile |
| 500 | 500 | Erreur interne du serveur — le champ message contient des détails de débogage. Contacte le support si cela persiste. |
Le flux complet, de l'appel API au crédit de la récompense sur ton site.
📡 Flux API + Postback
GET /api/…url de la pubGET postback.phpok🧩 Widget intégré (alternative)
Si tu préfères ne pas utiliser l'API, intègre le widget en iframe — il gère tout automatiquement, avec des styles isolés du reste de ta page.
<iframe src="https://fastcoins.click/widget-embed.php?api_key=YOUR_API_KEY&sub_id={USER_ID}" style="width:100%;height:640px;border:none;" loading="lazy"></iframe>
YOUR_API_KEY par l'API Key de ton domaine et {USER_ID} par l'ID de l'utilisateur courant (rendu côté serveur). Le widget affiche les publicités et tâches disponibles en ligne et déclenche le postback automatiquement à la fin. Ajuste les 640px dans style pour rendre l'iframe plus haut ou plus bas selon ta mise en page.sub_id (= {USER_ID}) par utilisateur réel — pas de découpe par suffixe. Chacun de tes utilisateurs doit être identifié par un id unique et stable. Tu choisis le format — un id opaque, un pseudonyme, un e-mail (p. ex. ABD01230A23, [email protected]) — mais un utilisateur réel correspond à exactement un id, pour toujours. Interdit : prendre un id de base et y ajouter un suffixe numérique pour fabriquer plusieurs "utilisateurs" à partir d'une seule personne réelle. La détection est agnostique au séparateur — elle retire un
-, _ ou . final suivi de chiffres et traite le reste comme l'identité de l'utilisateur. Chacun de ces couples est rejeté : 123-1&123-2ABC_1&ABC_2A23-23&A23-24order.1&order.2
ABD01230A23, 1001, [email protected] conviennent tous). Quand le schéma est détecté, l'API répond quand même
ok mais renvoie un message expliquant que l'id n'est pas autorisé et aucune récompense n'est créditée ; la tentative est journalisée comme fraude. Crée une tâche (p. ex. "inscris-toi sur mon site"), finance N complétions et confirme chacune avec un postback signé de serveur à serveur. L'utilisateur est crédité automatiquement dès l'arrivée de ton postback — pas de validation manuelle, pas de retenue de la plateforme.
📡 Comment ça marche
/create-taskcka_cid1) L'URL du postback
GET https://fastcoins.click/webhooks/task-postback.php?cka_cid={CLICK_ID}&sign={SIGN}cka_cid— le click id que nous avons ajouté à ton URL de destination au départ de l'utilisateur (your-url?cka_cid=…). Renvoie-le tel quel.sign—hash_hmac('sha256', $cka_cid, $task_secret)(hex minuscule). Le secret propre à chaque tâche est affiché dans Create Task → My Tasks.
2) Signature
// PHP
$sign = hash_hmac('sha256', $cka_cid, $task_secret);
// Node.js
const sign = crypto.createHmac('sha256', taskSecret).update(ckaCid).digest('hex');
# Python
import hmac, hashlib
sign = hmac.new(task_secret.encode(), cka_cid.encode(), hashlib.sha256).hexdigest()403, même avec une signature valide. Ceci plus le HMAC constitue tout le modèle d'authenticité — garde ton secret en sécurité.3) Pixel analytics optionnel
Place ceci sur ta page de conversion pour tes propres statistiques. Il ne crédite jamais — le postback ci-dessus est la seule chose qui crédite.
<img src="https://fastcoins.click/task-pixel.php?cid={CLICK_ID}" width="1" height="1" alt="">Recommandations pour une intégration fiable, sécurisée et rentable.
⚡ Performances
- Mets les réponses de l'API en cache pendant au moins 60 secondes par utilisateur. N'appelle pas l'API à chaque chargement de page — les publicités changent au maximum toutes les quelques minutes.
- Transmets la vraie IP de l'utilisateur. Utilise
REMOTE_ADDRpar défaut — c'est la seule valeur impossible à falsifier par le visiteur. Ne lis un en-tête de proxy à la place (p. ex.CF-Connecting-IP) que si ton propre serveur est derrière un reverse proxy que tu contrôles et auquel tu fais confiance ; jamais un en-tête fourni par le client commeX-Forwarded-For. Des IP incorrectes dégradent la qualité du ciblage publicitaire. - Règle un timeout de 10 secondes sur tes appels cURL pour éviter des chargements de page lents si notre API est temporairement lente.
🔒 Sécurité
- N'expose jamais ta Secret Key dans du code côté client ou des dépôts publics. Elle n'est utilisée que côté serveur, pour la validation des signatures.
- Vérifie toujours
transIddans ta base de données avant de créditer — cela évite les récompenses en double dues à des renvois accidentels de postback. - Valide l'IP source avant de traiter tout postback. N'accepte les requêtes que de
62.171.140.250ou2a02:c207:2329:8601::1. - Utilise HTTPS pour ton endpoint de postback. Les endpoints HTTP peuvent être bloqués.
- Envoie un seul
sub_idpar utilisateur réel. N'ajoute pas de suffixes numériques à un id de base (123-1/123-2,ABC_1/ABC_2,order.1/order.2) — tout séparateur (-_.) est détecté comme fraude et rejeté sans crédit de récompense. Voir la règle ci-dessus.
💰 Revenus
- Les publicités boostées (
boosted_campaign: true) rapportent plus — mets-les en évidence dans ton interface pour augmenter les taux de clic. - Les publicités longues (60 s) rapportent nettement plus que les courtes (2 s). Priorise-les quand l'engagement des utilisateurs est élevé.
- Équilibre la part de l'utilisateur — un paiement plus élevé attire plus d'utilisateurs actifs ; un paiement plus faible augmente ta propre marge.
- Les retraits sont ouverts du 1 au 3 de chaque mois — note-le dans ton agenda.
🐛 Débogage
- Utilise le bouton Test Postback dans l'onglet Domains pour vérifier que ton endpoint renvoie exactement
okavec HTTP 200. - Consulte l'onglet Postback Logs pour voir les réponses HTTP complètes de chaque tentative de postback — il affiche les codes de statut et les réponses du serveur.
- Les postbacks en échec peuvent être renvoyés un par un ou en masse depuis l'onglet des logs. Aucune donnée n'est jamais définitivement perdue.
- Si la signature échoue toujours : pour
signature_sha256, vérifie quesecret_keyest passée comme clé HMAC (et non concaténée dans le message) et que tu hachessubId + transId + rewardsans séparateur ; pour l'anciensignature, vérifie que tu concatènessubId + transId + reward + secretsans séparateur. Dans tous les cas, assure-toi querewardcorrespond exactement à la chaîne du paramètre GET (sans arrondi). - Si tu vérifies
signature_sha256_precise: le hachage se fait surreward_precise, pas surreward— mélanger les deux champs avec la mauvaise signature est l'erreur la plus courante ici.
Prêt à commencer à gagner ?
Crée ton compte publisher en moins de 2 minutes, puis vérifie ton domaine pour te lancer.
Ouvrir l'Espace Publisher →