Aufruf der API über PHP führt zum Error

Hallo Leute,
versuche über folgenden API Aufruf, sowohl in Postman als auch über ein PHP Script, alle Produkte über die API abzurufen, bekomme aber die Fehlermeldung:
FRAMEWORK__ROUTING_SALES_CHANNEL_NOT_FOUND
Warum? Der Shop läuft soweit, sowohl das Frontend als auch das Backend lassen sich aufrufen, ein Sales Channel existiert also. Warum dieser Fehler?

   <?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "http://tklustig.de/store-api/search",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => json_encode([
    'associations' => [
        'media' => [
                
        ]
    ],
    'includes' => [
        'media' => [
                'url'
        ]
    ]
  ]),
  CURLOPT_HTTPHEADER => [
    "Accept: application/json",
    "Content-Type: application/json",
    "sw-access-key: SWIAZ0TKB0RPAGZXZTDKMFDTDG"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
} 

In Deinem Fall verwendest Du eine API-Anfrage an eine bestimmte URL („http://tklustig.de/store-api/search“), die anscheinend einen Vertriebskanal erfordert!

Überprüfe also mal ob…

  1. der Vertriebskanal in Deinem System vorhanden und korrekt konfiguriert ist
  2. die URL und den Endpunkt Deiner Anfrage
  3. Du Dich authentifizieren musst

Versuch dann mal folgendes:

<?php

$username = "Dein_Benutzername";
$password = "Dein_Passwort";

$curl = curl_init();

$data = [
    'associations' => [
        'media' => []
    ],
    'includes' => [
        'media' => ['url']
    ]
];

$options = [
    CURLOPT_URL => "http://tklustig.de/store-api/search",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_POSTFIELDS => json_encode($data),
    CURLOPT_HTTPHEADER => [
        "Content-Type: application/json"
    ],
    CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
    CURLOPT_USERPWD => "$username:$password"
];

curl_setopt_array($curl, $options);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
    echo "cURL Error #:" . $err;
} else {
    echo $response;
}
?>

Das scheitert an der Authentifizierung

Unauthorized","detail":"Header \u0022sw-access-key\u0022 is required

Der Vertriebskanal ist korrekt konfiguriert

Es funktioniert weder mit einem BearerToken, welches ich erhalten habe in Postman noch mit dem sw-Access-Key über PHP noch mit Deiner Variante!

Einige APIs verlangen einen API-Schlüssel, der normalerweise als Header gesendet wird. Wenn Du solch einen Schlüssel hast, kannst Du ihn wie folgt zu Deinem cURL-Optionen hinzufügen:

$api_key = "Dein_API_Schlüssel"; // Beispiel API-Schlüssel

$options = [
    CURLOPT_URL => "http://tklustig.de/store-api/search",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_POSTFIELDS => json_encode($data),
    CURLOPT_HTTPHEADER => [
        "Content-Type: application/json",
        "sw-access-key: $api_key" // Hinzufügen des API-Schlüssels als Header
    ]
];

Du musst „https“ nutzen

Ich benutze den API Key direkt. Ob ich ihn über eine Variable oder direkt einbinde macht fürwahr keinen Unterschied. Bzgl. des https-Protokolls: Da es sich um einen lokalen Shop handelt, bekomme ich bei Verwendung des https Protokolls den error:

cURL Error #:SSL certificate problem: self-signed certificate

wie integriere ich den Verkaufskanal im API Aufruf? Wie bereits erwähnt: Der ist im Backend korrekt initialisert!

Der sw-access-key ist deinem Verkaufskanal zugeordnet, den must du nicht extra angeben, nur als sw-access-key übergeben. Wo hast du denn deinen sw-access-key her?

Unter http funktioniert bei mir kein Zugriff auf die API auch wenn das im Beispiel so steht.

Ich hatte wohl den falschen Access-Key. Jetzt klappt der Aufruf. Bei mir auch mit dem http-Protokoll! Vielen Dank an [brettvormkopp]. Warum als Fehlermeldung nicht ‚wrong access-key‘ ausgegeben wird, ist mir zwar schleierhaft, aber dieser Thread kann als erfolgreich gelöst geschlossen werden