به روز رسانی سفارش Async

پس از اینکه مشتری سفارش غذا را ارسال کرد، می‌توانید یک پیام به‌روزرسانی سفارش را به سرویس پایان به انتها سفارش ارسال کنید تا ما را از تغییر مطلع کند.

در اینجا چند دلیل متداول برای ارسال به‌روزرسانی سفارش آورده شده است:

  • زمان برآوردی انجام سفارش در دسترس می شود یا تغییر می کند.
  • وضعیت یک سفارش تغییر می کند.
  • سفارش دیگر قابل انجام نیست.
  • قیمت یک آیتم منوی موجود در سفارش تغییر کرد.
  • مشتری روش جدیدی برای مدیریت سفارش خود دارد، مانند شماره تلفن پشتیبانی مشتری یا رستوران.
  • رسید سفارش در دسترس می شود.

بخش‌های بعدی جزئیاتی در مورد نحوه رسیدگی به این سناریوهای مختلف با استفاده از به‌روزرسانی‌های سفارش ارائه می‌دهند.

حالت های انتقالی

یک سفارش دارای شش حالت ممکن است. این حالت ها و انتقال های احتمالی آنها در نمودار زیر نشان داده شده است:

ترتیب انتقال حالت

هنگامی که مشتری برای اولین بار سفارشی را ارسال می کند، سفارش با حالت CREATED ، CONFIRMED یا REJECTED شروع می شود. تا زمانی که انتقال وضعیت معتبر باشد، می‌توانید پیام به‌روزرسانی سفارش را برای به‌روزرسانی وضعیت سفارش ارسال کنید. حالت CREATED زمانی استفاده می‌شود که پلتفرم شریک نتواند سفارش را فورا تأیید یا رد کند. یک مثال استفاده زمانی است که مشتری از طریق یک تجمیع کننده تحویل سفارش می دهد. تجمیع‌کننده تحویل، تحویل را از Google دریافت می‌کند و جمع‌آورنده اطلاعات را به رستوران ارسال می‌کند. هنگامی که رستوران در دسترس بودن سفارش را دریافت و تأیید کرد، اکنون می توان وضعیت CONFIRMED ، در غیر این صورت REJECTED .

یک سفارش در وضعیت CONFIRMED در مرحله بعدی به وضعیت IN_PREPARATION منتقل می شود. بسته به اینکه سفارش برای تحویل است یا تحویل، در مرحله بعدی از حالت READY_FOR_PICKUP یا IN_TRANSIT استفاده کنید. وقتی غذا تحویل داده شد یا تحویل گرفت، سفارش روی حالت FULFILLED تنظیم می شود.

اگر به مشتریان اجازه می دهید سفارشات را لغو کنند، می توانید از حالت CANCELLED استفاده کنید. یک سفارش را می توان در حالت CREATED ، CONFIRMED ، IN_PREPARATION ، READY_FOR_PICKUP یا IN_TRANSIT لغو کرد. سرویس پایان به انتها سفارش شما باید بسته به خط مشی لغو و وضعیت پرداخت ها در زمان لغو، بازپرداخت را صادر کند.

خدمات پایان به انتها سفارش شما مجبور نیست از همه حالت ها و انتقال های موجود پشتیبانی کند. با این حال، وضعیت نهایی سفارش باید FULFILLED ، REJECTED ، یا CANCELLED .

ارائه زمان برآوردی انجام

می‌توانید محدوده زمانی تخمینی را برای زمان آماده شدن سفارش آنها برای تحویل (یا تحویل) به کاربران ارائه دهید. از قسمت estimatedFulfillmentTimeIso8601 در FoodOrderUpdateExtension برای ارائه یک محدوده زمانی تخمینی برای زمانی که سفارش مشتری برای تحویل گرفتن یا تحویل آماده می شود، استفاده کنید.

estimatedFulfillmentTimeIso8601 در زمان های زیر ارسال کنید:

  • زمانی که زمان تخمینی در دسترس باشد، در حالت ایده‌آل در حالت CREATED یا CONFIRMED .
  • زمانی که زمان تخمینی تغییر می‌کند، مانند به‌روزرسانی زمان تخمینی برای دقیق‌تر شدن زمانی که سفارش IN_TRANSIT است.

برای مدیریت موثر انتظارات کاربر، در برآوردهای خود محافظه کار باشید و به جای تاریخ و زمان ثابت، محدوده تاریخ و زمانی را ارائه دهید. تا حد امکان باید تغییراتی مانند شرایط ترافیکی را در نظر بگیرید. به عنوان مثال، می توانید برای سفارشی که زمان تخمینی تحویل آن ساعت 13:00 است، تخمینی از 12:45 بعد از ظهر (کران پایین) تا 1:15 بعد از ظهر (کران بالایی) ارسال کنید.

ارائه اقدامات مدیریت سفارش

هنگام ارسال به‌روزرسانی سفارش، می‌توانید منابعی را در اختیار مشتریان قرار دهید که به آنها در مدیریت سفارش خود در قالب OrderManagementAction کمک می‌کند. پس از اینکه مشتری سفارش داد، ممکن است لازم باشد با شما یا رستورانی که سفارش را انجام می دهد تماس بگیرد تا پیشرفت را پیگیری کند، تغییراتی ایجاد کند یا سفارش خود را لغو کند.

OrderManagementAction به مشتریان امکان می دهد مستقیماً از دستگاه خود ایمیل بزنند، تماس بگیرند یا به URL پیوند دهند. در OrderManagementAction از همان اطلاعاتی که در تأیید سفارش ایمیلی که برای کاربر ارسال می‌کنید استفاده کنید.

