Eşzamansız sipariş güncellemesi

Müşteri bir yemek siparişi gönderdikten sonra, bu değişikliği bize bildirmek için Order with Google hizmetine bir sipariş güncelleme mesajı gönderebilirsiniz.

Sipariş güncellemelerinin yaygın olarak karşılaşılan bazı nedenleri aşağıda belirtilmiştir:

  • Siparişin tahmini sipariş karşılama zamanı kullanılabilir hale gelir veya değişir.
  • Siparişin durumu değişir.
  • Sipariş artık yerine getirilemez.
  • Siparişe dahil olan menü öğesinin fiyatı değişti.
  • Müşterinin siparişini yönetmek için kullanabileceği yeni bir yöntem (ör. müşteri desteği veya restoran telefon numarası) var.
  • Siparişin makbuzu hazır olur.

Sonraki bölümlerde, sipariş güncellemelerini kullanarak bu farklı senaryoların nasıl ele alınacağı hakkında ayrıntılar verilmiştir.

Geçiş sırası durumları

Bir siparişin altı durumu olabilir. Bu durumlar ve olası geçişleri aşağıdaki şemada açıklanmıştır:

Sipariş durumu geçişleri

Bir müşteri ilk kez sipariş gönderdiğinde sipariş CREATED, CONFIRMED veya REJECTED durumuyla başlar. Durum geçişi geçerli olduğu sürece, bir siparişin durumunu güncellemek için sipariş güncelleme mesajı gönderebilirsiniz. CREATED durumu, iş ortağının platformu siparişi hemen onaylayamadığında veya reddettiğinde kullanılır. Bir müşterinin teslimat toplayıcısı üzerinden sipariş vermesi buna örnek olarak verilebilir. Teslim toplayıcı, teslimatı Google'dan alır ve toplayıcı, bilgileri restorana gönderir. Restoran sipariş durumunu aldıktan ve onayladıktan sonra durum artık CONFIRMED, aksi takdirde REJECTED olabilir.

CONFIRMED durumundaki bir sipariş IN_PREPARATION durumuna taşınır. Siparişin teslim alma veya adrese teslim seçeneklerine bağlı olarak, READY_FOR_PICKUP veya IN_TRANSIT durumunu kullanın. Yemek teslim edildiğinde veya teslim alındığında, sipariş FULFILLED durumuna ayarlanır.

Müşterilerin siparişleri iptal etmesine izin verirseniz CANCELLED durumunu kullanabilirsiniz. Bir sipariş CREATED, CONFIRMED, IN_PREPARATION, READY_FOR_PICKUP veya IN_TRANSIT durumundayken iptal edilebilir. Order with Google hizmetiniz, iptal politikanıza ve iptal sırasındaki ödeme durumuna bağlı olarak geri ödeme yapmalıdır.

Order with Google hizmetinizin mevcut tüm eyaletleri ve geçişleri desteklemesi gerekmez. Bununla birlikte, siparişin son durumu FULFILLED, REJECTED veya CANCELLED olmalıdır.

Tahmini sipariş karşılama zamanı sağlama

Kullanıcılara, siparişlerinin teslim alınmaya (veya teslim edilmeye) hazır olacağı tahmini bir zaman aralığı sağlayabilirsiniz. Bir müşterinin siparişinin teslim alınmaya hazır olacağı veya teslim edileceği zamanı tahmini olarak belirten zaman aralığını sağlamak için FoodOrderUpdateExtension estimatedFulfillmentTimeIso8601 alanını kullanın.

estimatedFulfillmentTimeIso8601 öğesini şu zamanlarda gönderin:

  • Tahmini süre kullanılabilir olduğunda ideal olarak CREATED veya CONFIRMED sırasına göre.
  • Tahmini süre değiştirildiğinde (ör. sipariş IN_TRANSIT olduğunda tahmini zamanı daha doğru olacak şekilde güncelleme).

Kullanıcı beklentilerini etkili bir şekilde yönetmek için tahminlerinizde kısıtlı olun ve sabit bir tarih ve saat yerine bir tarih ve saat aralığı sağlayın. Mümkünse trafik koşulları gibi varyasyonları dikkate almanız gerekir. Örneğin, tahmini teslimat süresi 13:00 olan bir sipariş için 12:45 (alt sınır) tahminini 13:15'e (üst sınır) gönderebilirsiniz.

Sipariş yönetimi işlemleri sağlama

