Sipariş gönderme ayarlarını yapma

Ödeme aramasından sonra kullanıcı, güncellenen alışveriş sepetini vergiler, teslimat ücretleri, indirimler ve iade ettiğiniz diğer ücretlerle birlikte inceler. Kullanıcı siparişi onaylar ve gönderir. Ardından Google, sipariş karşılama uç noktanıza siparişle ilgili bilgileri içeren bir JSON isteği gönderir. Web hizmetiniz bu siparişi almalı, işlemeli ve Google'a siparişin durumunu bildirmelidir.

Bu bölümde, Google tarafından gönderilen sipariş isteği mesajı biçimi (SubmitOrderRequestMessage) ve sağlamanız gereken yanıt mesajının (SubmitOrderResponseMessage) biçimi açıklanmaktadır. Sipariş karşılama yaşam döngüsü hakkında daha fazla bilgi için Sipariş karşılamaya genel bakış konusuna bakın.

Sipariş karşılama uygulaması

Sipariş Verme Uçtan Uca ile çalışmak üzere oluşturduğunuz Sipariş Verme Uçtan Uca web hizmeti, Google'dan sipariş mesajları almak için bir URL uç noktası içermelidir. Sipariş işleme için web hizmetiniz, Google'dan POST isteği olarak JSON biçiminde bir SubmitOrderRequestMessage alır. Bu istek; vergiler, ücretler ve ödeme bilgileri dahil olmak üzere bir müşteri siparişini içeriyor. Sipariş gönderme isteği aldıktan sonra, web hizmetiniz aşağıdakileri yapmalıdır:

  • Kart doğrulama veya sahtekarlık tespiti gibi işlem uygunluğunu kontrol edin.
  • Sisteminizde bir sipariş oluşturun.
  • Ödeme yöntemini yetkilendirin ve uygun olduğunda ödeme işleyicinizin ödeme API'sini çağırın.
  • Siparişin uygun durumuyla yanıt verin: CREATED, CONFIRMED veya REJECTED.

Siparişiniz işlendikten sonra, karşılama kodunuz SubmitOrderResponseMessage JSON mesajı biçiminde Google'a yanıt vermelidir.

Sipariş uçtan uca sipariş karşılama web hizmeti uygulama şartları hakkında daha fazla bilgi için Sipariş karşılamaya genel bakış sayfasını inceleyin.

Sipariş isteği mesajı

Bir müşteri, Sipariş Verme Uçtan Uca akışı sırasında sipariş vermeyi seçtiğinde Google, web hizmetinize aşağıdaki verileri içeren SubmitOrderRequestMessage adlı bir JSON mesajıyla istek gönderir:

  1. Amaç: Her gönderme siparişi isteği gövdesinin inputs[0].intent alanı, actions.intent.TRANSACTION_DECISION dize değerini içerir.
  2. Sipariş: Bir sipariş gönderme isteğinin inputs[0].arguments[0].transactionDecisionValue alanı, ödeme ayrıntılarıyla birlikte müşterinin verilecek siparişini temsil eden bir Order nesnesi içerir.
  3. Korumalı alan işareti: Sipariş gönderme isteğinin isInSandbox alanı, işlemin korumalı alan ödemelerini kullanıp kullanmadığını belirtir.

Sipariş isteği örneği

Aşağıda, bir SubmitOrderRequestMessage örneği verilmiştir:

JSON

