FROM CACHE - de_header

Warenkorb für Kunden von extern über API anlegen

Guts
Besucher
3 0 0

Guten Tag,

 

ich hab jetzt viel Zeit darauf verwendet dafür eine Lösung zu finden, allerdins bisher ohne Ergebnis.

Ist es möglich über die API einen Warenkorb für einen bestimmten Kunden (customer Id) anzulegen? 

Sprich ich benötige einen Call der folgendes macht

post -> Customer ID -> create Cart -> add Item (QTY)

 

Vielleicht kann mir jemand helfen, denn ich verzweifel echt.

4 ANTWORTEN 4

Gabe
Shopify Staff
17376 2752 4059

Hey @Guts 

 

Danke für die Frage und hier muss man vorsichtig sein zu viel Zeit in technische Probleme zu investieren deren Lösungen nicht unbedingt zum Wachstum des Geschäfts führen. Darf ich mehr dazu verstehen warum ihr den Warenkorb für den Kunden auf diese Weise erstellen möchtet? Baut ihr eine App?

 

In deinem Fall brauchst du einen API Call der folgendes macht: post -> Customer ID -> create Cart -> add Item (QTY). Hier fehlt aber ggf. auch die Product ID und das würde dann wie folgt aussehen: post -> Customer ID -> create Cart with Product ID -> add Item QTY.

 

D. h. dass du einen Warenkorb für einen Kunden erstellen möchtest ohne es im Storefront machen zu müssen. Soll das eine automatisierte Erstellung des Carts sein die in regelmässigen Abständen ausgelöst wird? Um das besser zu analysieren wären hier ein paar weitere Angaben sehr hilfreich.

 

Im grossen und ganzen kannst du einen Warenkorb mit der Storefront APIs cartCreate Mutation erstellen und den Customer mit der cartBuyerIdentityUpdate Mutation an den Warenkorb anhängen. Ein Beispiel wäre:

 

mutation createCart($cartInput: CartInput) {
  cartCreate(input: $cartInput) {
    cart {
      id
      createdAt
      updatedAt
      lines(first:10) {
        edges {
          node {
            id
            merchandise {
              ... on ProductVariant {
                id 
                sku
              }
            }
          }
        }
      }
    }
  }
}

 

Das mit cartInput, wobei der Wert merchandiseId die Variante storefrontId ist:

 

{
  "cartInput": {
    "lines": [
      {
        "quantity": 6,
        "merchandiseId": "Z2lkOi8vc2hvcGlmeS9Qcm9kdWN0VmFyaWFudC8zOTgwNTMzMjY1MjIwOA=="
      }
    ]
  }
}

 

 

Du kannst den Storefront API verwenden mit einem mit post Request an https://{shop}.myshopify.com/api/2021-04/graphql.json.

Du kannst auch einen einen "Checkout" mit einem Warenkorb gleichsetzen. Du kannst entweder den Status deines Warenkorbs lokal verwalten und dann einen Checkout erstellen, sobald ein Kunde bereit ist, auszuchecken, oder eine Checkout Mutation für jede relevante Aktion ausführen (add item to cart, remove item from cart, etc.) Shopify hatv auch den js-buy-sdk falls du den GraphQL nicht direkt verwenden möchtest.

Set customer

Du kannst entweder einen Kunden mit einer bestehenden Kunden-ID festlegen oder einen neuen Kunden erstellen und mit der Bestellung verknüpfen. Vorhandener Kunde mit ID:

 

var customerPayload = {
    id: 123
};

 

New customer:

 

var customerPayload = {
    email: 'voisin@gmail.com',
    firstName: 'Sandrine',
    lastName: 'Voisin',
    note: 'First customer of 2019',
};

Copy
var unsubscriber = cart.subscribe(Cart.Action.UPDATE, function (payload) {
  console.log('[Client] setCustomer', payload);
  unsubscriber();
});
cart.dispatch(Cart.Action.SET_CUSTOMER, {
  data: cutomerPayload
});

 

POST /{locale}/cart/add.js

