Ödeme ayarlarını yapma

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.

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

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ında actions.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 bir Cart nesnesi bulunur.
  • Paket servisi veya eve teslimat: Cart nesnesinin uzantı alanında, paket servisi veya eve teslimat özelliklerini belirten bir FoodCartExtension 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.
  • 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 gerekiyorsa CheckoutResponseMessage, düzeltilmiş bir ProposedOrder içeren bir FoodErrorExtension 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 bir FoodOrderExtension.
  • 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çin PaymentOptions için örnek bir ödeme ağ geçidi kullanılan aşağıdaki örneğe bakın.

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.

  1. Sipariş karşılama türünün delivery mi yoksa pickup için mi olduğunu belirlemek üzere istekteki FulfillmentOptionInfo mülkünü okuyun.
  2. 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.
    Özel pencerelerin normal pencerelere göre öncelikli olduğunu unutmayın. Sipariş aralığı doğrulaması ve hizmet öğelerini geçici olarak kaldırma başlıklı makalelerdeki örnekleri inceleyin.
    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

  1. 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'ineligibleTransactionVolumeMin 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
  2. LineItemType ile doğrulanmış lineItems listesini döndürmeREGULAR. Tüm alışveriş sepeti satır öğesi fiyatlarının toplamı, alışveriş sepeti fiyatı veya SUBTOTAL olur.

Alışveriş sepeti öğelerinin doğrulanması bölümündeki örnekleri inceleyin.

Hizmet ücretlerini hesaplama

  1. eligibleRegion, validFrom, validThrough ve priority'e göre hizmet için doğru Ücret öğesini bulun.
  2. Varlık price, percentageOfCart veya pricePerMeter mülkü ile tanımlanmışsa ücret tutarını hesaplayın.
  3. Teslimat veya paket servis hizmet ücretini, sırasıyla LineItemType DELIVERY veya FEE ile bir LineItem olarak döndürün. Ücreti Alışveriş sepetiotherItems listesine ekleyin.

Promosyonları uygulama

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

  4. Fırsata bağlı olarak alışveriş sepeti toplamını veya ücret toplamını kullanarak fırsat fiyatı tutarını uygulayın.dealType.

  5. Uygulanan promosyonla Alışveriş sepetini.promotions döndürün.

  6. 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

  1. ProposedOrder'ı oluşturun.cart Doğrulama sırasında hatayla karşılaşılmazsa yanıt sepeti, istek sepeti ile aynıdır.
  2. 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.
  3. Alışveriş sepeti fiyatını, ücretleri, indirimi, vergileri ve bahşişi ekleyerek ProposedOrder.totalPrice öğesini ekleyin.
  4. İlgili FulfillmentOption ile FoodOrderExtension.availableFulfillmentOptions öğesini döndürün. Tahmini teslimat veya teslim alma süresini beklenen süreyle güncelleyin.
  5. Ö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.
  6. Doğrulama hatası yoksa CheckoutResponse nesnesinde proposedOrder,paymentOptions döndürün. İsteğe bağlı olarak, kullanılabilen başka ödeme seçenekleri varsa additionalPaymentOptions öğesini ekleyin.