Eşzamansız sipariş güncellemesi

Müşteriler yemek siparişini verdikten sonra şu adrese sipariş güncelleme mesajı gönderebilirsiniz: baştan sona Sipariş hizmetini kullanarak bize bildirebilirsiniz.

Sipariş güncellemelerinin gönderilmesiyle ilgili bazı yaygın nedenler şunlardır:

  • Siparişin tahmini sipariş karşılama süresi kullanılabilir hale gelir veya sipariş değişir.
  • Siparişin durumu değişir.
  • Sipariş artık yerine getirilemiyor.
  • Siparişe dahil edilen bir menü öğesinin fiyatı değişti.
  • Müşteri, siparişini yönetebileceği yeni bir yönteme (ör. müşteri desteği) sahip olur veya restoranın telefon numarası.
  • Siparişin makbuzu hazır hale gelir.

Sonraki bölümlerde bu farklı senaryoların nasıl ele alınacağına ilişkin ayrıntılar sunulmaktadır sipariş güncellemeleri kullanarak yapabilirsiniz.

Geçiş sırası durumları

Bir siparişin altı olası durumu vardır. Bu durumlar ve olası geçişleri aşağıdaki şemada özetlenmiştir:

Sipariş durumu geçişleri

Bir müşteri ilk siparişi gönderdiğinde sipariş, CREATED, CONFIRMED veya REJECTED. Şu adrese sipariş güncelleme mesajı gönderebilirsiniz: durum geçişi geçerli olduğu sürece bir siparişin durumunu güncelleyebilir. CREATED. durum, iş ortağının platformu siparişi onaylayamadığında veya reddedemediğinde kullanılır hemen teslim edebilirsiniz. Örnek kullanım alanı, müşterinin teslimat aracılığıyla sipariş vermesidir. toplayıcıdır. Teslimat hizmeti, Google'dan teslimatı alır. bilgileri restorana gönderir. Restoran, ürünü teslim aldıktan sonra ve sipariş stok durumunu onayladıysanız durum artık CONFIRMED olabilir. Aksi takdirde REJECTED.

CONFIRMED durumundaki bir sıra, IN_PREPARATION durumuna taşınır. Siparişin teslim alma veya teslimat için olmasına bağlı olarak, sonraki adımda READY_FOR_PICKUP ya da 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 veriyorsanız CANCELLED durumunu kullanabilirsiniz. Bir sipariş CREATED, CONFIRMED, IN_PREPARATION, READY_FOR_PICKUP veya IN_TRANSIT durumundayken iptal edilebilir. Uçtan uca Sipariş hizmetiniz iptal politikası ve iptal sırasındaki ödemelerin durumu

Uçtan uca sipariş hizmetinizin mevcut tüm eyaletleri desteklemesi gerekmez daha fazla bilgi edineceksiniz. Ancak siparişin son durumu FULFILLED olmalıdır. REJECTED veya CANCELLED.

Tahmini bir sipariş karşılama süresi sağlama

Kullanıcılara, siparişlerinin ne zaman teslim edileceğine ilişkin tahmini bir zaman aralığı belirtebilirsiniz teslim alınmaya hazır (veya teslim edilmiş) olmalıdır. estimatedFulfillmentTimeIso8601 alanını kullanın bir zaman aralığını belirlemek üzere FoodOrderUpdateExtension siparişi teslim alınmaya hazır olur veya teslim edilir.

estimatedFulfillmentTimeIso8601 şu zamanlarda gönderilir:

  • Tahmini süre kullanılabilir hale geldiğinde, ideal olarak CREATED veya CONFIRMED durumu.
  • Tahmini süre değiştiğinde (ör. tahmini sürenin güncellenmesi) bu sipariş IN_TRANSIT olduğunda daha doğrudur.

Kullanıcı beklentilerini etkili bir şekilde yönetmek için, tahminleriniz konusunda muhafazakar olun. Sabit bir tarih ve saat yerine bir tarih ve saat aralığı sağlamaları gerekir. Şunları yapmalısınız: mümkünse trafik koşulları gibi varyasyonları hesaba katmak için kullanılır. Örneğin, örneğin, 12:45’e (alt sınır) tahmini 13:15’e (üst sınır) bağlı) için tahmini teslimat süresi 13:00 olan bir sipariş içindir.

Sipariş yönetimi işlemleri sağlama

Sipariş güncellemesi gönderirken müşterilere yardımcı olan kaynaklar sağlayabilirsiniz siparişlerini OrderManagementAction biçiminde yönetmelerine olanak tanır. Ardından Sipariş verdiğinde müşterinin sizinle veya restoranla iletişime geçmesi gerekebilir. sipariş karşılamayı tamamlama, sipariş ilerlemeyi takip etme, değişiklik yapma veya siparişlerini iptal etme.