Aber die Cart API wird für die Interaktion mit einem Warenkorb während einer Kundensitzung verwendet. Man kann die Cart API verwenden, um Warenkorbpositionen zu aktualisieren, Warenkorbattribute und Notizen hinzuzufügen und Versandtarife zu generieren. Verwende den POST /{locale}/cart/add.js Endpoint um eine oder mehrere Varianten in den Warenkorb zu legen. Im folgenden Beispiel ist quantity die Varianten Menge und id die Variant ID. Du kannst mehrere Varianten zum Warenkorb hinzufügen, indem du weitere Objekte in der items Array:

 

items: [
  {
   id: 36110175633573,
   quantity: 2
  }
]

 

Um eine serialized Add to Cart form zu senden, gibst du die folgenden Daten in deiner your POST-Anfrage an:

 

jQuery.post(window.Shopify.routes.root + 'cart/add.js', $('form[action$="/cart/add"]').serialize());

 

Unten ist ein vereinfachter POST Request der den fetch API verwendet. Der formData Object ist mit in JavaScript, daher sollte der Content-Type auf application/json im headers Object eingestellt sein. Die Antwort ist das JSON der Positionen, die mit den hinzugefügten Varianten verbunden sind. Wenn sich ein Artikel bereits im Warenkorb befindet, dann ist quantity gleich mit der neuen Menge für diesen Artikel:

 

Example request

Copy
let formData = {
 	'items': [{
  	'id': 36110175633573,
  	'quantity': 2
  	}]
};
fetch(window.Shopify.routes.root + 'cart/add.js', {
  	method: 'POST',
  	headers: {
    	'Content-Type': 'application/json'
  	},
  	body: JSON.stringify(formData)
})
.then(response => {
  	return response.json();
})
.catch((error) => {
  	console.error('Error:', error);
});
Response

Copy
{
  	"items": [
    	{
      	"id": 36110175633573,
      	"title": "Red Rain Coat - Small",
      	"key": "794864229:03af7a8cb59a4c3c45595c76fa8cb53c",
      	"price": 12900,
      	"line_price": 12900,
      	"quantity": 2,
      	"sku": null,
      	"grams": 0,
      	"vendor": "Shopify",
      	"properties": null,
      	"variant_id": 794864229,
      	"gift_card": false,
      	"url": "/products/red-rain-coat?variant=794864229",
      	"featured_image": {
        	"url": "http://cdn.shopify.com/s/files/1/0040/7092/products/red-rain-coat.jpeg?v=1402604893",
        	"aspect_ratio": 1,
        	"alt": "Red rain coat with a hood"
      	},
      	"image": "http://cdn.shopify.com/s/files/1/0040/7092/products/red-rain-coat.jpeg?v=1402604893",
      	"handle": "red-rain-coat",
      	"requires_shipping": true,
      	"product_title": "Red Rain Coat",
      	"product_description": "A bright red rain coat for rainy days!",
      	"product_type": "Coat",
      	"variant_title": "Red",
      	"variant_options": [
        	"Red"
      	],
      	"options_with_values": [
        	{
          	"name": "Color",
          	"value": "Red"
        	}
      	]
    	}
  	]
}

 

Alternativ kannst du auch den FormData constructor verwenden um auf das gewünschte Add-to-Cart-Formular zu zielen:

 

let addToCartForm = document.querySelector('form[action$="/cart/add"]');
let formData = new FormData(addToCartForm);
fetch(window.Shopify.routes.root + 'cart/add.js', {
  method: 'POST',
  body: formData
})
.then(response => {
  return response.json();
})
.catch((error) => {
  console.error('Error:', error);
});

 

Response

Die Response auf eine erfolgreiche POST Request ist ein JSON-Objekt mit den Einzelposten, die mit den hinzugefügten Artikeln verbunden sind.

Wenn sich ein hinzugefügter Artikel bereits im Warenkorb befand, ist die quantity gleich der neuen Menge für diesen Artikel. Wenn die gleichen Artikel jedoch unterschiedliche Preise, Eigenschaften oder Verkaufspläne haben, werden sie in eigene Positionen aufgeteilt.

 

GET /{locale}/cart.js

Verwende den GET /{locale}/cart.js Endpoint um den Warenkorb als JSON zu erhalten.

Alle monetären Eigenschaften werden in der Währung zurückgegeben, in der der Kunde den Einkauf tätigt. Um die Währung des Kunden zu überprüfen, kannst du das currency Field in der Response verwenden. Hier ist mehr über den Verkauf in mehreren Währungen: Migrate your app to support multi-currency.

 

