DeenruvDeenruv
Budowanie sklepu

Proces realizacji zamówienia

Dowiedz się, jak zaimplementować kompletny proces realizacji zamówienia, obejmujący dane klienta, adres dostawy, metodę wysyłki i przetwarzanie płatności.

Gdy klient dodał już wybrane produkty do aktywnego zamówienia, nadszedł czas na realizację zamówienia.

Ten przewodnik zakłada, że używasz domyślnego procesu zamówienia, więc jeśli zdefiniowałeś niestandardowy proces, niektóre z tych kroków mogą się nieznacznie różnić.

W tym przewodniku zakładamy, że fragment ActiveOrder został zdefiniowany, zgodnie z opisem w przewodniku zarządzania aktywnym zamówieniem, ale na potrzeby realizacji zamówienia fragment powinien również zawierać pola customer, shippingAddress i billingAddress.

Dodawanie klienta

Każde zamówienie musi być powiązane z klientem. Jeśli klient nie jest zalogowany, należy wywołać mutację setCustomerForOrder. Spowoduje to utworzenie nowego rekordu klienta, jeśli podany adres email nie istnieje jeszcze w bazie danych.

Jeśli klient jest już zalogowany, ten krok jest pomijany.

mutation SetCustomerForOrder($input: CreateCustomerInput!) {
    setCustomerForOrder(input: $input) {
        ...ActiveOrder
        ... on ErrorResult {
            errorCode
            message
        }
    }
}
{
    "input": {
        "title": "Mr.",
        "firstName": "Bob",
        "lastName": "Dobalina",
        "phoneNumber": "1234556",
        "emailAddress": "[email protected]"
    }
}

Ustawianie adresu dostawy

Mutacja setOrderShippingAddress musi być wywołana, aby ustawić adres dostawy dla zamówienia.

mutation SetOrderShippingAddress($input: CreateAddressInput!) {
    setOrderShippingAddress(input: $input) {
        ...ActiveOrder
        ... on ErrorResult {
            errorCode
            message
        }
    }
}
{
    "input": {
        "fullName": "John Doe",
        "company": "ABC Inc.",
        "streetLine1": "123 Main St",
        "streetLine2": "Apt 4B",
        "city": "New York",
        "province": "NY",
        "postalCode": "10001",
        "countryCode": "US",
        "phoneNumber": "123-456-7890",
        "defaultShippingAddress": true,
        "defaultBillingAddress": false
    }
}

Jeśli klient jest zalogowany, możesz sprawdzić jego istniejące adresy i wstępnie wypełnić formularz adresowy, jeśli znajdziesz istniejący adres.

query GetCustomerAddresses {
    activeCustomer {
        id
        addresses {
            id
            fullName
            company
            streetLine1
            streetLine2
            city
            province
            postalCode
            country {
                code
                name
            }
            phoneNumber
            defaultShippingAddress
            defaultBillingAddress
        }
    }
}
{
    "data": {
        "activeCustomer": {
            "id": "123456",
            "addresses": [
                {
                    "id": "123",
                    "fullName": "John Doe",
                    "company": "",
                    "streetLine1": "123 Main St",
                    "streetLine2": "Apt 4B",
                    "city": "New York",
                    "province": "NY",
                    "postalCode": "10001",
                    "country": {
                        "code": "US",
                        "name": "United States"
                    },
                    "phoneNumber": "123-456-7890",
                    "defaultShippingAddress": true,
                    "defaultBillingAddress": false
                },
                {
                    "id": "124",
                    "fullName": "John Doe",
                    "company": "",
                    "streetLine1": "456 Elm St",
                    "streetLine2": "",
                    "city": "Los Angeles",
                    "province": "CA",
                    "postalCode": "90001",
                    "country": {
                        "code": "US",
                        "name": "United States"
                    },
                    "phoneNumber": "987-654-3210",
                    "defaultShippingAddress": false,
                    "defaultBillingAddress": true
                }
            ]
        }
    }
}

Wybór metody wysyłki

Teraz, gdy znamy adres dostawy, możemy sprawdzić dostępne metody wysyłki za pomocą zapytania eligibleShippingMethods.

query GetShippingMethods {
    eligibleShippingMethods {
        id
        price
        description
    }
}
{
    "data": {
        "eligibleShippingMethods": [
            {
                "id": "1",
                "price": 545,
                "description": "Standard Shipping"
            },
            {
                "id": "2",
                "price": 1250,
                "description": "Expedited Shipping"
            },
            {
                "id": "3",
                "price": 1695,
                "description": "Overnight Shipping"
            }
        ]
    }
}

