Produkt per API erstellen?

Hallo, ich möchte mir die API zunutze machen und ein paar Produkte erstellen aber es klappt einfach nicht kann mir jemand helfen?
ich beiße mir daran jetzt schon 2 tage die zähne aus

Script:

const axios = require(‚axios‘);

const apiUrl = ‚https://beispiel.de‘; // Ersetze dies durch die URL deines Shopware 6 Shops
const accessToken = ‚XXXXXXXXXXXXXXXXXXXXXX‘; // Ersetze dies durch dein Access Token

const productData = {
„name“: „Testprodukt“,
„productNumber“: „random“,
„stock“: 10,
„price“: [
{
„currencyId“: „b7d2554b0ce847cd82f3ac9bd1c0dfca“,
„gross“: 15,
„net“: 10,
„linked“: false
}
],
„taxId“: „a5da76b447db4d0aba62e6512dadf45b“
};

async function addProduct() {
try {
const response = await axios.post(${apiUrl}/api/product, productData, {
headers: {
‚Accept‘: ‚application/json‘,
‚Content-Type‘: ‚application/json‘,
‚Authorization‘: Bearer ${accessToken},
},
});

console.log('Produkt erfolgreich hinzugefügt:', response.data);

} catch (error) {
console.error(‚Fehler beim Hinzufügen des Produkts:‘, error.response ? error.response.data : error.message);
}
}

addProduct();

Fehlermeldung:

C:\Users\XX\Desktop\script>node prod.js
Fehler beim Hinzufügen des Produkts: {
errors: [
{
code: ‚9‘,
status: ‚401‘,
title: ‚The resource owner or authorization server denied the request.‘,
detail: ‚The JWT string must have two dots‘,
meta: [Object]
}
]
}

habe ich was vergessen oder was muss ich ändern? Danke

Das scheint zunächst ein Problem mit dem Token zu sein. Der Token hält in der Standard Installation nur kurz. Wie holst Du den Token ?
Und Du musst die ID im Client erzeugen !

LG

Carsten Harnisch

Den Token hole ich mir aus meinem Verkaufskanal, ich habe jedoch auch einen über das Admin Profil erstellt. LG

Das ist dann vermutlich eher der User und ein Secret.
Also dann erst so wie hier den Token erzeugen:

1 Like

ich habe das mal hinzugefügt:

const axios = require('axios');

const apiUrl = 'https://BEISPIEL.de';
const clientId = 'administration';
const clientSecret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
const username = 'XXXXXXXXXXXXX';
const password = 'XXXXXXXXXXXXX';

// Funktion, um Access Token zu erhalten
async function getAccessToken() {
  try {
    const response = await axios.post(`${apiUrl}/api/oauth/token`, {
      grant_type: 'password',
      client_id: clientId,
      client_secret: clientSecret,
      username: username,
      password: password,
    });

    return response.data.access_token;
  } catch (error) {
    console.error('Fehler beim Erhalten des Access Tokens:', error.response ? error.response.data : error.message);
    throw error;
  }
}

async function addProduct(accessToken) {
  const productData = {
    name: 'Testprodukt',
    productNumber: 'random',
    stock: 10,
    taxId: 'a5da76b447db4d0aba62e6512dadf45b',
    price: [
      {
        currencyId: 'b7d2554b0ce847cd82f3ac9bd1c0dfca',
        gross: 15,
        net: 10,
        linked: false,
      },
    ],
  };

  try {
    const response = await axios.post(`${apiUrl}/api/product`, productData, {
      headers: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${accessToken}`,
      },
    });

    console.log('Produkt erfolgreich hinzugefügt:', response.data.data);
  } catch (error) {
    console.error('Fehler beim Hinzufügen des Produkts:', error.response ? error.response.data : error.message);
  }
}

async function main() {
  try {
    const accessToken = await getAccessToken();
    await addProduct(accessToken);
  } catch (error) {
    console.error('Allgemeiner Fehler:', error);
  }
}

main();

leider kommt nun dieser fehler scheint was mit der taxid zu sein:

Fehler beim Hinzufügen des Produkts: {
  errors: [
    {
      code: '1452',
      status: '500',
      title: 'Internal Server Error',
      detail: 'An exception occurred while executing a query: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`db_XXXXXXX`.`product`, CONSTRAINT `fk.product.tax_id` FOREIGN KEY (`tax_id`) REFERENCES `tax` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE)'
    }
  ]
}

Die TaxId ist immer unterschiedlich. Die CurrencyId wird meine ich immer gleich sein. Sprich TaxId müsstest Du Dir aus der Datenbank (oder aus der URL im Backend) raussuchen.

Warum man Werte wie EUR, USD, CHF und 0%,7%,19% (oder zumindest 0,1,2) als „leicht zu merkende“ UUID verkodieren muss, kann ich Dir auch nicht sagen :slight_smile:

herzlichst

CH