Sipariş gönderme özelliğini ayarlama

Ödeme görüşmesi sonrasında kullanıcı, vergiler, teslimat ücretleri, indirimler ve iade ettiğiniz diğer ücretlerin yer aldığı güncellenmiş alışveriş sepetini inceler. Kullanıcı siparişi onaylar ve gönderir. Google, sipariş bilgilerini içeren bir JSON isteği yerine getirme uç noktanıza gönderir. Web hizmetiniz bu siparişi almalı, işlemeli ve siparişin durumunu Google'a yanıt olarak göndermelidir.

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

Sipariş karşılama uygulaması

Ordering End-to-End ile çalışmak için oluşturduğunuz Ordering End-to-End 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şi içerir. Web hizmetiniz, sipariş gönderme isteği aldıktan sonra aşağıdakileri yapmalıdır:

  • Kart doğrulama veya sahtekarlık algılama gibi işlem uygunluğunu kontrol edin.
  • Sisteminizde bir sipariş oluşturun.
  • Ödeme yöntemini yetkilendirin ve geçerli olduğunda ödeme işleyicinizin ödeme API'sini çağırın.
  • Siparişle ilgili durumu belirtin: CREATED, CONFIRMED veya REJECTED.

Sipariş işlendikten sonra, sipariş tamamlama kodunuz Google'a SubmitOrderResponseMessage JSON mesajı biçiminde bir yanıt sağlamalıdır.

Sipariş Sondan Sona Siparişin Yerine Getirilmesi web hizmeti uygulama şartları hakkında daha fazla bilgi için Siparişin yerine getirilmesine genel bakış başlıklı makaleyi inceleyin.

Sipariş isteği mesajı

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

  1. Amaç: Her sipariş gönderme istek gövdesinin inputs[0].intent alanında actions.intent.TRANSACTION_DECISION dize değeri bulunur.
  2. Sipariş: Sipariş gönderme isteğinin inputs[0].arguments[0].transactionDecisionValue alanında, müşterinin vereceği siparişi ve ödeme ayrıntılarını temsil eden bir Order nesnesi bulunur.
  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 örnek SubmitOrderRequestMessage 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ı

Sipariş uçtan uca web hizmetiniz, bir istek aldıktan sonra isteği işler ve aşağıdaki verileri içeren bir SubmitOrderResponseMessage döndürür:

  • OrderUpdate: Siparişin durumunu ve kullanıcının sipariş sonrası yapabileceği tüm işlemleri (ör. destek ekibiyle iletişime geçme ve sipariş ayrıntılarını görüntüleme) içeren bir nesne. Bu nesneyi yanıtın finalResponse.richResponse.items[0].structuredResponse.orderUpdate alanında tanımlarsınız.

Sipariş güncelleme alanı

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

  • actionOrderId: Siparişi sisteminizde benzersiz şekilde tanımlamak ve sonraki sipariş güncellemelerini gönderirken siparişe 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 sipariş sonrası yapabileceği işlemler (ö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ş gönderildikten sonra siparişin toplam fiyatı değiştiyse gönderin.

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

  • CREATED: Karşılama uç noktanız siparişi başarıyla işledi ancak sağlayıcı henüz siparişi onaylamamıştır.
  • 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 sorunlardan kaynaklanabilir.

Bir siparişi REJECTED durumuna ayarlarsanız nedeni OrderUpdate öğesinin rejectionInfo alanında belirtin. UNKNOWN türündeki rejectionInfo ile birlikte FoodOrderUpdateExtension.FoodOrderErrors değerleri kullanın ve açıklama sağlayın.

Sipariş yanıtı örneği

Aşağıda bir örnek SubmitOrderResponseMessage 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'nin OrderState.state değerini REJECTED olarak ayarlaması gerekir. Yanıtta, hata türünü tanımlayan bir RejectionType nesnesi içeren RejectionInfo da 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 uygulanmalıdır.

Doğrulama

  1. Ödeme ayarlama bölümünde olduğu gibi hizmet, alışveriş sepeti ve promosyon doğrulamalarını yapın.
  2. Gerekirse RejectionInfo öğesini aşağıdaki türlerden biriyle döndürün:
RejectionInfoType Kullanım alanı
UNAVAILABLE_SLOT Teslimat süresi artık geçerli değil.
PROMO_USER_INELIGIBLE Kullanıcının promosyon uygunluğunu doğrulamak için istekteki Kişi nesnesinde E-posta'yı kullanın. Promosyonlarla sipariş gönderme özelliğini uygulama başlıklı makaledeki örneği inceleyin.
INELIGIBLE
  • Telefon numarası veya e-posta gibi kullanıcı bilgileri geçerli değil.
  • Risk motorunuz sahtekarlık algılar.
PAYMENT_DECLINED Ödeme işlenemiyor. Örneğin, bu durum yetersiz bakiyeden kaynaklanıyor olabilir.
UNKNOWN Diğer tüm doğrulama hataları için.

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

Ödemeyi işleme

  1. Alışveriş sepeti fiyatını, ücretleri, indirimi, vergileri ve bahşişi ekleyerek totalPrice değerini hesaplayın. totalPrice, CheckoutResponseMessage içinde döndürülen totalPrice ile aynı olmalı ve bahşiş kullanıcı tarafından değiştirilebiliyorsa bahşiş tutarındaki değişiklik eklenmelidir. Daha fazla bilgi için Sipariş gönderme sırasında fiyat değişiklikleri başlıklı makaleyi inceleyin.
  2. CREATED veya CONFIRMED sipariş durumuyla yanıt döndürürseniz siparişi ve ödemeyi işleme alın.
  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çiminin döndürüldüğünden emin olun.
  4. Ödemeyi işlemek için GoogleProvidedPaymentInstrument.instrumentToken değerini kullanın. Ödeme işlenemediyse PAYMENT_DECLINED türüne sahip RejectionInfo döndürün. Daha fazla bilgi için Ödemeleri işleme başlıklı makaleyi inceleyin.
  5. Sipariş işlendikten hemen sonra kullanıcıyı e-posta ve/veya SMS ile bilgilendirin.

Yanıtı döndürme

  1. Hata yoksa OrderState.state öğesini CREATED veya CONFIRMED olarak ayarlayın.
  2. Karşılaşılan hatalar varsa OrderState.state değerini REJECTED olarak ayarlayın ve RejectionInfo nesnesini ilgili RejectionInfoType ile ekleyin.
  3. OrderUpdate'i ayarlayın.orderManagementActions.