Sipariş güncellemesi gönderirken, müşterilere OrderManagementAction biçiminde siparişlerini yönetmelerine yardımcı olacak kaynaklar sağlayabilirsiniz. Bir sipariş verdikten sonra müşterinin, ilerlemeyi takip etmek, değişiklik yapmak veya siparişini iptal etmek için sizinle ya da siparişi yerine getiren restoranla iletişime geçmesi gerekebilir.

OrderManagementAction, müşterilerin doğrudan cihazlarından e-posta göndermesine, URL'yi aramasına veya URL'ye bağlantı vermesine olanak tanır. OrderManagementAction bölümünde, kullanıcıya gönderdiğiniz e-posta sipariş onayındaki bilgilerle aynı bilgileri kullanın.

Sipariş yönetimi işlemleri aşağıdaki türleri içerir:

  • CUSTOMER_SERVICE: Müşterilere, müşteri hizmetleriyle iletişime geçmeleri için bir işlem sunun. Sipariş güncellemeleri için bu yönetim işlemi türü gereklidir.
  • EMAIL: Müşterilere, belirtilen e-posta adresine e-posta göndermelerini sağlayacak bir işlem sunun.
  • CALL: Müşterilere, sağlanan telefon numarasını arayabilecekleri bir işlem sunun.
  • VIEW_DETAIL: Müşterilere siparişlerinin ayrıntılarını görüntülemek için bir işlem sunun.

Her sipariş güncellemesi en az bir sipariş yönetimi işlemi içermelidir. Ancak, sağlanan sipariş yönetimi işlemleri siparişin durumuna göre değişiklik gösterebilir. Örneğin, bir sipariş CONFIRMED durumundayken CUSTOMER_SERVICE işlemi, müşteri hizmetleri telefon numaranızı gösterebilir. Bu sipariş durumu IN_TRANSIT olarak güncellendiğinde CUSTOMER_SERVICE işlemi, sipariş karşılama restoranının telefon numarasına işaret edebilir.

Sipariş güncellemeleri gönderiliyor

Order with Google hizmetine sipariş güncellemesi göndermek için AsyncOrderUpdateRequestMessage mesaj türünü kullanırsınız. Google AsyncOrderUpdateResponseMessage ile yanıt verir. Örneğin, bir müşteriye siparişinin geçerli ve kabul edildiğini bildirmek istiyorsanız AsyncOrderUpdateRequestMessage etiketini kullanarak siparişin durumunu Accepted by restaurant etiketiyle CONFIRMED olarak değiştirebilirsiniz.

Sipariş güncelleme şeması

Sipariş güncelleme mesajı ayarlanıyor

Google'a AsyncOrderUpdateRequestMessage gönderirken OrderUpdate alanını kullanarak siparişin durumuyla ilgili bilgileri eklemeniz gerekir.

Aşağıdaki örneklerde her sipariş durumu için örnek bir AsyncOrderUpdateRequestMessage gösterilmektedir:

ONAYLANDI

Bu örnek, kullanıcıya siparişin makbuzla birlikte onaylandığını ve tahmini teslimat süresini bildiren örnek bir sipariş güncelleme isteği gösterir.

{
  "isInSandbox": true,
  "customPushMessage": {
    "orderUpdate": {
      "actionOrderId": "sample_action_order_id",
      "orderState": {
        "state": "CONFIRMED",
        "label": "Provider confirmed"
      },
      "receipt": {
        "userVisibleOrderId": "userVisibleId1234"
      },
      "updateTime": "2017-07-17T12:00:00Z",
      "orderManagementActions": [
        {
          "type": "CUSTOMER_SERVICE",
          "button": {
            "title": "Contact customer service",
            "openUrlAction": {
              "url": "mailto:support@example.com"
            }
          }
        },
        {
          "type": "EMAIL",
          "button": {
            "title": "Email restaurant",
            "openUrlAction": {
              "url": "mailto:person@example.com"
            }
          }
        },
        {
          "type": "CALL_RESTAURANT",
          "button": {
            "title": "Call restaurant",
            "openUrlAction": {
              "url": "tel:+16505554679"
            }
          }
        },
        {
          "type": "CALL_DRIVER",
          "button": {
            "title": "Call driver",
            "openUrlAction": {
              "url": "tel:+16505554681"
            }
          }
        }
      ],
      "infoExtension": {
        "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension",
        "estimatedFulfillmentTimeIso8601": "2017-07-17T13:00:00Z/2017-07-17T13:30:00Z"
      }
    }
  }
}
    

