Kullanıcı alışveriş sepeti oluşturduğunda ödeme işlemi çağrılır. Kullanıcının alışveriş sepetinin içeriği ve siparişle ilgili ayrıntılar, uçtan uca sipariş web hizmetinize gönderilir. Bu bilgiler web hizmetiniz tarafından doğrulanır. Ardından, işleme devam edebilir veya gerektiğinde alışveriş sepetinde düzenlemeler yapabilirsiniz.
Web hizmetinizin ödeme işleyicisi, POST isteklerine yanıt vermelidir. Bir müşteri ödeme yapmayı seçtiğinde Google, Sipariş Sonu-Sonuna web hizmetine CheckoutRequestMessage
biçiminde bir JSON istek gövdesi gönderir. Bu JSON istek gövdesinde, müşterinin Cart
bilgilerinin ayrıntıları yer alır. Ardından web hizmetiniz bir CheckoutResponseMessage
ile yanıt verir. Aşağıdaki şemada süreç gösterilmektedir.
Sipariş uçtan uca web hizmetiniz, ödeme isteği aldıktan sonra aşağıdakileri yapmalıdır:
- Mevcut öğe fiyatlarına, müsaitlik durumuna ve sağlayıcı hizmetine göre alışveriş sepetinin geçerliliğini kontrol edin.
- İndirimler, vergiler ve teslimat ücretleri dahil toplam fiyatı hesaplayın.
- Başarılı olursa değiştirilmemiş bir alışveriş sepeti ile yanıt verin.
- Başarısız olursa bir hata mesajı ve yeni önerilen bir sırayla yanıt verin.
Ödeme özelliğini uygulamaya başlamadan önce Teslimat dokümanlarını incelemenizi öneririz.
Ödeme İsteği Mesajı
Müşteri ödeme yapmayı seçtiğinde Google, müşterinin alışveriş sepetini doğrulamak için web hizmetinize CheckoutRequestMessage
biçiminde bir JSON gövdesi içeren bir istek gönderir. Müşteri siparişi, Siparişin Baştan Sona İşleyiş akışı'nın ilerleyen aşamalarına kadar gönderilmez.
CheckoutRequestMessage
dosyasında bulunan veriler şunları içerir:
- Amaç: Her ödeme istek gövdesinin
inputs[0].intent
alanındaactions.foodordering.intent.CHECKOUT
dize değeri bulunur. - Alışveriş sepeti: Ödeme isteği
inputs[0].arguments[0].extension
alanında, müşterinin alışveriş sepetini temsil eden birCart
nesnesi bulunur. - Paket servisi veya eve teslimat:
Cart
nesnesinin uzantı alanında, paket servisi veya eve teslimat özelliklerini belirten birFoodCartExtension
nesnesi bulunur:- Teslimat siparişleri için
FoodCartExtension
nesnesi teslimat adresini içerir. - Paket servisi veya teslimat siparişleri için
FoodCartExtension
nesnesi herhangi bir konum bilgisi içermez.
- Teslimat siparişleri için
- Korumalı alan: Ödeme isteği
isInSandbox
alanında, işlemin korumalı alan ödemelerini kullanıp kullanmadığını belirten bir boole değeri bulunur.
Ödeme isteği örneği
Aşağıda bir CheckoutRequestMessage
örneği verilmiştir:
{
"user": {},
"conversation": {
"conversationId": "CTZbZfUlHCybEdcz_5PB3Ttf"
},
"inputs": [
{
"intent": "actions.foodordering.intent.CHECKOUT",
"arguments": [
{
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.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"
]
}
}
}
}
}
]
}
],
"directActionOnly": true,
"isInSandbox": true
}
Ödeme Yanıtı Mesajı
Ödeme web hizmetiniz, Sipariş Sonu-Sonu hizmetinden bir istek aldıktan sonra bu isteği işleyip CheckoutResponseMessage
ile yanıt vermelidir. CheckoutResponseMessage
, başarılı veya başarısız bir isteği kapsamalıdır.
Başarılı istek
Ödeme isteği başarılıysa CheckoutResponseMessage
, ProposedOrder
ve PaymentOptions
öğelerini içermelidir:
ProposedOrder
cart
:CheckoutRequestMessage
içinde sağlanan alışveriş sepetiyle aynıcart
nesnesi. Alışveriş sepeti içeriğinin herhangi birinin değiştirilmesi gerekiyorsaCheckoutResponseMessage
, düzeltilmiş birProposedOrder
içeren birFoodErrorExtension
içermelidir.otherItems
: Sağlayıcı tarafından eklenen öğeler (ör. teslimat ücretleri, vergiler ve diğer ücretler). Kullanıcı tarafından eklenen bahşişi de içerebilir.totalPrice
: Siparişin toplam fiyatı.extension
: Siparişle ilgili sipariş karşılama bilgilerini (ör. teslimat süresi) tanımlayan birFoodOrderExtension
.
PaymentOptions
- Ödeme işlemeyi ayarlama işlemi, Google Pay'i ayarlama bölümünde ele alınmıştır.
Ödeme işlemeyi uygulamaya hazır olana kadar
CheckoutResponseMessage
dosyanızda yer tutucu JSON kullanabilirsiniz. CheckoutResponseMessage
'ünüze yer tutucu ödeme seçenekleri eklemek içinPaymentOptions
için örnek bir ödeme ağ geçidi kullanılan aşağıdaki örneğe bakın.
- Ödeme işlemeyi ayarlama işlemi, Google Pay'i ayarlama bölümünde ele alınmıştır.
Ödeme işlemeyi uygulamaya hazır olana kadar
Başarılı yanıt örneği
{
"finalResponse": {
"richResponse": {
"items": [
{
"structuredResponse": {
"checkoutResponse": {
"proposedOrder": {
"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"
]
}
}
}
},
"totalPrice": {
"type": "ESTIMATE",
"amount": {
"currencyCode": "AUD",
"units": "43",
"nanos": 100000000
}
},
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension",
"availableFulfillmentOptions": [
{
"fulfillmentInfo": {
"delivery": {
"deliveryTimeIso8601": "P0M"
}
}
}
]
},
"otherItems": [
{
"name": "Delivery fee",
"price": {
"type": "ESTIMATE",
"amount": {
"currencyCode": "AUD",
"units": "3",
"nanos": 500000000
}
},
"type": "DELIVERY"
}
]
},
"paymentOptions": {
"googleProvidedOptions": {
"facilitationSpecification": "{\"apiVersion\":2,\"apiVersionMinor\":0,\"merchantInfo\":{\"merchantName\":\"merchantName\"},\"allowedPaymentMethods\":[{\"type\":\"CARD\",\"parameters\":{\"allowedAuthMethods\":[\"PAN_ONLY\"],\"allowedCardNetworks\":[\"VISA\",\"MASTERCARD\"],\"billingAddressRequired\":true,\"cvcRequired\":false},\"tokenizationSpecification\":{\"type\":\"PAYMENT_GATEWAY\",\"parameters\":{\"gatewayMerchantId\":\"YOUR_MERCHANT_ID\",\"gateway\":\"cybersource\"}}}],\"transactionInfo\":{\"currencyCode\":\"AUD\",\"totalPriceStatus\":\"ESTIMATED\",\"totalPrice\":\"43.1\"}} "
}
},
"additionalPaymentOptions": [
{
"actionProvidedOptions": {
"paymentType": "ON_FULFILLMENT",
"displayName": "Pay when you get your food.",
"onFulfillmentPaymentData": {
"supportedPaymentOptions": []
}
}
}
]
}
}
}
]
}
}
}
Başarısız istek
Ödeme isteği başarısız olursa CheckoutResponseMessage
, meydana gelen hataları açıklayan FoodOrderError
öğelerinin listesini içeren FoodErrorExtension
öğesini içermelidir. Siparişte düzeltilebilir hatalar varsa (ör. alışveriş sepetindeki bir öğenin fiyatında değişiklik) FoodErrorExtension
, correctedProposedOrder
değerini içermelidir.
Başarısız yanıt örneği
{
"expectUserResponse": false,
"finalResponse": {
"richResponse": {
"items": [
{
"structuredResponse": {
"error": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension",
"foodOrderErrors": [
{
"error": "CLOSED",
"description": "The restaurant is closed."
}
]
}
}
}
]
}
}
}
Ödeme özelliğini uygulama
Ödeme özelliğini uygularken aşağıdaki adımlar uygulanmalıdır.
Hizmeti doğrulama
Bulunan ilk hizmet hatası durumu için FoodOrderError döndürün. Bu hatalar kurtarılamaz olduğundan, karşılaşılan ilk hata döndürülmelidir. Düzeltilebilir hataların açıklaması için Hataları ele alma bölümüne bakın.
- Sipariş karşılama türünün
delivery
mi yoksapickup
için mi olduğunu belirlemek üzere istekteki FulfillmentOptionInfo mülkünü okuyun. Gerekirse aşağıdaki hata türlerini döndürün:
Hata türü Kullanım alanı INVALID Karşılama türü geçersiz. NOT_FOUND Siparişin karşılanma türü bulunamadı. KAPALI - Sipariş için OperationHours aralıkları yok.
- Sipariş, en kısa sürede teslimat siparişidir ve şu anda en kısa sürede teslimat için ServiceHours mevcut değildir.
- Acil durum nedeniyle kapatma var veya
isDisabled
hizmeti doğru.
UNAVAILABLE_SLOT Sipariş öncelikli zaman aralığı karşılanamıyor. NO_CAPACITY Restoran şu anda meşgul olduğu için sipariş almıyor. OUT_OF_SERVICE_AREA Sipariş, kullanıcının adresine teslim edilemiyor. Örnek için Teslimat adresi doğrulaması başlıklı makaleyi inceleyin. NO_COURIER_AVAILABLE Sınırlı teslimat personeli nedeniyle sipariş teslim edilemiyor.
Sepeti doğrulama ve fiyatlandırma
Her alışveriş sepetini arayın.
lineItems
Sisteminizdeki veya satıcının sistemindeki mevcut verilerle doğrulayın. Feed öğesinden alınan MenuItemOffer.sku
değeri, LineItem.offerId
olarak dahil edilir. Gerekirse her satır öğesi için bir FoodOrderError oluşturun. Her öğe için en fazla bir hata oluşturun. Gerekirse aşağıdaki hata türlerini döndürün:Hata türü Kullanım alanı Kurtarılabilir INVALID Öğe verileri veya seçenek verilerinden herhangi biri geçersiz. Hayır NOT_FOUND Öğe veya seçeneklerden hiçbiri bulunamadı. Hayır PRICE_CHANGED Bir öğenin veya eklenti kombinasyonunun fiyatı değişti. Bu hata, kurtarılabilir olarak değerlendirilebilir. Evet AVAILABILITY_CHANGED Satır öğeleri için istenen tutar veya seçeneklerden hiçbiri kullanılamıyor. Evet REQUIREMENTS_NOT_MET Minimum veya maksimum sipariş tutarı karşılanmadı. Bu, alışveriş sepeti fiyatının Ücret'in eligibleTransactionVolumeMin
altında mı yoksa Ücret'ineligibleTransactionVolumeMax
üzerinde mi olduğunu kontrol ederek belirlenebilir. Minimum sipariş değeri doğrulaması bölümündeki örneğe bakın.Hayır LineItemType ile doğrulanmış lineItems listesini döndürme
REGULAR
. Tüm alışveriş sepeti satır öğesi fiyatlarının toplamı, alışveriş sepeti fiyatı veyaSUBTOTAL
olur.
Alışveriş sepeti öğelerinin doğrulanması bölümündeki örnekleri inceleyin.
Hizmet ücretlerini hesaplama
eligibleRegion
,validFrom
,validThrough
vepriority
'e göre hizmet için doğru Ücret öğesini bulun.- Varlık
price
,percentageOfCart
veyapricePerMeter
mülkü ile tanımlanmışsa ücret tutarını hesaplayın. - Teslimat veya paket servis hizmet ücretini, sırasıyla LineItemType
DELIVERY
veyaFEE
ile bir LineItem olarak döndürün. Ücreti Alışveriş sepetiotherItems
listesine ekleyin.
Promosyonları uygulama
- Promosyon.
coupon
değerini Anlaşma.dealCode
ile eşleştirerek Anlaşma öğesini bulun. Anlaşmayı doğrulayın ve gerekirse FoodOrderError döndürün. Bu hatalar kurtarılabilir olarak değerlendirilebilir. Gerekirse aşağıdaki hata türlerini döndürün:
Hata türü Kullanım alanı PROMO_NOT_RECOGNIZED Kupon kodu tanınmadı. PROMO_EXPIRED Anlaşmanın geçerlilik süresi doldu. PROMO_ORDER_INELIGIBLE Sipariş kupon için uygun değil. PROMO_NOT_APPLICABLE Başka bir neden. Fırsat fiyatı tutarını Fırsat.
discount
veya Fırsat.discountPercentage
'e göre hesaplayın.Fırsata bağlı olarak alışveriş sepeti toplamını veya ücret toplamını kullanarak fırsat fiyatı tutarını uygulayın.
dealType
.Uygulanan promosyonla Alışveriş sepetini.
promotions
döndürün.Tanıtımı, LineItemType
DISCOUNT
ile LineItem olarak döndürün. İndirimi, Alışveriş sepeti.otherItems
listesine negatif fiyatla ekleyin.
Yanıtı döndürme
- ProposedOrder'ı oluşturun.
cart
Doğrulama sırasında hatayla karşılaşılmazsa yanıt sepeti, istek sepeti ile aynıdır. - Vergi, ücretler, bahşiş ve varsa indirim dahil olmak üzere ProposedOrder.
otherItems
listesini döndürün. Bahşiş öğesinin nasıl yapılandırılacağı hakkında daha fazla bilgi için Bahşiş bölümüne bakın. - Alışveriş sepeti fiyatını, ücretleri, indirimi, vergileri ve bahşişi ekleyerek ProposedOrder.
totalPrice
öğesini ekleyin. - İlgili FulfillmentOption ile FoodOrderExtension.
availableFulfillmentOptions
öğesini döndürün. Tahmini teslimat veya teslim alma süresini beklenen süreyle güncelleyin. - Önceki doğrulama kontrollerinden oluşturulan FoodOrderErrors varsa:
- StructuredResponse.
error
ve hata listesini FoodErrorExtension.foodOrderErrors
içine ekleyin. - Tüm hatalar düzeltilebilir durumdaysa
correctedProposedOrder
alanında ProposedOrder değerini döndürün. - Tüm hatalar düzeltilebilir durumdaysa
paymentOptions
alanında PaymentOptions değerini döndürün. - İsteğe bağlı olarak, kullanılabilen başka ödeme seçenekleri varsa ve tüm hatalar düzeltilebilir durumdaysa
additionalPaymentOptions
öğesini ekleyin.
- StructuredResponse.
- Doğrulama hatası yoksa CheckoutResponse nesnesinde
proposedOrder
,paymentOptions
döndürün. İsteğe bağlı olarak, kullanılabilen başka ödeme seçenekleri varsaadditionalPaymentOptions
öğesini ekleyin.