REST API - Anlegen eines Kunden samt Adresse

Guten Morgen zusammen,

ich möchte über die REST API mit cURL einen Kunden anlegen, soweit so gut, das funktioniert auch. Nun würde ich diesem Kunden auch seine Adresse mitgeben wollen. Allerdings fordert der Endpoint customer die Adresse als uuid. Diese kenne ich doch garnicht, wenn der Kunde bspw. neu ist.

Wie gehe ich denn nun vor, ich hatte mir gedacht das ich den Kunden einfach samt Adresse in einem POST übergebe, ist das garnicht möglich?

JSON-Objekt:

{"type":"customer",
"groupId":"cfbd5018d38d41d8adca10d94fc8bdd6",
"defaultPaymentMethodId":"b5443e8581ad42e9918a8313b9a994ce",
"salesChannelId":"4cf85b3816fb4dcba3361c7ae3ba88db",
"languageId":"2fbb5fe2e29a4d70aa5854ce7ce3e20b",
"customerNumber":"669966",
"salutationId":"69b9dcadb5aa4a9f93215e7cfda1eba8",
"firstName":"XY",
"lastName":"YX",
"email":"xy.yx@xxyy.de",
"createdAt":"2020-10-23T08:30:56.244+00:00",
"company":"XXYyy xyxy",
"street":"K\u00f6nigbacher Stra\u00dfe 666",
"zipcode":"12345",
"city":"Testburg"}

Oder gehe ich dann über den Sync-Endpoint und übergebe die Adresse der customer_address und die Kundenstammdaten an customer?

Vielen Dank und ein schönes Wochenende!

ent_dev

Thumb-Up UPDATE:

Hallo zusammen,

mittlerweile bin ich so weit, dass ich mir das Model aus der CustomerGenerator.php geholt habe und meine Schnittstelle angepasst hab.

    $id = uniqid();
    $shippingAddressId = uniqid();
    $billingAddressId = uniqid();

    $customer = [
        'id' => $id,
        'customerNumber' => '1337',
        'salutationId' => '69b9dcadb5aa4a9f93215e7cfda1eba8',
        'firstName' => 'Max',
        'type' => 'customer',
        'lastName' => 'Mustermann',
        'email' => 'test@example.com',
        'password' => 'shopware',
        'defaultPaymentMethodId' => 'b5443e8581ad42e9918a8313b9a994ce',
        'groupId' => 'cfbd5018d38d41d8adca10d94fc8bdd6',
        'salesChannelId' => uniqid(),
        'defaultBillingAddressId' => $billingAddressId,
        'defaultShippingAddressId' => $shippingAddressId,
        'addresses' => [
            [
                'id' => $shippingAddressId,
                'customerId' => $id,
                'salutationId' => '69b9dcadb5aa4a9f93215e7cfda1eba8',
                'firstName' => 'Max',
                'lastName' => 'Mustermann',
                'street' => 'Ebbinghoff 10',
                'zipcode' => '48624',
                'city' => 'Schöppingen',
            ],
            [
                'id' => $billingAddressId,
                'customerId' => $id,
                'countryId' => '69b9dcadb5aa4a9f93215e7cfda1eba8',
                'salutationId' => '69b9dcadb5aa4a9f93215e7cfda1eba8',
                'firstName' => 'Max',
                'lastName' => 'Mustermann',
                'street' => 'Bahnhofstraße 27',
                'zipcode' => '10332',
                'city' => 'Berlin',
            ],
        ],
    ];

Im ersten Schritt generiere ich mir die UUID’s für $id , $shippingAdressId und $billingAddressId. Anschließend erstelle ich ein Array und befülle es mit den entsprechenden Daten. Anschließend json_encode [blabla].

Meine erste Frage habe ich mir damit selbst beantwortet. Ich habe mir die _info/open-api-schema.json angeschaut und festgestellt, dass man via addresses die beiden Objekte übergibt und mit customer_id referenziert.

 

Dies funktioniert allerdings immer noch nicht! Ich erhalte folgende Fehlermeldung: Expected primary key field id for definition

{"errors":[{"status":"500","code":"FRAMEWORK__PRIMARY_KEY_NOT_PROVIDED","title":"Internal Server Error","detail":"Expected primary key field id for definition Shopware\\Core\\Checkout\\Customer\\CustomerDefinition not provided","meta":{"parameters":{"definition":"Shopware\\Core\\Checkout\\Customer\\CustomerDefinition","propertyName":"id"}}}]}

Weiß hier jemand weiter? Ich wäre seeeehr dankbar! :smiley:

Hast du mal geschaut wie das im Admin gemacht wird?
Generell kannst du ja einen Kunden anlegen und du siehst im Networkbrowser immer auch die API-Calls und den Payload. Da solltest du das einfach 1:1 übernehmen können.

1 „Gefällt mir“

@Moritz Naczenski schrieb:

Hast du mal geschaut wie das im Admin gemacht wird?
Generell kannst du ja einen Kunden anlegen und du siehst im Networkbrowser immer auch die API-Calls und den Payload. Da solltest du das einfach 1:1 übernehmen können.

Es kann so einfach sein … Vielen Dank!