Bir kullanıcı alışveriş sepeti oluşturduğunda ödeme süreci başlatılır. Kullanıcının alışveriş sepetinin içeriği ve siparişle ilgili ayrıntılar, Sipariş Verme Uçtan Uca web hizmetinize gönderilir. Bu bilgiler web hizmetiniz tarafından doğrulanır. Ardından devam edebilir veya müşterinin alışveriş sepetinde gereken düzenlemeleri yapabilirsiniz.
Web hizmetinizin ödeme işleyicisi POST isteklerine yanıt vermelidir. Bir müşteri ödeme yapmayı seçtiğinde Google, Sipariş Verme Uçtan Uca web hizmetine CheckoutRequestMessage
biçiminde bir JSON istek gövdesi gönderir. Bu formda, müşterinin Cart
ayrıntıları yer alır. Bu durumda web hizmetiniz CheckoutResponseMessage
ile yanıt verir. Aşağıdaki şemada süreç gösterilmektedir.
Ödeme isteği aldıktan sonra Sipariş Verme Uçtan Uca web hizmetiniz aşağıdakileri yapmalıdır:
- Alışveriş sepetinin geçerli ürün fiyatlarına, stok durumuna ve sağlayıcı hizmetine göre geçerliliğini kontrol edebilirsiniz.
- Toplam fiyatı (indirimler, vergiler ve teslimat ücretleri dahil) hesaplayın.
- İstek başarılı olursa değiştirilmemiş bir alışveriş sepetiyle yanıt verin.
- Başarısız olursa bir hata mesajı ve yeni bir önerilen siparişle yanıt verin.
Ödeme özelliğini uygulamaya başlamadan önce Sipariş karşılamaya genel bakış belgelerini incelemenizi öneririz.
Ödeme İsteği Mesajı
Google, müşterinin alışveriş sepetini doğrulamak için ödeme yapmayı seçtiğinde, web hizmetinize CheckoutRequestMessage
biçiminde bir JSON gövdesi içeren istek gönderir. Müşteri siparişi, Sipariş Verme Uçtan Uca akışında bir sonraki aşamaya kadar gönderilmez.
CheckoutRequestMessage
içinde bulunan veriler şunları içerir:
- Amaç: Her ödeme isteği gövdesinin
inputs[0].intent
alanıactions.foodordering.intent.CHECKOUT
dize değerini içerir. - Alışveriş sepeti: Bir ödeme isteğinin
inputs[0].arguments[0].extension
alanında, müşterinin alışveriş sepetini temsil eden birCart
nesnesi bulunur. - Teslimat veya paket servisi:
Cart
nesnesinin uzantı alanı, teslimat veya paket servisi ile ilgili özellikleri belirten birFoodCartExtension
nesnesi içerir:- Teslimat siparişleri için
FoodCartExtension
nesnesi teslimat adresini içerir. - Teslim alma veya paket servisi siparişleri için
FoodCartExtension
nesnesi herhangi bir konum bilgisi içermiyor.
- Teslimat siparişleri için
- Korumalı alan: Bir ödeme isteğinin
isInSandbox
alanı, işlemde korumalı alan ödemelerinin kullanılıp kullanılmadığını gösteren bir boole değeri içerir.
Ödeme isteği örneği
Aşağıda 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 İşlemi Yanıt Mesajı
Sipariş Verme Uçtan Uca hizmetinden istek aldıktan sonra, ödeme web hizmetinizin bunu işlemesi ve CheckoutResponseMessage
ile yanıt vermesi gerekir. 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ı olursa CheckoutResponseMessage
öğesinde ProposedOrder
ve PaymentOptions
yer almalıdır:
ProposedOrder
cart
:CheckoutRequestMessage
içinde sağlanan alışveriş sepetine benzer bircart
nesnesi. Alışveriş sepetindeki herhangi bir içeriğin değiştirilmesi gerekiyorsaCheckoutResponseMessage
, düzeltilmişProposedOrder
içeren birFoodErrorExtension
içermelidir.otherItems
: Teslimat ücretleri, vergiler ve diğer ücretler gibi sağlayıcı tarafından eklenen öğeler. Kullanıcı tarafından eklenen bahş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şleminin nasıl ayarlanacağı, daha sonra Google Pay'i kurma 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
içinde yer tutucu ödeme seçenekleri eklemek için aşağıdaki örneği inceleyin. Bu örnekte,PaymentOptions
için örnek bir ödeme ağ geçidi kullanılmaktadır.
- Ödeme işleminin nasıl ayarlanacağı, daha sonra Google Pay'i kurma 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
, oluşan hataları açıklayan FoodOrderError
öğelerinin listesini içeren FoodErrorExtension
ifadesini içermelidir. Siparişte, alışveriş sepetindeki bir öğenin fiyat değişikliği gibi kurtarılabilir hatalar varsa FoodErrorExtension
, correctedProposedOrder
bilgisini 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 uygulaması
Ödeme işlemi uygulanırken aşağıdaki adımlar gerçekleştirilmelidir.
Hizmeti doğrulama
Bulunan ilk hizmet hatası durumu için FoodOrderError hatası döndürün. Bu hatalar kurtarılamaz. Bu nedenle, karşılaşılan ilk hata döndürülmelidir. Kurtarılabilir hataların açıklaması için Hataları işleme bölümüne bakın.
- Sipariş karşılama türünün
delivery
veyapickup
için olup olmadığını belirlemek amacıyla istekteki FulfillmentOptionInfo özelliğini okuyun. Gerekirse aşağıdaki hata türlerini döndürün:
Hata türü Kullanım alanı INVALID Sipariş karşılama türü geçersiz. NOT_FOUND Sipariş karşılama türü bulunamadı. KAPATILDI - Bu sipariş için OperationHours zaman aralığı yok.
- Bu sipariş, "En Kısa Zamanda" şeklinde bir sipariştir ve şu anki saat için En Kısa Zamanda ServiceHours seçeneği mevcut değil.
- Acil durum kapalı veya
isDisabled
hizmeti doğru.
UNAVAILABLE_SLOT Önceden verilen sipariş yerine getirilemez. NO_CAPACITY Restoran yoğun ve şu anda sipariş almıyor. OUT_OF_SERVICE_AREA Sipariş, kullanıcının adresine teslim edilemiyor. Örnek için Teslimat adresi doğrulama bölümüne bakın. NO_COURIER_AVAILABLE Teslimat personeli sınırlı olduğundan sipariş teslim edilemiyor.
Alışveriş sepetini doğrulama ve fiyatlama
Her Alışveriş sepeti.
lineItems
dosyasını arayın ve sisteminizdeki veya satıcının sistemindeki geçerli verilerle doğrulayın. Feed varlığındaki MenuItemOffer.sku
değeri, LineItem olarak dahil edilir.offerId
. 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 herhangi biri bulunamadı. Hayır PRICE_CHANGED Bir öğenin veya eklenti kombinasyonunun fiyatı değişti. Bu hata, kurtarılabilir bir hata olarak ele alınabilir. Evet AVAILABILITY_CHANGED Satır öğeleri veya seçeneklerden herhangi biri için istenen tutar kullanılamıyor. Evet REQUIREMENTS_NOT_MET Minimum sipariş veya maksimum sipariş değeri karşılanmadı. Bu, alışveriş sepeti fiyatının Ücret. eligibleTransactionVolumeMin
tutarının altında veya Ücret'in üzerinde olup olmadığı kontrol edilerek belirlenebilir.eligibleTransactionVolumeMax
. Minimum sipariş değeri doğrulaması bölümündeki örneğe bakın.Hayır LineItemType
REGULAR
ile doğrulanmış satır öğesi listesini döndürün. Tüm alışveriş sepeti satır öğesi fiyatlarının toplamı, alışveriş sepeti fiyatı veyaSUBTOTAL
olur.
Alışveriş sepeti öğelerini doğrulama bölümündeki örneklere bakın.
Hizmet ücretlerini hesaplamak
eligibleRegion
,validFrom
,validThrough
vepriority
ölçütlerine göre hizmet için doğru Fee varlığını bulun.- Varlığın
price
,percentageOfCart
veyapricePerMeter
özelliğiyle tanımlanmış olup olmadığına bağlı olarak ücret tutarını hesaplayın. - Teslimat veya paket servisi hizmeti ücretini, sırasıyla LineItemType
DELIVERY
veyaFEE
ile LineItem olarak iade edin. Ücreti Alışveriş sepeti.otherItems
listesine ekleyin.
Promosyonları uygula
- Promosyon.
coupon
değerini Anlaşma ile eşleştirmeye göre Anlaşma varlığını bulun.dealCode
. Anlaşmayı doğrulayın ve gerekirse FoodOrderError döndürün. Bu hatalar, kurtarılabilir hatalar olarak ele alınabilir. 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şma geçerliliği sona erdi. PROMO_ORDER_INELIGIBLE Sipariş, kupon için uygun değil. PROMO_NOT_APPLICABLE Başka herhangi bir neden. Anlaşma fiyat tutarını Anlaşma.
discount
veya Anlaşma'ya göre hesaplayın.discountPercentage
.Anlaşmaya bağlı olarak alışveriş sepeti toplamını veya ücret toplamını kullanarak anlaşma fiyat tutarını uygulayın.
dealType
.Alışveriş sepetini
promotions
iade etmek için promosyonu uygulayın.Promosyonu LineItemType
DISCOUNT
ile LineItem olarak döndürün. İndirimi Alışveriş sepeti.otherItems
listesine negatif fiyatla ekleyin.
Yanıtı geri ver
- ProposedOrder.
cart
oluşturun. Doğrulama sırasında hatalarla karşılaşılmazsa yanıt alışveriş sepeti, istek alışveriş sepetiyle aynıdır. - Geçerli olduğu durumlarda vergi, ücretler, bahşiş ve indirimle birlikte ProposedOrder.
otherItems
listesini iade edin. Bahşiş öğesinin nasıl yapılandırılacağı hakkında daha fazla bilgi için Gratuity (Derecelendirme) bölümüne bakın. - Alışveriş sepeti fiyatını, ücretleri, indirimi, vergileri ve bahşiş tutarını ekleyerek ProposedOrder.
totalPrice
ekleyin. - FoodOrderExtension.
availableFulfillmentOptions
öğesini ilgili FulfillmentOption ile iade edin. Tahmini teslim alma veya teslimat süresini beklenen süreye güncelleyin. - Önceki doğrulama kontrollerinde oluşturulan FoodOrderError'lar varsa:
- StructuredResponse.
error
kodunu ve FoodErrorExtension öğesine hata listesini ekleyin.foodOrderErrors
. - Tüm hatalar kurtarılabilirse
correctedProposedOrder
alanındaki ProposedOrder değerini döndürün. - Tüm hatalar kurtarılabilirse
paymentOptions
alanındaki PaymentOptions seçeneğini döndürün. - İsteğe bağlı olarak, başka ödeme seçenekleri varsa ve tüm hatalar kurtarılabilirse
additionalPaymentOptions
ekleyin.
- StructuredResponse.
- Doğrulama hatası yoksa CheckoutResponse nesnesinde
proposedOrder
,paymentOptions
kodunu döndürün. İsteğe bağlı olarak, başka ödeme seçenekleri varsaadditionalPaymentOptions
ekleyin.