اقدامات مدیریت سفارش شامل انواع زیر است:

  • CUSTOMER_SERVICE : به مشتریان اقدامی برای تماس با خدمات مشتری ارائه دهید. این نوع اقدام مدیریتی برای به‌روزرسانی سفارش لازم است.
  • EMAIL : به مشتریان اقدامی برای ارسال ایمیل به آدرس ایمیل ارائه شده ارائه دهید.
  • CALL : به مشتریان اقدامی برای تماس با شماره تلفن ارائه شده ارائه دهید.
  • VIEW_DETAIL : برای مشاهده جزئیات سفارش به مشتریان اقدامی ارائه دهید.

هر به‌روزرسانی سفارش باید حداقل یک اقدام مدیریت سفارش داشته باشد. با این حال، اقدامات مدیریت سفارش ارائه شده می تواند بر اساس وضعیت سفارش متفاوت باشد. به عنوان مثال، هنگامی که یک سفارش در وضعیت CONFIRMED است، عملکرد CUSTOMER_SERVICE می تواند به شماره تلفن خدمات مشتری شما اشاره کند. هنگامی که وضعیت سفارش به IN_TRANSIT به‌روزرسانی می‌شود، اقدام CUSTOMER_SERVICE می‌تواند به شماره تلفن رستوران تکمیلی اشاره کند.

ارسال به روز رسانی سفارش

شما از نوع پیام AsyncOrderUpdateRequestMessage برای ارسال به روز رسانی سفارش به سرویس Ordering End-to-End استفاده می کنید. Google با یک AsyncOrderUpdateResponseMessage پاسخ می دهد. برای مثال، اگر می‌خواهید به مشتری اطلاع دهید که سفارش او معتبر و پذیرفته شده است، می‌توانید یک AsyncOrderUpdateRequestMessage برای تغییر وضعیت سفارش به CONFIRMED با برچسب Accepted by restaurant ارسال کنید.

نمودار به روز رسانی سفارش

تنظیم پیام به روز رسانی سفارش

وقتی AsyncOrderUpdateRequestMessage را به Google ارسال می‌کنید، باید اطلاعاتی درباره وضعیت سفارش با استفاده از قسمت OrderUpdate اضافه کنید.

مثال‌های زیر یک نمونه AsyncOrderUpdateRequestMessage را برای هر حالت سفارش نشان می‌دهند:

تایید شده

این مثال یک نمونه درخواست به‌روزرسانی سفارش را نشان می‌دهد که به کاربر اطلاع می‌دهد که سفارش با یک رسید و زمان تخمینی تحویل تأیید شده است.

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

رد شد

این مثال نمونه درخواست به‌روزرسانی سفارش را نشان می‌دهد که به کاربر اطلاع می‌دهد که سفارش با دلیل رد رد شده است.

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

لغو شد

این مثال نمونه درخواست به‌روزرسانی سفارش را نشان می‌دهد که به کاربر اطلاع می‌دهد که سفارش با دلیل لغو لغو شده است.

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

در آماده سازی

این مثال یک نمونه درخواست به روز رسانی سفارش را نشان می دهد که به کاربر اطلاع می دهد که غذا در حال آماده شدن است.

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

این مثال یک نمونه درخواست به‌روزرسانی سفارش را نشان می‌دهد که به کاربر اطلاع می‌دهد که غذا برای تحویل گرفتن آماده است.

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

این مثال یک نمونه درخواست به‌روزرسانی سفارش را نشان می‌دهد که به کاربر اطلاع می‌دهد که سفارش با زمان تحویل تخمینی در حال انتقال است.

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

برآورده شد

این مثال یک نمونه درخواست به‌روزرسانی سفارش را نشان می‌دهد که به کاربر اطلاع می‌دهد که سفارش دریافت یا تحویل شده است:

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

برای نمونه‌های بیشتر از درخواست‌های به‌روزرسانی سفارش در موارد استفاده مختلف، اجرای به‌روزرسانی‌های سفارش پیشرفته را بخوانید.

کد مجوز تولید کنید و پیام را ارسال کنید

به‌روزرسانی‌های سفارش به یک رمز مجوز نیاز دارند تا سرویس «سفارش پایان به انتها» بتواند تأیید کند که پیام از سرویس وب «پایان به پایان سفارش» شما است.

برای پیاده سازی به روز رسانی سفارش برای پروژه خود، این مراحل را دنبال کنید:

  1. با دنبال کردن مراحل زیر یک نشانه مجوز ایجاد کنید:
    1. از کتابخانه Google Auth برای خواندن اطلاعات کاربری از فایل حساب سرویس خود استفاده کنید.
    2. درخواست رمز با استفاده از محدوده API زیر: https://www.googleapis.com/auth/actions.fulfillment.conversation
  2. از این نشانه برای ارسال یک درخواست HTTP POST تأیید شده به نقطه پایانی زیر استفاده کنید: https://actions.googleapis.com/v2/conversations:send
  3. هدر Content-Type روی application/json به عنوان بخشی از درخواست خود تنظیم کنید.

مثال‌های زیر نحوه اجرای به‌روزرسانی‌های سفارش را نشان می‌دهند:

Node.js

این کد از کتابخانه تأیید Google برای Node.js استفاده می کند.

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)}`)
  })
}
    

پایتون

این کد از کتابخانه اعتبار گوگل برای پایتون استفاده می کند.

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)
    

جاوا

این کد از کتابخانه تایید گوگل برای جاوا استفاده می کند.

/**
 * 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 یک پاسخ HTTP 200 را با یک بار خالی برمی‌گرداند. اگر مشکلی وجود داشته باشد، مثلاً به‌روزرسانی بد شکل باشد، Google خطایی را برمی‌گرداند.