Neulich musste ich per PHP mit der CleverReach API sprechen.

Der API-Explorer ist cool, aber die Doku hat bei mir für die einen oder anderen Anfangsschwierigkeiten gesorgt.

Den fertigen PHP REST Client, den man auf der Doku-Seite herunterladen kann, brachte ich nicht zum Funktionieren. Irgendwie bin ich immer zu blöd, irgendetwas Fertiges zu verwenden, wenn es nicht komplett dokumentiert wurde.

Naja, habe ich meine CleverReach-REST-PHP-Class halt selbst geschrieben...

Folgende PHP-Klasse funktioniert mit der API v3.

Sie erwartet eine Datei token.php im selben Verzeichnis. Hier ist nur das Token als Variable gespeichert. Z.B.

token.php
<?php
$token = "sdhfskdhfknvcxjnviulsdh";
?>

Die Rechte der Datei sollten so gesetzt sein, dass PHP-Skripte sie ändern können, denn wenn das Token verfallen ist, kann das Skript es selbstständig erneuern.
Von dem her kann man für das erste Mal den Wert des Tokens auch leer lassen, dann wird er bei der ersten Ausfürung erstellt.
Den Token separat erzeugen zu müssen ist hiermit also nicht notwendig. Es müssen natürlich Client ID und Client Secret vorhanden sein, welche im CleverReach-Account unter Entwickler > OAuth Apps verwalten angelegt werden können.

cleverreach_api.php
<?php

class cleverreach {

    public  $data         = false;
    public  $url          = "";
    private $unsecure     = false;
    private $clientid     = "*CLIENT ID*";
    private $clientsecret = "*CLIENT SECRET*";
    private $tokenurl     = "https://rest.cleverreach.com/oauth/token.php";
    public  $token        = "";

    public function __construct($starturl = "https://rest.cleverreach.com/v3/") {
        include 'token.php';
        $this->url = rtrim($starturl, '/');
        $this->token = $token;
      }
 
  public function unsecure() {
    $this->unsecure = true;
    }
 
  public function getToken() {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $this->tokenurl);
    curl_setopt($curl, CURLOPT_USERPWD, $this->clientid . ":" . $this->clientsecret);
    curl_setopt($curl, CURLOPT_POSTFIELDS, array("grant_type" => "client_credentials"));
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    if ($this->unsecure) {
      curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
      curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
      }
    $result = curl_exec($curl);
    curl_close($curl);
    if ($result == "") return false;
    $json = json_decode($result, true);
    if ($json['access_token'] == "") return false;
    $this->token = $json['access_token'];
    file_put_contents(dirname(__FILE__)."/token.php", "<"."?php\n\$token = '".$json['access_token']."';\n//Erstellt ".date("d.m.Y H:i")."\n// Verfällt ".date("d.m.Y H:i", time()+$json['expires_in'])."\n?".">");
    return true;
    }

  private function _api($mode, $path, $data = false, $retry = false) {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $this->url . $path);
    curl_setopt($curl, CURLOPT_HTTPHEADER, array('content' => 'Content-Type: application/json', 'token' => 'X-ACCESS-TOKEN: '.$this->token));
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    if ($mode == "DELETE")   curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE");
    elseif ($mode == "PUT")  curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT");
    elseif ($mode == "POST") curl_setopt($curl, CURLOPT_POST, true);
    if ($this->unsecure) {
      curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
      curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
      }
    if ($data !== false)
      curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    $result = curl_exec($curl);
    $headers = curl_getinfo($curl);
    curl_close($curl);
    $json = json_decode($result, true);
    // Token abgelaufen?
    if (!$retry && isset($json['error']) && $json['error']['code'] == 401) {
      $this->getToken();
      $json = $this->_api($mode, $path, $data, true);
      }
    // Ergebnis zurückgeben
    return $json;
    }
 
  public function get($path, $data = false) {
    return $this->_api("GET", $path, $data);
    }

  public function post($path, $data = false) {
    return $this->_api("POST", $path, $data);
    }

  public function put($path, $data = false) {
    return $this->_api("PUT", $path, $data);
    }

  public function del($path, $data = false) {
    return $this->_api("DELETE", $path, $data);
    }
  }
?>

Verwendung:

Die an die API zu übergebenden Werte werden hier (im Gegensatz zum "original PHP REST Client") als JSON-String übergeben.

Beispiel
include 'cleverreach_api.php';

$api = new cleverreach();

// GET-Beispiel
$users = $api->get("/receivers/filter.json", '{"groups": ["64521"],"rules": [{ "field":"email", "logic":"notisnull" }], "activeonly": "true"}');

// PUT-Beispiel
$request = $api->put("/receivers.json/4651431/attributes/85441", '{"value": "test"}');

// POST-Beispiel
$tag = $api->post("/receivers.json/4651431/tags", '{"tags": ["neuerTag"], "group_id": "64521"}');