REDDEDİLDİ

Bu örnekte, kullanıcıya siparişin ret nedeniyle reddedildiğini bildiren örnek bir sipariş güncelleme isteği gösterilmektedir.

{
  "isInSandbox": true,
  "customPushMessage": {
    "orderUpdate": {
      "actionOrderId": "sample_action_order_id",
      "orderState": {
        "state": "REJECTED",
        "label": "Order rejected"
      },
      "updateTime": "2017-05-10T02:30:00.000Z",
      "rejectionInfo": {
        "type": "UNKNOWN",
        "reason": "Sorry, the restaurant cannot take your order right now."
      },
      "orderManagementActions": [
        {
          "type": "CUSTOMER_SERVICE",
          "button": {
            "title": "Contact customer service",
            "openUrlAction": {
              "url": "mailto:support@example.com"
            }
          }
        },
        {
          "type": "EMAIL",
          "button": {
            "title": "Email restaurant",
            "openUrlAction": {
              "url": "mailto:person@example.com"
            }
          }
        },
        {
          "type": "CALL_RESTAURANT",
          "button": {
            "title": "Call restaurant",
            "openUrlAction": {
              "url": "tel:+16505554679"
            }
          }
        },
        {
          "type": "CALL_DRIVER",
          "button": {
            "title": "Call driver",
            "openUrlAction": {
              "url": "tel:+16505554681"
            }
          }
        }
      ],
      "infoExtension": {
      "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension",
      "foodOrderErrors": [
        {
        "error": "NO_CAPACITY",
        "description": "Sorry, the restaurant cannot take your order right now."
        }
      ]
      }
    }
  }
}
    

İPTAL EDİLDİ

Bu örnekte, siparişin iptal nedeniyle kullanıcıya iptal edildiğini bildiren örnek bir sipariş güncelleme isteği gösterilmektedir.

{
  "isInSandbox": true,
  "customPushMessage": {
    "orderUpdate": {
      "actionOrderId": "sample_action_order_id",
      "orderState": {
        "state": "CANCELLED",
        "label": "Order cancelled"
      },
      "updateTime": "2017-05-10T02:30:00.000Z",
      "cancellationInfo": {
        "reason": "Customer requested"
      },
      "orderManagementActions": [
        {
          "type": "CUSTOMER_SERVICE",
          "button": {
            "title": "Contact customer service",
            "openUrlAction": {
              "url": "mailto:support@example.com"
            }
          }
        },
        {
          "type": "EMAIL",
          "button": {
            "title": "Email restaurant",
            "openUrlAction": {
              "url": "mailto:person@example.com"
            }
          }
        },
        {
          "type": "CALL_RESTAURANT",
          "button": {
            "title": "Call restaurant",
            "openUrlAction": {
              "url": "tel:+16505554679"
            }
          }
        },
        {
          "type": "CALL_DRIVER",
          "button": {
            "title": "Call driver",
            "openUrlAction": {
              "url": "tel:+16505554681"
            }
          }
        }
      ]
    }
  }
}
    

GİRİŞ

Bu örnekte, kullanıcıyı yemeğin şu anda hazırlandığı konusunda bilgilendiren örnek bir sipariş güncelleme isteği gösterilmektedir.

{
  "isInSandbox":true,
  "customPushMessage":{
    "orderUpdate":{
      "actionOrderId":"sample_action_order_id",
      "orderState":{
        "state":"IN_PREPARATION",
        "label":"Order is being prepared"
      },
      "receipt": {
        "userVisibleOrderId": "userVisibleId1234"
      },
      "updateTime":"2018-04-15T11:30:00Z",
      "orderManagementActions": [
        {
          "type": "CUSTOMER_SERVICE",
          "button": {
            "title": "Contact customer service",
            "openUrlAction": {
              "url": "mailto:support@example.com"
            }
          }
        },
        {
          "type": "EMAIL",
          "button": {
            "title": "Email restaurant",
            "openUrlAction": {
              "url": "mailto:person@example.com"
            }
          }
        },
        {
          "type": "CALL_RESTAURANT",
          "button": {
            "title": "Call restaurant",
            "openUrlAction": {
              "url": "tel:+16505554679"
            }
          }
        },
        {
          "type": "CALL_DRIVER",
          "button": {
            "title": "Call driver",
            "openUrlAction": {
              "url": "tel:+16505554681"
            }
          }
        }
      ],
      "infoExtension":{
        "@type":"type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension",
        "estimatedFulfillmentTimeIso8601":"PT20M"
      }
    }
  }
}
    

