Liquid, JavaScript, Themes
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.
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.
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
});
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.
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
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)
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"
}
]
}
}
]
}
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
Teil 2 - Wie die Prinzipien des UX-Designs dir dabei helfen können einen großartigen Shop ...
By Kai Sep 16, 2024Teil 1 - Wie die Prinzipien des UX-Designs dir dabei helfen können einen großartigen Shop ...
By Kai Sep 9, 2024Anpassungen des benutzerdefinierten Codes an Shopify-Themes (CSS) leicht gemachtIn diesem...
By Gabe Aug 28, 2024