OrderManagementAction, müşterilerin bir ürüne e-posta göndermesine, aramasına veya URL'sini doğrudan cihazlarından yükleyebilir. Aynı bilgileri adresine gönderdiğiniz e-posta sipariş onayındaki gibi OrderManagementAction belirtir.

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

  • CUSTOMER_SERVICE: Müşterilere, müşterilerle iletişime geçebilecekleri bir işlem sunun geliştirmenizi sağlar. Bu yönetim işlemi türü, sipariş güncellemeleri için gereklidir.
  • EMAIL: Müşterilere, sağlanan adrese e-posta gönderebilecekleri bir işlem sunun. e-posta adresi.
  • CALL: Müşterilere, verilen telefon numarasını arayabilecekleri bir işlem sunun.
  • VIEW_DETAIL: Müşterilere, ayrıntılarını görüntülemelerini sağlayacak bir işlem sunun sipariş.

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 durumunda olduğunda CUSTOMER_SERVICE müşteri hizmetleri telefon numaranıza işaret edebilir. Sipariş durumu IN_TRANSIT için güncellemeler yapılırsa CUSTOMER_SERVICE işlemi sipariş karşılama restoranının telefon numarası

Sipariş güncellemeleri gönderiliyor

Sipariş göndermek için AsyncOrderUpdateRequestMessage mesaj türünü kullanıyorsunuz Uçtan Uca Siparişler hizmetinde güncelleme yapılmalıdır. Google da AsyncOrderUpdateResponseMessage Örneğin, bir grup insanın geçerli ve kabul edilmiş olduğunu belirten bir e-posta aldıysanız bir Siparişin durumunu CONFIRMED olarak değiştirmek için AsyncOrderUpdateRequestMessage Accepted by restaurant etiketli.

Sipariş güncelleme şeması

Sipariş güncelleme mesajı ayarlama

Google'a AsyncOrderUpdateRequestMessage gönderirken siparişin durumu hakkında bilgi edinmek için OrderUpdate alanını kullanın.

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

ONAYLANDI

Bu örnekte, kullanıcıyı bilgilendiren örnek bir sipariş güncelleme isteği gösterilmektedir Siparişin bir makbuz ve tahmini teslimat tarihiyle teyit edildiğini gerekir.

{
  "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ıyı bilgilendiren örnek bir sipariş güncelleme isteği gösterilmektedir bir reddedilme nedeni ile birlikte reddedildiğinden emin olun.

{
  "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, kullanıcıyı bilgilendiren örnek bir sipariş güncelleme isteği gösterilmektedir siparişin bir iptal nedeniyle iptal edildiğini bildirmek isterim.

{
  "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"
            }
          }
        }
      ]
    }
  }
}
    

IN_PREPARATION

Bu örnekte, kullanıcıyı bilgilendiren örnek bir sipariş güncelleme isteği gösterilmektedir yemeğin şu anda hazırlanıyor olduğunu gösterir.

{
  "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"
      }
    }
  }
}
    

READY_FOR_PICKUP

Bu örnekte, kullanıcıyı bilgilendiren örnek bir sipariş güncelleme isteği gösterilmektedir yemeğin alınmaya hazır olduğunu belirtmeniz gerekir.

{
  "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ıyı bilgilendiren örnek bir sipariş güncelleme isteği gösterilmektedir Siparişin, tahmini bir teslimat süresiyle birlikte yolda olduğunu doğrulayın.

{
  "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"
      }
    }
  }
}
  

KARŞILANDI

Bu örnekte, kullanıcıyı bilgilendiren örnek bir sipariş güncelleme isteği gösterilmektedir siparişin alındığı veya teslim edildiğine dair bilgiyi:

{
  "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ındaki sipariş güncelleme istekleriyle ilgili daha fazla örnek için şu makaleyi okuyun: Gelişmiş sipariş güncellemelerini uygulayın.

Yetkilendirme jetonu oluşturma ve mesajı gönderme

Sipariş güncellemelerinin uçtan uca sipariş verilebilmesi için hizmeti, iletinin Sipariş Uçtan Uca web hizmetinizden geldiğini doğrulayabilir.

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

  1. Aşağıdaki adımları uygulayarak bir yetkilendirme jetonu oluşturun:
    1. Hizmetinizdeki kimlik bilgilerini okumak için Google Kimlik Doğrulama Kitaplığı'nı kullanın hesap dosyanız.
    2. Aşağıdaki API kapsamını kullanarak jeton isteyin: https://www.googleapis.com/auth/actions.fulfillment.conversation.
  2. Bu jetonu şunu kullanarak doğrulanmış bir HTTP POST isteği gönderin: şu uç nokta: https://actions.googleapis.com/v2/conversations:send
  3. İsteğinizin bir parçası olarak Content-Type başlığını application/json olarak ayarlayın.
ziyaret edin.

Aşağıdaki örneklerde, sipariş güncellemelerinin nasıl uygulanacağı gösterilmektedir:

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",);
}
    

Hatasız başarılı sipariş güncellemeleri için Google bir HTTP 200 yanıtı döndürür görebilirsiniz. Bir sorun oluştuysa (örneğin, güncellemenin Google bir hata döndürür.