{
    "user": {},
    "conversation": {
        "conversationId": "CTKbKfUlHCyDEdcz_5PBJTtf"
    },
    "inputs": [
        {
            "intent": "actions.intent.TRANSACTION_DECISION",
            "arguments": [
                {
                    "transactionDecisionValue": {
                        "order": {
                            "finalOrder": {
                                "cart": {
                                    "merchant": {
                                        "id": "restaurant/Restaurant/QWERTY",
                                        "name": "Tep Tep Chicken Club"
                                    },
                                    "lineItems": [
                                        {
                                            "name": "Spicy Fried Chicken",
                                            "type": "REGULAR",
                                            "id": "299977679",
                                            "quantity": 2,
                                            "price": {
                                                "type": "ESTIMATE",
                                                "amount": {
                                                    "currencyCode": "AUD",
                                                    "units": "39",
                                                    "nanos": 600000000
                                                }
                                            },
                                            "offerId": "MenuItemOffer/QWERTY/scheduleId/496/itemId/143",
                                            "extension": {
                                                "@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension"
                                            }
                                        }
                                    ],
                                    "extension": {
                                        "@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension",
                                        "fulfillmentPreference": {
                                            "fulfillmentInfo": {
                                                "delivery": {
                                                    "deliveryTimeIso8601": "P0M"
                                                }
                                            }
                                        },
                                        "location": {
                                            "coordinates": {
                                                "latitude": -33.8376441,
                                                "longitude": 151.0868736
                                            },
                                            "formattedAddress": "Killoola St, 1, Concord West NSW 2138",
                                            "zipCode": "2138",
                                            "city": "Concord West",
                                            "postalAddress": {
                                                "regionCode": "AU",
                                                "postalCode": "2138",
                                                "administrativeArea": "NSW",
                                                "locality": "Concord West",
                                                "addressLines": [
                                                    "Killoola St",
                                                    "1"
                                                ]
                                            }
                                        },
                                        "contact": {
                                            "displayName": "Hab Sy",
                                            "email": "hab9878.sy@gmail.com",
                                            "phoneNumber": "+61000000000",
                                            "firstName": "Hab",
                                            "lastName": "Sy"
                                        }
                                    }
                                },
                                "otherItems": [
                                    {
                                        "name": "Delivery fee",
                                        "type": "DELIVERY",
                                        "price": {
                                            "type": "ESTIMATE",
                                            "amount": {
                                                "currencyCode": "AUD",
                                                "units": "3",
                                                "nanos": 500000000
                                            }
                                        }
                                    },
                                    {
                                        "name": "Subtotal",
                                        "type": "SUBTOTAL",
                                        "price": {
                                            "type": "ESTIMATE",
                                            "amount": {
                                                "currencyCode": "AUD",
                                                "units": "39",
                                                "nanos": 600000000
                                            }
                                        }
                                    }
                                ],
                                "totalPrice": {
                                    "type": "ESTIMATE",
                                    "amount": {
                                        "currencyCode": "AUD",
                                        "units": "43",
                                        "nanos": 100000000
                                    }
                                },
                                "extension": {
                                    "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension"
                                }
                            },
                            "googleOrderId": "01412971004192156198",
                            "orderDate": "2020-10-22T09:02:06.173Z",
                            "paymentInfo": {
                                "displayName": "Pay when you get your food",
                                "paymentType": "ON_FULFILLMENT"
                            }
                        }
                    }
                }
            ]
        }
    ],
    "directActionOnly": true,
    "isInSandbox": true
}
    

Sipariş yanıtı mesajı

İstek aldıktan sonra, Sipariş Verme Uçtan Uca web hizmetiniz isteği işler ve aşağıdaki verileri içeren bir SubmitOrderResponseMessage gönderir:

  • OrderUpdate: Siparişin durumunu ve yanıtın finalResponse.richResponse.items[0].structuredResponse.orderUpdate alanında tanımladığınız destek ekibiyle iletişime geçme ve sipariş ayrıntılarını görüntüleme gibi kullanıcının gerçekleştirebileceği sipariş sonrası işlemlerini içeren bir nesne.

Sipariş güncelleme alanı

Web hizmetiniz bir SubmitOrderResponseMessage gönderdiğinde bu alan, aşağıdaki alanları içeren bir OrderUpdate alanı içerir:

  • actionOrderId: Sistemdeki siparişi benzersiz bir şekilde tanımlamak ve sonraki sipariş güncellemelerini gönderirken buna referans vermek için kullanılan siparişin benzersiz kimliği.
  • orderState: Siparişin durumunu temsil eden bir OrderState nesnesi.
  • orderManagementActions: Kullanıcının kullanabileceği sipariş sonrası işlemleri (ör. müşteri desteğiyle iletişime geçme ve sipariş ayrıntılarını görüntüleme).
  • totalPrice: Siparişin toplam fiyatı. Bu işlem isteğe bağlıdır. Yalnızca siparişin toplam fiyatı sipariş gönderildikten sonra değiştiyse gönderin.

Sipariş, aşağıdaki durumlardan birinde olabilir:

  • CREATED: Sipariş karşılama uç noktanız siparişi başarıyla işledi, ancak sağlayıcı henüz siparişi onaylamadı.
  • CONFIRMED: Sipariş karşılama uç noktanız siparişi başarıyla işledi ve sağlayıcı siparişi onayladı.
  • REJECTED: Bir sorun oluştu ve sipariş karşılama uç noktanız siparişi oluşturamadı veya onaylayamadı. Bu durum ödemeyle ilgili sorunlar olabilir.

Bir siparişi REJECTED durumu olarak ayarlarsanız OrderUpdate öğesinin rejectionInfo alanında nedeni belirtin. FoodOrderUpdateExtension.FoodOrderErrors değerlerini UNKNOWN türünde rejectionInfo ile birlikte kullanın ve bir açıklama girin.

Sipariş yanıtı örneği

Aşağıda, bir SubmitOrderResponseMessage örneği verilmiştir:

JSON

{
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "structuredResponse": {
            "orderUpdate": {
              "actionOrderId": "1603357328160",
              "orderState": {
                "state": "CONFIRMED",
                "label": "Pending"
              },
              "updateTime": "2020-10-22T02:02:08-07:00",
              "orderManagementActions": [
                {
                  "type": "CUSTOMER_SERVICE",
                  "button": {
                    "title": "Call customer service",
                    "openUrlAction": {
                      "url": "tel:+61234561000"
                    }
                  }
                },
                {
                  "type": "VIEW_DETAILS",
                  "button": {
                    "title": "View order details",
                    "openUrlAction": {
                      "url": "https://partner.com/view/orderstatus"
                    }
                  }
                }
              ],
              "receipt": {
                "userVisibleOrderId": "BXZ-1603357328"
              }
            }
          }
        }
      ]
    }
  }
}

