Skip to content

SDK serveur PHP

SDK officiel côté serveur PHP — publié sous captchala/captchala-php sur Packagist.

Trois rôles que le SDK gère pour vous :

  1. Valider — vérifier un pass token pt_ issu du SDK navigateur.
  2. Émettre — générer un server token sct_ à usage unique pour lier le prochain challenge à une action / IP / UID donnée.
  3. Modérer — modération de contenu multi-modale (texte + image) via le même pipeline compatible OpenAI utilisé par le tableau de bord.

Installation

bash
composer require captchala/captchala-php

Nécessite PHP ≥ 8.0 avec ext-json. Utilise cURL lorsqu'il est disponible, sinon file_get_contents.

Valider (token pt_)

php
use Captchala\Client;

$client = new Client('your_app_key', 'your_app_secret');
$result = $client->validate($_POST['captcha_token']);

if (!$result->isValid()) {
    http_response_code(400);
    exit($result->getError());   // e.g. "token_expired", "client_ip_mismatch"
}
// Verification passed; proceed with the request.

Si vous avez émis le server_token original avec bind_uid, comparez l'uid renvoyé à l'utilisateur réellement attendu :

php
if ($result->getUid() !== $expectedUserId) {
    http_response_code(400);
    exit('user mismatch');
}

Si vous avez lié le token à une IP, passez l'IP utilisateur également côté vérification :

php
$client->validate($token, false, $request->ip());

Émettre un server token

Pour les flux à forte valeur (connexion, inscription, paiement), le schéma recommandé est : le backend génère un token sct_ à usage unique, le transmet au navigateur, qui le passe ensuite comme prop serverToken. Chaque token est à usage unique, lié à une action et facultativement lié à une IP / UID au moment de l'émission.

php
$issue = $client->issueServerToken(
    action:    'login',
    bindingIp: $request->ip(),
    ttl:       300,         // seconds; default 300
    maxUses:   5,           // SDK retry budget
    bindUid:   $user->id,   // pair with ValidateResult::getUid() on verify
);

if (!$issue->isOk()) {
    return ['error' => $issue->getError()];   // rate_limit_exceeded, invalid_action, ...
}

return ['server_token' => $issue->getToken()];  // hand to browser

Modérer du contenu

Multi-modal — accepte un mélange de texte et d'URL d'images au format compatible OpenAI :

php
$result = $client->moderationCheck([
    ['type' => 'text', 'text' => $userComment],
    ['type' => 'image_url', 'image_url' => ['url' => $uploadedImageUrl]],
], userId: $user->id);

if (!$result->isOk()) {
    // request error: invalid_credentials, no_content, transport failure, ...
    return ['error' => $result->getError()];
}

if ($result->isFlagged()) {
    // upstream model flagged; inspect categories for the why
    if ($result->hasCategory('violence', 'csam')) {
        // hard block
    }
}

Raccourci texte brut :

php
$result = $client->moderationText('user comment here', userId: $user->id);

Les catégories sont définies par le modèle (par ex. violence, hate, sexual, self-harm) ; itérez sur getCategories() de manière défensive plutôt que de coder en dur un ensemble fixe.

Classes de résultat

ClasseMéthodes
ValidateResultisValid(), getError(), getUid(), getChallengeId(), getAction(), isOffline(), isClientOnly(), getWarning(), toArray()
IssueResultisOk(), getToken(), getExpiresIn(), getIssuedAt(), getError(), getMessage(), toArray()
ModerationResultisOk(), isFlagged(), hasCategory(...$names), getCategories(), getContentType(), getRaw(), getError(), getMessage(), toArray()

Liens

MIT-licensed examples · CaptchaLa is operated independently