Google Checkout'u ayarlayın

Ödeme işlemi, kullanıcı bir alışveriş sepeti oluşturduğunda çağrılır. Bu kullanıcının alışveriş sepeti ve siparişle ilgili ayrıntılar Sipariş Uçtan Uca web sayfanıza gönderilir geliştirmenizi sağlar. Bu bilgiler web hizmetiniz tarafından doğrulanır ve sonrasında, alışveriş sepetinde gerekli düzenlemeleri yapabilirler.

Web hizmetinizin ödeme işleyicisi POST isteklerine yanıt vermelidir. Bir ödeme yapmayı seçtiğinde, Google Sipariş Verme için Uçtan Uca web hizmetine CheckoutRequestMessage biçiminde olan JSON istek gövdesi, bir müşterinin Cart ayrıntıları için geçerlidir. Daha sonra web hizmetiniz CheckoutResponseMessage Bu işlem aşağıdaki şemada gösterilmektedir.

CheckoutResponseMessage, müşterinin değiştirilmemiş alışveriş sepetini veya
hatası.

Ödeme isteği alındığında, Sipariş Veren Uçtan Uca web hizmetiniz şu:

  • Alışveriş sepetinin geçerliliğini, mevcut öğe fiyatlarına, stok durumuna, ve sağlayıcı hizmet.
  • Toplam fiyatı hesaplama (indirimler, vergiler ve teslimat dahil) ücretler).
  • İşlem başarılı olursa değiştirilmemiş bir alışveriş sepetiyle yanıt verin.
  • Başarısız olmanız durumunda, hata mesajı ve önerilen yeni siparişle yanıt verin.

Ödeme özelliğini uygulamaya başlamadan önce Sipariş Karşılama genel bakış belgelerinden faydalanabilirsiniz.

Ödeme İsteği Mesajı

Müşterinin alışveriş sepetini doğrulamak için, müşteri ödeme yapmayı seçtiğinde Google, web hizmetinize CheckoutRequestMessage Müşteri siparişi, teslim tarihinin Uçtan uca akışı sıralama.

Bir CheckoutRequestMessage şunları içerir:

  • Amaç: inputs[0].intent Her ödeme isteği gövdesinin alanında actions.foodordering.intent.CHECKOUT dize değeri.
  • Alışveriş sepeti: Ödeme isteğinin inputs[0].arguments[0].extension alanı Müşterinin alışveriş sepetini temsil eden bir Cart nesnesi içerir.
  • Teslim veya alma: Cart nesnesinin uzantı alanında bir Yayın için özellikleri belirten FoodCartExtension nesnesi veya alma:
    • Teslimat siparişleri için FoodCartExtension nesnesi şunları içerir: teslimat adresi.
    • Teslim alma veya paket servisi siparişlerinde FoodCartExtension nesnesi Konum bilgisi içermeyecek.
  • Korumalı alan: Ödeme isteğinin isInSandbox alanı bir boole değeri içeriyor İşlemin korumalı alan ödemelerini kullanıp kullanmadığını gösteren değer.

Ö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 İşlemine İlişkin Yanıt Mesajı

Uçtan Uca Sipariş hizmetinden bir istek aldıktan sonra, ödeme web siteniz hizmeti tarafından işlenip CheckoutResponseMessage ile yanıt vermesi gerekir. İlgili içeriği oluşturmak için kullanılan CheckoutResponseMessage, başarılı veya başarısız bir sorunu ele almalıdır. isteğinde bulunabilirsiniz.

Başarılı istek