PAKETLER İÇİN HAZIR

Bu örnekte, kullanıcıya yemeğin teslime hazır olduğunu bildiren örnek bir sipariş güncelleme isteği gösterilmektedir.

{
  "isInSandbox": true,
  "customPushMessage": {
    "orderUpdate": {
      "actionOrderId": "sample_action_order_id",
      "orderState": {
        "state": "READY_FOR_PICKUP",
        "label": "Order is ready for pickup"
      },
      "receipt": {
        "userVisibleOrderId": "userVisibleId1234"
      },
      "updateTime": "2018-04-15T12:00:00Z",
      "orderManagementActions": [
        {
          "type": "CUSTOMER_SERVICE",
          "button": {
            "title": "Contact customer service",
            "openUrlAction": {
              "url": "mailto:support@example.com"
            }
          }
        },
        {
          "type": "EMAIL",
          "button": {
            "title": "Email restaurant",
            "openUrlAction": {
              "url": "mailto:person@example.com"
            }
          }
        },
        {
          "type": "CALL_RESTAURANT",
          "button": {
            "title": "Call restaurant",
            "openUrlAction": {
              "url": "tel:+16505554679"
            }
          }
        },
        {
          "type": "CALL_DRIVER",
          "button": {
            "title": "Call driver",
            "openUrlAction": {
              "url": "tel:+16505554681"
            }
          }
        }
      ],
      "infoExtension": {
        "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension",
        "estimatedFulfillmentTimeIso8601": "PT20M"
      }
    }
  }
}
    

IN_TRANSIT

Bu örnekte, kullanıcıya tahmini bir teslimat süresiyle birlikte siparişin verildiğini bildiren örnek bir sipariş güncelleme isteği gösterilmektedir.

{
  "isInSandbox": true,
  "customPushMessage": {
    "orderUpdate": {
      "actionOrderId": "sample_action_order_id",
      "orderState": {
        "state": "IN_TRANSIT",
        "label": "Order is on the way"
      },
      "inTransitInfo": {
        "updatedTime": "2017-07-17T12:00:00Z"
      },
      "updateTime": "2017-07-17T12:00:00Z",
      "orderManagementActions": [
        {
          "type": "CUSTOMER_SERVICE",
          "button": {
            "title": "Contact customer service",
            "openUrlAction": {
              "url": "mailto:support@example.com"
            }
          }
        },
        {
          "type": "EMAIL",
          "button": {
            "title": "Email restaurant",
            "openUrlAction": {
              "url": "mailto:person@example.com"
            }
          }
        },
        {
          "type": "CALL_RESTAURANT",
          "button": {
            "title": "Call restaurant",
            "openUrlAction": {
              "url": "tel:+16505554679"
            }
          }
        },
        {
          "type": "CALL_DRIVER",
          "button": {
            "title": "Call driver",
            "openUrlAction": {
              "url": "tel:+16505554681"
            }
          }
        }
      ],
      "infoExtension": {
        "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension",
        "estimatedFulfillmentTimeIso8601": "PT20M"
      }
    }
  }
}
  

TAMAMLANDI

Bu örnekte, kullanıcıya siparişin teslim edildiğini veya teslim edildiğini bildiren örnek bir sipariş güncelleme isteği gösterilmektedir:

{
  "isInSandbox": true,
  "customPushMessage": {
    "orderUpdate": {
      "actionOrderId": "sample_action_order_id",
      "orderState": {
      "state": "FULFILLED",
      "label": "Order delivered"
      },
      "updateTime": "2017-05-10T02:30:00.000Z",
      "fulfillmentInfo": {
        "deliveryTime": "2017-05-10T02:30:00.000Z"
      },
      "orderManagementActions": [
        {
          "type": "CUSTOMER_SERVICE",
          "button": {
            "title": "Contact customer service",
            "openUrlAction": {
              "url": "mailto:support@example.com"
            }
          }
        },
        {
          "type": "EMAIL",
          "button": {
            "title": "Email restaurant",
            "openUrlAction": {
              "url": "mailto:person@example.com"
            }
          }
        },
        {
          "type": "CALL_RESTAURANT",
          "button": {
            "title": "Call restaurant",
            "openUrlAction": {
              "url": "tel:+16505554679"
            }
          }
        },
        {
          "type": "CALL_DRIVER",
          "button": {
            "title": "Call driver",
            "openUrlAction": {
              "url": "tel:+16505554681"
            }
          }
        }
      ]
    }
  }
}
    