Başarısız istek

Gönderme isteği başarısız olursa SubmitOrderResponseMessage, OrderState.state değerini REJECTED olarak ayarlamalıdır. Yanıtta, hata türünü açıklayan bir RejectionType nesnesi içeren RejectionInfo de bulunmalıdır.

Başarısız yanıt örneği

JSON

{
  "expectUserResponse": false,
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "structuredResponse": {
            "orderUpdate": {
              "actionOrderId": "sample_action_order_id",
              "orderState": {
                "state": "REJECTED",
                "label": "Order rejected"
              },
              "updateTime": "2017-05-10T02:30:00.000Z",
              "rejectionInfo": {
                "type": "PAYMENT_DECLINED",
                "reason": "Insufficient funds"
              },
              "orderManagementActions": [
                {
                  "type": "CUSTOMER_SERVICE",
                  "button": {
                    "title": "Contact customer service",
                    "openUrlAction": {
                      "url": "mailto:support@example.com"
                    }
                  }
                },
                {
                  "type": "EMAIL",
                  "button": {
                    "title": "Email restaurant",
                    "openUrlAction": {
                      "url": "mailto:person@example.com"
                    }
                  }
                },
                {
                  "type": "CALL",
                  "button": {
                    "title": "Call restaurant",
                    "openUrlAction": {
                      "url": "tel:+16505554679"
                    }
                  }
                },
                {
                  "type": "VIEW_DETAILS",
                  "button": {
                    "title": "View order",
                    "openUrlAction": {
                      "url": "https://orderview.partner.com?orderid=sample_action_order_id"
                    }
                  }
                }
              ]
            }
          }
        }
      ]
    }
  }
}
    

Sipariş uygulamasını gönderme

Sipariş gönderme API'si uygulanırken aşağıdaki adımlar gerçekleştirilmelidir.

Doğrulama

  1. Hizmet, alışveriş sepeti ve promosyon doğrulamalarını Ödeme Kurulumu'nda yapıldığı gibi gerçekleştirin.
  2. Gerekirse aşağıdaki türlerden biriyle RejectionInfo döndürün:
RejectionInfoType Kullanım alanı
UNAVAILABLE_SLOT Sipariş karşılama zamanı artık geçerli değil.
PROMO_USER_INELIGIBLE Kullanıcı için promosyon uygunluğunu doğrulamak üzere istekteki Contact (İletişim) nesnesindeki e-posta adresini kullanın. Promosyonlarla sipariş gönderme uygulama bölümündeki örneğe bakın.
INELIGIBLE
  • Telefon numarası veya e-posta adresi gibi kullanıcı bilgileri geçerli değildir.
  • Risk motorunuz sahtekarlığı tespit eder.
PAYMENT_DECLINED Ödeme işlenemiyor. Örneğin, bu durumun nedeni bakiyenin yetersiz olması olabilir.
UNKNOWN Diğer doğrulama hataları için.

Karşılaşılan doğrulama hataları olursa OrderState.state değerini REJECTED olarak ayarlayın. İsteğe bağlı olarak, FoodOrderUpdateExtension'ı kullanarak belirli bir reddedilme nedeni belirtebilirsiniz.foodOrderErrors. Sipariş doğrulaması gönderme bölümündeki örneklere bakın.

Ödemeyi işleme koy

  1. Alışveriş sepeti fiyatı, ücretler, indirim, vergiler ve bahşiş ekleyerek totalPrice hesaplayın. totalPrice, CheckoutResponseMessage'da döndürülen totalPrice ile aynı olmalıdır ve hediye bedeli kullanıcı tarafından değiştirilebiliyorsa bahşiş miktarındaki değişiklik olmalıdır. Daha fazla bilgi için Sipariş gönderme sırasındaki fiyat değişiklikleri bölümüne bakın.
  2. Sipariş durumu CREATED veya CONFIRMED olan bir yanıt gönderirseniz siparişi ve ödemeyi işleyin.
  3. İstemci kitaplıkları oluşturma bölümünde açıklandığı gibi şemadan oluşturulan türleri kullanarak geçerli bir yanıt biçimi döndürüldüğünden emin olun.
  4. Ödemeyi işlemek için GoogleProvidedPaymentInstrument.instrumentToken kullanın. Ödeme işleme koyulamazsa PAYMENT_DECLINED türünde RejectionInfo öğesini döndürün. Daha ayrıntılı bilgi için Ödemeleri işleme bölümüne bakın.
  5. Sipariş E-posta ve/veya SMS ile işlendikten hemen sonra kullanıcıyı bilgilendirin.

Yanıtı geri ver

  1. Hata yoksa OrderState.state değerini CREATED veya CONFIRMED olarak ayarlayın.
  2. Hatalarla karşılaşılırsa OrderState.state değerini REJECTED olarak ayarlayın ve karşılık gelen RejectionInfoType
  3. OrderUpdate'i ayarlayın.orderManagementActions.