Ödeme isteği başarılı olursa CheckoutResponseMessage öğesine ProposedOrder ve PaymentOptions:

  • ProposedOrder

    • cart: cart CheckoutRequestMessage. Alışveriş sepetinin içeriğinden herhangi birinin değiştirildiğinde, CheckoutResponseMessage bunun yerine bir Düzeltilmiş ProposedOrder ile FoodErrorExtension.
    • otherItems: Sağlayıcı tarafından eklenen öğeler (ör. teslimat ücretleri), vergileri ve diğer ücretleri kapsar. Kullanıcı tarafından eklenen ikramı da içerebilir.
    • totalPrice: Siparişin toplam fiyatı.
    • extension: Sipariş karşılama bilgilerini tanımlayan bir FoodOrderExtension siparişle ilgili verileri (ör. teslimat süresi) gösterir.
  • PaymentOptions

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 şu işlemleri yapmalıdır: şunları içeren FoodErrorExtension: FoodOrderError öğeleri içerir. Varsa siparişle ilgili hatalar (sepetteki bir öğenin fiyatının değişmesi, FoodErrorExtension, correctedProposedOrder öğesini 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 uygulanmalıdır.

Hizmeti doğrulama

İlk hizmet hatası koşulu için FoodOrderError döndürme bulundu. Bu hatalar kurtarılamaz. Bu nedenle, karşılaşılan ilk hata geri döndü. İlgili açıklama için Hataları işleme emin olun.

  1. FulfillmentOptionInfo özelliğini şurada okuyun: istek karşılama türünün delivery veya pickup olduğunu belirlemek için isteği gönderin.
  2. Gerekirse aşağıdaki hata türlerini döndürün:

    Hata türü Kullanım alanı
    GEÇERSİZ Sipariş karşılama türü geçersiz.
    NOT_FOUND Sipariş karşılama türü bulunamadı.
    KAPALI
    • Sipariş için OperationHours penceresi yok.
    • En kısa zamanda verilen bir sipariştir ve şu an için ServiceHours kullanılamaz.
    • Acil durum kapatma işlemi var veya isDisabled hizmeti doğru.
    Özel pencerelerin normal pencerelere göre öncelikli olduğunu unutmayın. Sipariş aralığı doğrulaması örneklerine bakın ve hizmet varlıklarını geçici olarak kaldırın.
    UNAVAILABLE_SLOT Önceden sipariş yerine getirilemiyor.
    NO_CAPACITY Restoran meşgul ve şu anda sipariş almıyor.
    OUT_OF_SERVICE_AREA Sipariş, kullanıcının adresine teslim edilemiyor. Örnek için Teslimat adresi doğrulaması bölümüne bakın.
    NO_COURIER_AVAILABLE Teslimat personelinin sınırlı olması nedeniyle sipariş teslim edilemiyor.

Alışveriş sepetini doğrulama ve fiyatlandırma

  1. Her Alışveriş sepetinilineItems arayın ve mevcut verilerle doğrulayın. kendi sistemi ayarlayabilirsiniz. İlgili içeriği oluşturmak için kullanılan MenuItemOffer.Feed varlığından sku değeri dahil edildi LineItem olarak değiştirin.offerId. Bir metin oluştur: Gerekirse her satır öğesi için FoodOrderError. Bir metin oluştur: en fazla bir hata. Aşağıdaki hata türlerini döndürürse gerekli:

    Hata türü Kullanım alanı Kurtarılabilir
    GEÇERSİZ Öğ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 olarak değerlendirilebilir. 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ş tutarı karşılanmadı. Bu durum, alışveriş sepeti fiyatının Ücret'ineligibleTransactionVolumeMin altında mı yoksa Ücret'in üzerinde mi olduğunu kontrol ederek belirlenebilir.eligibleTransactionVolumeMax. Minimum sipariş değeri doğrulaması bölümündeki örneğe bakın. Hayır
  2. LineItemType ile doğrulanmış satır öğeleri listesini döndürün REGULAR. Tüm alışveriş sepeti satır öğesi fiyatlarının toplamı, alışveriş sepeti fiyatı veya SUBTOTAL

Alışveriş sepeti öğelerini doğrulama örneklerine bakın.

Hizmet ücretlerini hesaplamak

  1. Şuna göre hizmet için doğru Ücret varlığını bulun: eligibleRegion, validFrom, validThrough ve priority.
  2. Ücret tutarını, varlığın price ile tanımlanmış olup olmadığına bağlı olarak hesaplayın. percentageOfCart veya pricePerMeter mülkü.
  3. Teslimat veya paket servisi ücretini, şu özelliklere sahip bir LineItem olarak iade edin: LineItemType sırasıyla DELIVERY veya FEE. Ücreti ekle Alışveriş sepeti.otherItems listesine.

Promosyonları uygula

  1. Eşleşmeye göre Anlaşma öğesini bulun. Promosyon.Fırsat ile coupon değeri.dealCode.
  2. Anlaşmayı doğrulayın ve gerekirse FoodOrderError döndürür. Bu hatalar kurtarılabilir olarak değerlendirilebilir. Aşağıdaki hata türlerini döndürme gerekirse:

    Hata türü Kullanım alanı
    PROMO_NOT_RECOGNIZED Kupon kodu tanınmadı.
    PROMO_EXPIRED Anlaşmanın geçerliliği sona erdi.
    PROMO_ORDER_INELIGIBLE Sipariş kupon için uygun değil.
    PROMO_NOT_APPLICABLE Başka bir neden.
  3. Anlaşma fiyat tutarını Anlaşma'ya göre hesaplayın.discount veya AnlaşmadiscountPercentage.

  4. Şuna göre alışveriş sepeti toplamını veya ücret toplamını kullanarak anlaşma fiyat tutarını uygulayın: Anlaşma.dealType.

  5. Uygulanan promosyonla birlikte Alışveriş sepetini iade edin.promotions.

  6. Promosyonu şu başlığa sahip LineItem olarak iade edin: LineItemType DISCOUNT. İndirimi Alışveriş sepeti.Negatif fiyata sahip otherItems listesi.

Yanıtı geri ver

  1. ProposedOrder.cart dosyasını oluşturun. Yanıt alışveriş sepeti istek sepetiyle aynıdır.
  2. ProposedOrder.otherItems listesini döndürün ve vergi, ücret, bahşiş ve indirim uygulanır. Şunun için Gratuity'e bakın: bahşiş öğesinin nasıl yapılandırılacağına dair daha fazla bilgi.
  3. Alışveriş sepetini ekleyerek ProposedOrder.totalPrice öğesini dahil edin fiyat, ücretler, indirim, vergiler ve bahşiş.
  4. FoodOrderExtension.availableFulfillmentOptions ilgili FulfillmentOption. Tahmini tutarı güncelle teslim alma veya teslimat süresini beklenen süreye göre ayarlayın.
  5. Önceki doğrulama kontrollerinde oluşturulan Food OrderErrors varsa:
    • StructuredResponse.error ve FoodErrorExtension'daki hatalar.foodOrderErrors
    • ProposedOrdercorrectedProposedOrder alanını kullanın.
    • paymentOptions içindeki PaymentOptions'ı iade edin girin.
    • İsteğe bağlı olarak, başka değer varsa additionalPaymentOptions ödeme seçenekleri mevcuttur ve tüm hatalar giderilebilir.
  6. Doğrulama hatası yoksa proposedOrder öğesini döndürün, CheckoutResponse nesnesinde paymentOptions. İsteğe bağlı olarak, başka değer varsa additionalPaymentOptions kullanabileceğiniz en iyi ödeme yöntemidir.