Google Checkout'u ayarlayın

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.

CheckoutResponseMessage, müşterinin değiştirilmemiş alışveriş sepetini veya bir hatayı döndürür.

Ö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 bir Cart nesnesi bulunur.
  • Teslimat veya paket servisi: Cart nesnesinin uzantı alanı, teslimat veya paket servisi ile ilgili özellikleri belirten bir FoodCartExtension 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.
  • 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 bir cart nesnesi. Alışveriş sepetindeki herhangi bir içeriğin değiştirilmesi gerekiyorsa CheckoutResponseMessage, düzeltilmiş ProposedOrder içeren bir FoodErrorExtension 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 bir FoodOrderExtension.
  • 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.

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.

  1. Sipariş karşılama türünün delivery veya pickup için olup olmadığını belirlemek amacıyla istekteki FulfillmentOptionInfo özelliğini okuyun.
  2. 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.
    Özel pencerelerin normal pencerelere göre öncelikli olduğunu unutmayın. Pencere doğrulamasını sıralama ve hizmet varlıklarını geçici olarak kaldırma ile ilgili örneklere bakın.
    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

  1. 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
  2. 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ı veya SUBTOTAL olur.

Alışveriş sepeti öğelerini doğrulama bölümündeki örneklere bakın.

Hizmet ücretlerini hesaplamak

  1. eligibleRegion, validFrom, validThrough ve priority ölçütlerine göre hizmet için doğru Fee varlığını bulun.
  2. Varlığın price, percentageOfCart veya pricePerMeter özelliğiyle tanımlanmış olup olmadığına bağlı olarak ücret tutarını hesaplayın.
  3. Teslimat veya paket servisi hizmeti ücretini, sırasıyla LineItemType DELIVERY veya FEE ile LineItem olarak iade edin. Ücreti Alışveriş sepeti.otherItems listesine ekleyin.

Promosyonları uygula

  1. Promosyon.coupon değerini Anlaşma ile eşleştirmeye göre Anlaşma varlığını bulun.dealCode.
  2. 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.
  3. Anlaşma fiyat tutarını Anlaşma.discount veya Anlaşma'ya göre hesaplayın.discountPercentage.

  4. Anlaşmaya bağlı olarak alışveriş sepeti toplamını veya ücret toplamını kullanarak anlaşma fiyat tutarını uygulayın.dealType.

  5. Alışveriş sepetinipromotions iade etmek için promosyonu uygulayın.

  6. Promosyonu LineItemType DISCOUNT ile LineItem olarak döndürün. İndirimi Alışveriş sepeti.otherItems listesine negatif fiyatla ekleyin.

Yanıtı geri ver

  1. 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.
  2. 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.
  3. Alışveriş sepeti fiyatını, ücretleri, indirimi, vergileri ve bahşiş tutarını ekleyerek ProposedOrder.totalPrice ekleyin.
  4. FoodOrderExtension.availableFulfillmentOptions öğesini ilgili FulfillmentOption ile iade edin. Tahmini teslim alma veya teslimat süresini beklenen süreye güncelleyin.
  5. Ö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.
  6. Doğrulama hatası yoksa CheckoutResponse nesnesinde proposedOrder, paymentOptions kodunu döndürün. İsteğe bağlı olarak, başka ödeme seçenekleri varsa additionalPaymentOptions ekleyin.