Wyniki mogą być następnie wyświetlone klientowi, aby mógł wybrać pożądaną metodę wysyłki. Jeśli jest tylko jeden wynik, może zostać automatycznie wybrany.

Identyfikator wybranej metody wysyłki jest następnie przekazywany do mutacji setOrderShippingMethod.

mutation SetShippingMethod($id: [ID!]!) {
    setOrderShippingMethod(shippingMethodId: $id) {
        ...ActiveOrder
        ... on ErrorResult {
            errorCode
            message
        }
    }
}

Dodawanie płatności

Zapytanie eligiblePaymentMethods może być użyte do pobrania listy dostępnych metod płatności. Ta lista może być następnie wyświetlona klientowi, aby mógł wybrać pożądaną metodę płatności.

query GetPaymentMethods {
    eligiblePaymentMethods {
        id
        name
        code
        isEligible
    }
}
{
  "data": {
    "eligiblePaymentMethods": [
      {
        "id": "1",
        "name": "Stripe",
        "code": "stripe",
        "isEligible": true
      },
      {
        "id": "2",
        "name": "Apple Pay",
        "code": "apple-pay",
        "isEligible": true
      },
      {
        "id": "3",
        "name": "Pay on delivery",
        "code": "pay-on-delivery",
        "isEligible": false
      }
    ]
  }
}

Następnie musimy przenieść zamówienie do stanu ArrangingPayment. Ten stan zapewnia, że żadne inne zmiany nie mogą być dokonywane w zamówieniu podczas organizowania płatności. Mutacja transitionOrderToState służy do przeniesienia zamówienia do stanu ArrangingPayment.

mutation TransitionToState($state: String!) {
    transitionOrderToState(state: $state) {
        ...ActiveOrder
        ... on OrderStateTransitionError {
            errorCode
            message
            transitionError
            fromState
            toState
        }
    }
}
{
    "state": "ArrangingPayment"
}

W tym momencie Twój sklep użyje integracji z dostawcą płatności do zebrania danych płatniczych klienta, a dokładna sekwencja wywołań API będzie zależeć od integracji płatniczej.

Mutacja addPaymentToOrder jest uniwersalną mutacją do dodawania płatności do zamówienia. Przyjmuje argument method, który musi odpowiadać code wybranej metody płatności, oraz argument metadata, który jest obiektem JSON zawierającym dodatkowe informacje wymagane przez daną integrację.

Na przykład, dane demo wypełniane w nowej instalacji Deenruv zawierają metodę „Standard Payment", która używa dummyPaymentHandler do symulacji dostawcy płatności. Oto jak dodałbyś płatność za pomocą tej metody:

mutation AddPaymentToOrder($input: PaymentInput!) {
    addPaymentToOrder(input: $input) {
        ...ActiveOrder
        ... on ErrorResult {
            errorCode
            message
        }
    }
}
{
    "method": "standard-payment",
    "metadata": {
        "shouldDecline": false,
        "shouldError": false,
        "shouldErrorOnSettle": false
    }
}

Inne integracje płatnicze mają specyficzne instrukcje konfiguracji, które musisz wykonać:

Stripe

Nasza dokumentacja StripePlugin opisuje, jak skonfigurować checkout do korzystania ze Stripe.

Braintree

Nasza dokumentacja BraintreePlugin opisuje, jak skonfigurować checkout do korzystania z Braintree.

Mollie

Nasza dokumentacja MolliePlugin opisuje, jak skonfigurować checkout do korzystania z Mollie.

Inni dostawcy płatności

Więcej informacji o integracji z dostawcą płatności znajdziesz w przewodniku Płatności.

Wyświetlanie potwierdzenia

Po zakończeniu procesu realizacji zamówienia, zamówienie nie będzie już uważane za „aktywne" (zobacz OrderPlacedStrategy), więc zapytanie activeOrder zwróci null. Zamiast tego można użyć zapytania orderByCode, aby pobrać zamówienie po jego kodzie i wyświetlić stronę potwierdzenia.

query GetOrderByCode($code: String!) {
    orderByCode(code: $code) {
        ...Order
    }
}
{
    "code": "PJGY46GCB1EDU9YH"
}

Domyślnie Deenruv zezwala na dostęp do zamówienia po kodzie tylko przez pierwsze 2 godziny od złożenia zamówienia, jeśli klient nie jest zalogowany. Ma to na celu zapobieżenie sytuacji, w której złośliwy użytkownik zgaduje kody zamówień i przegląda zamówienia innych klientów. Można to skonfigurować za pomocą OrderByCodeAccessStrategy.

Na tej stronie