Farklı kullanım alanlarında sipariş güncelleme istekleriyle ilgili daha fazla örnek için Gelişmiş sipariş güncellemelerini uygulama konusunu okuyun.

Yetkilendirme jetonu oluşturma ve mesajı gönderme

Sipariş güncellemeleri, Order with Google hizmetinin, mesajın Order with Google web hizmetinizden geldiğini doğrulayabilmesi için bir yetkilendirme jetonu gerektirir.

Projenizde sipariş güncellemelerini uygulamak için aşağıdaki adımları uygulayın:

  1. Aşağıdaki adımları uygulayarak bir yetkilendirme jetonu oluşturun:
    1. Hizmet hesabı dosyanızdaki kimlik bilgilerini okumak için Google Auth Kitaplığı'nı kullanın.
    2. Aşağıdaki API kapsamını kullanarak jeton isteyin: https://www.googleapis.com/auth/actions.fulfillment.conversation
  2. Aşağıdaki uç noktaya bir kimliği doğrulanmış HTTP POST isteği göndermek için bu jetonu kullanın: https://actions.googleapis.com/v2/conversations:send
  3. İsteğinizin bir parçası olarak Content-Type başlığını application/json olarak ayarlayın.

Aşağıdaki örnekler, sipariş güncellemelerinin nasıl uygulanacağını göstermektedir:

Node.js

Bu kod, Node.js için Google kimlik doğrulama kitaplığını kullanır.

const {auth} = require('google-auth-library')
const request = require('request');
// The service account client secret file downloaded from the Google Cloud Console
const serviceAccountJson = require('./service-account.json')
// order-update.json is a file that contains the payload
const jsonBody = require('./order-update.json')

/**
 * Get the authorization token using a service account.
 */
async function getAuthToken() {
  let client = auth.fromJSON(serviceAccountJson)
  client.scopes = ['https://www.googleapis.com/auth/actions.fulfillment.conversation']
  const tokens = await client.authorize()
  return tokens.access_token;
}

/**
 * Send an order update request
 */
async function sendOrderUpdate() {
  const token = await getAuthToken()
  request.post({
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${token}`
    },
    url: 'https://actions.googleapis.com/v2/conversations:send',
    body: jsonBody,
    json: true
  },
  (err, res, body) => {
    if (err) { return console.log(err); }
    console.log(`Response: ${JSON.stringify(res)}`)
  })
}
    

Python

Bu kod, Python için Google kimlik doğrulama kitaplığını kullanır.

from google.oauth2 import service_account
from google.auth.transport.requests import AuthorizedSession
import json

# service-account.json is the service account client secret file downloaded from the
# Google Cloud Console
credentials = service_account.Credentials.from_service_account_file(
    'service-account.json')

scoped_credentials = credentials.with_scopes(
    ['https://www.googleapis.com/auth/actions.fulfillment.conversation'])

authed_session = AuthorizedSession(scoped_credentials)

# order-update.json is a file that contains the payload
json_payload=json.load(open('order-update.json'))

response = authed_session.post(
    'https://actions.googleapis.com/v2/conversations:send',
    json=json_payload)
    

Java

Bu kod, Java için Google kimlik doğrulama kitaplığını kullanır.

/**
 * Get the authorization token using a service account.
 */
private static String getAuthToken() {
  InputStream serviceAccountFile = Example.class.getClassLoader().getResourceAsStream("service-account.json");
  ServiceAccountCredentials.Builder credentialsSimpleBuilder =
      ServiceAccountCredentials.fromStream(serviceAccountFile).toBuilder();
  credentialsSimpleBuilder.setScopes(ImmutableList.of("https://www.googleapis.com/auth/actions.fulfillment.conversation"));
  AccessToken accessToken = credentialsSimpleBuilder.build().refreshAccessToken();
  return accessToken.getTokenValue();
}

/**
 * Send an order update request
 */
public void sendOrderUpdate() {
  String authToken = getAuthToken();
  // Execute POST request
  executePostRequest("https://actions.googleapis.com/v2/conversations:send",
      authToken, "update_order_example.json",);
}
    

Google, hatasız sipariş güncellemeleri için boş yük içeren bir HTTP 200 yanıtı döndürür. Güncellemenin bozulması gibi bir sorun varsa Google bir hata döndürür.