cUrl PHP API Aufruf und Modifikation

cUrl Abrufe für Shopware 6 sind ja schon eher das Eingemachte. Untenstehend ein Aufruf via PHP-Datei, die z.B. die visibility also die Zuordnung aller spezifizierten Artikel / Produkte zum Verkaufskanal via API erledigt. Die zugehörigen Zugangsdaten $client_id und $client_secret sind die im Adminbereich generierten (-> Einstellungen → System → Integrationen) Zugangsdaten der API.
Falls euch der Beitrag geholfen hat, erzählt es weiter :smile: - falls nicht, behaltet es für euch :innocent:

<?php

$token_url = "http://localhost/api/oauth/token";

$api_url = "http://localhost/api/v3/search/product";

//	client 
$client_id = "xxxxxxx";
$client_secret = "xxxxxxx";

$access_token = getAccessToken();
$resource = getResource($access_token);


foreach ($resource['data'] as $value) {
    setProductVisibility($access_token, $value['id'], $value['attributes']['versionId'], 'ID-OF-THE-SALESCHANNEL');
}

function getAccessToken() {
    global $token_url, $client_id, $client_secret;

    $curl = curl_init();

    curl_setopt_array($curl, [
        CURLOPT_URL => $token_url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 600,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => "grant_type=client_credentials&client_id=".$client_id."&client_secret=".$client_secret."",
        CURLOPT_HTTPHEADER => [
            "content-type: application/x-www-form-urlencoded"
        ],
        CURLOPT_SSL_VERIFYPEER => false,
    ]);

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

    curl_close($curl);

    if ($err) {
        echo "cURL Error #:" . $err;
    } else {
        return json_decode($response)->access_token;
    }

}

function getResource($access_token) {
    global $api_url;

    $data = array(
        //"limit" => 1,
        'filter' => array(
                array (
                    "type" => "equals",
                    "field" => "active",
                    "value" => true
                ),
        ),
        'includes' => array(
            "product" => array (
                "id",
                "versionId",
                "name",
                "active",
            ),
        ),
    );
    $payload = json_encode($data);

    $curl = curl_init();

    curl_setopt_array($curl, [
        CURLOPT_URL => $api_url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 600,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POSTFIELDS => $payload,
        CURLOPT_HTTPHEADER => [
            "authorization: Bearer ".$access_token."",
            "content-type: application/json"
        ],
        CURLOPT_SSL_VERIFYPEER => false,
    ]);

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

    curl_close($curl);

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

}

function setProductVisibility($access_token, $product_id, $product_version_id, $sales_channel) {
    $patchUrl = 'http://localhost/api/v3/product/'.$product_id;

    $data = array(
        "visibilities" => array(
                array (
                    "productId" => $product_id,
                    "productVersionId" => $product_version_id,
                    "salesChannelId" => $sales_channel,
                    "visibility" => 30,
                    "id" => v4(),
                ),
        ),
    );
    $payload = json_encode($data);

    $curl = curl_init();

    curl_setopt_array($curl, [
        CURLOPT_URL => $patchUrl,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 600,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "PATCH",
        CURLOPT_POSTFIELDS => $payload,
        CURLOPT_HTTPHEADER => [
            "authorization: Bearer ".$access_token."",
            "content-type: application/json"
        ],
        CURLOPT_SSL_VERIFYPEER => false,
    ]);

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

    curl_close($curl);

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

}

function v4() {
        return sprintf('%04x%04x%04x%04x%04x%04x%04x%04x',

            // 32 bits for "time_low"
            mt_rand(0, 0xffff), mt_rand(0, 0xffff),

            // 16 bits for "time_mid"
            mt_rand(0, 0xffff),

            // 16 bits for "time_hi_and_version",
            // four most significant bits holds version number 4
            mt_rand(0, 0x0fff) | 0x4000,

            // 16 bits, 8 bits for "clk_seq_hi_res",
            // 8 bits for "clk_seq_low",
            // two most significant bits holds zero and one for variant DCE1.1
            mt_rand(0, 0x3fff) | 0x8000,

            // 48 bits for "node"
            mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
        );
    }

?>

Übrigens wird die UUID für Shopware 6 via function v4() erstellt. Diese ist beliebig - in diesem Beispiel funktioniert das, die UUID für Shopware 6 kann jedoch auch mit anderen Methoden erstellt werden… Gewähr für Richtigkeit des obigen Codes gibt es nicht, es ist aber bestimmt mehr als ein Ansatzpunkt um eure individuellen Lösungen umzusetzen. ACHTUNG: Das Script hat keinerlei Bremsen, es wird also vorher nicht gecheckt ob der Artikel bereits im Sales-Channel vorhanden ist, etc. … Vorsicht beim Einsatz und nie ohne vorheriger DB-Sicherung! See you @ https/doriat.de

Stand 05-03-2021 Shopware 6 v6.3.5.1