Bei weiteren Fragen dazu bitte einen Experten konsultieren oder deine Frage hier in unserem API Forum posten.

 

VG,

Gabe | Social Care @ Shopify
 - War meine Antwort hilfreich? Klicke Like um es mich wissen zu lassen! 
 - Wurde deine Frage beantwortet? Markiere es als Akzeptierte Lösung 
 - Um mehr zu erfahren, besuche das Shopify Help Center oder den Shopify Blog

Guts
Besucher
3 0 0

Hallo,

 

also was wir planen ist ein Chat Bot, welcher auf Nachfrage einen Artikel dem Warenkorb hinzufügt. Die CustomerID haben wir in dem Moment schon zur Verfügung.

Ich habe jetzt mal versucht in Postman die cartCreate mutation abzuschicken. Der Warenkorb wird anscheinend auch angelegt, da eine positive response zurück kommt

 

{
    "data": {
        "cartCreate": {
            "cart": {
                "id": "gid://shopify/Cart/6182fed9343e4e16c533a2bfecc9f249",
                "createdAt": "2022-10-13T14:21:26Z",
                "updatedAt": "2022-10-13T14:21:26Z",
                "lines": {
                    "edges": []
                }
            }
        }
    }
}

 

Ich weiß allerdings jetzt nicht wie ich cartBuyerIdentityUpdate Mutation anhängen soll?

 

Was ich an der Stelle vermisse: 
Wo definiere ich die Customer ID

Wo definiere ich die Produkt ID welche hinzugefügt werden soll (und QTY)

Guts
Besucher
3 0 0

Hallo, bitte die vorherige Antwort löschen/ignorieren...

 

also was wir planen ist ein Chat Bot, welcher auf Nachfrage einen Artikel dem Warenkorb hinzufügt. Die CustomerID haben wir in dem Moment schon zur Verfügung.

Ich habe jetzt mal versucht in Postman die cartCreate mutation abzuschicken. Der Warenkorb wird anscheinend auch angelegt, da eine positive response zurück kommt.

 

Der Customer wird auch dem Warenkorb zugeordnet (via e-mail Adresse)

 

Wenn ich allerdings versuche einen Artikel hinzuzufügen 

Query

 

mutation cartLinesUpdate($cartId: ID!, $lines: [CartLineUpdateInput!]!) {
  cartLinesUpdate(cartId: $cartId, lines: $lines) {
    cart {
      id
    }
    userErrors {
      field
      message
    }
  }
}

 

 

mit den Variablen: 

 

{
    "cartId": "gid://shopify/Cart/a39d0cea8b06673bce4ceb13dc3d81fd",
    "lines": [
        {
            "quantity": 1,
            "merchandiseId": "gid://shopify/ProductVariant/43166862704899"
        }
    ]
}

 

 

erhalte ich folgenden Fehler

 

{
    "errors": [
        {
            "message": "Variable $lines of type [CartLineUpdateInput!]! was provided invalid value for 0.id (Expected value to not be null)",
            "locations": [
                {
                    "line": 1,
                    "column": 40
                }
            ],
            "extensions": {
                "value": [
                    {
                        "quantity": 1,
                        "merchandiseId": "gid://shopify/ProductVariant/43166862704899"
                    }
                ],
                "problems": [
                    {
                        "path": [
                            0,
                            "id"
                        ],
                        "explanation": "Expected value to not be null"
                    }
                ]
            }
        }
    ]
}

 

 

Gabe
Shopify Staff
17376 2752 4059

@Guts 

 

Den Fehler Variable $lines of type [CartLineUpdateInput!]! was provided invalid value for 0.id (Expected value to not be null) habe in Google gesteckt und siehe da, es gibt einiges an Chatter über diesen Fehler im Web:

 

Variable $id of type ID! was provided invalid value | Graphql API

 

Gabe | Social Care @ Shopify
 - War meine Antwort hilfreich? Klicke Like um es mich wissen zu lassen! 
 - Wurde deine Frage beantwortet? Markiere es als Akzeptierte Lösung 
 - Um mehr zu erfahren, besuche das Shopify Help Center oder den Shopify Blog