Ö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
veyaREJECTED
.
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:
- Amaç: Her gönderme siparişi isteği gövdesinin
inputs[0].intent
alanı,actions.intent.TRANSACTION_DECISION
dize değerini içerir. - 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 birOrder
nesnesi içerir. - 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ınfinalResponse.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 birOrderState
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
- Hizmet, alışveriş sepeti ve promosyon doğrulamalarını Ödeme Kurulumu'nda yapıldığı gibi gerçekleştirin.
- 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 |
|
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
- Alışveriş sepeti fiyatı, ücretler, indirim, vergiler ve bahşiş ekleyerek
totalPrice
hesaplayın.totalPrice
, CheckoutResponseMessage'da döndürülentotalPrice
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. - Sipariş durumu
CREATED
veyaCONFIRMED
olan bir yanıt gönderirseniz siparişi ve ödemeyi işleyin. - İ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.
- Ödemeyi işlemek için
GoogleProvidedPaymentInstrument.
instrumentToken
kullanın. Ödeme işleme koyulamazsaPAYMENT_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. - Sipariş E-posta ve/veya SMS ile işlendikten hemen sonra kullanıcıyı bilgilendirin.
Yanıtı geri ver
- Hata yoksa OrderState.
state
değeriniCREATED
veyaCONFIRMED
olarak ayarlayın. - Hatalarla karşılaşılırsa OrderState.
state
değeriniREJECTED
olarak ayarlayın ve karşılık gelen RejectionInfoType - OrderUpdate'i ayarlayın.
orderManagementActions
.