Ö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
veyaREJECTED
.
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:
- Amaç: Her sipariş gönderme istek gövdesinin
inputs[0].intent
alanındaactions.intent.TRANSACTION_DECISION
dize değeri bulunur. - 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 birOrder
nesnesi bulunur. - 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:
{ "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ınfinalResponse.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 birOrderState
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:
{ "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
{ "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
- Ödeme ayarlama bölümünde olduğu gibi hizmet, alışveriş sepeti ve promosyon doğrulamalarını yapın.
- 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 |
|
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
- 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ülentotalPrice
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. CREATED
veyaCONFIRMED
sipariş durumuyla yanıt döndürürseniz siparişi ve ödemeyi işleme alın.- İ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.
- Ödemeyi işlemek için GoogleProvidedPaymentInstrument.
instrumentToken
değerini kullanın. Ödeme işlenemediysePAYMENT_DECLINED
türüne sahip RejectionInfo döndürün. Daha fazla bilgi için Ödemeleri işleme başlıklı makaleyi inceleyin. - Sipariş işlendikten hemen sonra kullanıcıyı e-posta ve/veya SMS ile bilgilendirin.
Yanıtı döndürme
- Hata yoksa OrderState.
state
öğesiniCREATED
veyaCONFIRMED
olarak ayarlayın. - Karşılaşılan hatalar varsa OrderState.
state
değeriniREJECTED
olarak ayarlayın ve RejectionInfo nesnesini ilgili RejectionInfoType ile ekleyin. - OrderUpdate'i ayarlayın.
orderManagementActions
.