То, что вы хотите сделать, это то, что Google называет построение заказа .Как видно по этой ссылке
Как только вы получите необходимую информацию о пользователе, вы создадите «сборку тележки», которая поможет пользователю создать заказ.Каждое действие, скорее всего, будет иметь несколько иной порядок сборки тележки в зависимости от вашего продукта или услуги.
Вы можете создать опыт сборки тележки, который позволит пользователю переупорядочить свою последнюю покупку, просто ответив на вопрос «да» или «нет»вопрос.Вы также можете подарить пользователю карусель или карточку списка самых популярных или рекомендуемых предметов.Мы рекомендуем использовать расширенные ответы , чтобы визуально представить параметры пользователя, а также спроектировать диалог так, чтобы пользователь мог построить свою корзину, используя только свой голос.
Для получения дополнительной информации о том, как создатьопыт сборки тележки высокого качества, см. Руководство по проектированию транзакций .
Так что нет единого способа сделать то, о чем вы просите.Тем не менее, есть несколько советов, которые вы можете и должны сделать для создания предлагаемого заказа .
Управление заказом
Большойвсе, что вам нужно сделать, это отслеживать все вещи, которые заказывает пользователь, по мере того, как вы проходите этот процесс.Существует несколько способов сохранить эту информацию:
- В контексте диалогового потока
- В хранилище сеансов пользователя
- В базе данных или хранилище данных длясеанс
Короче говоря, любой из текущих способов хранения информации о сеансе.Вся приведенная ниже информация предполагает, что вы выбрали какой-то способ сделать это.
Поскольку все станет одним из lineItems
, простое решение состоит в том, чтобы создать этот массив по мере продвижения, а затем вы можетепросто скопируйте массив непосредственно в объект заказа.Другой подход состоит в том, чтобы просто сохранить список идентификаторов элементов, а затем заполнить оставшуюся информацию позже, когда мы создадим заказ.
Для этого примера мы собираемся пойти по этой последней схеме (потому что еепроще показать) и сохранить его в объекте хранения сеанса с помощью библиотеки actions-on-google.
Итак, для начала, когда мы запускаем действие или когда мы знаем, что примем заказ, мынужно инициализировать наш список предметов, которые заказываются, с помощью чего-то вроде
conv.user.data.items = [];
Теперь, когда у нас есть наш начальный список предметов, мы можем исследовать различные способы добавления в этот список.Добавление элемента: «мой обычный»
Для некоторых типов заказов может иметь смысл сказать пользователю «У меня все будет как обычно».В подобных случаях нам нужен Intent, который обрабатывает эту фразу (или обрабатывает ответ «да» на наши запросы), и Intent Handler, который просматривает обычный заказ пользователя и добавляет его к элементам.Возможно, что-то вроде этого:
app.intent('order.usual', conv => {
// Get their user profile from our database
// The "loadUser" function is up to you, and has little to do with AoG
return loadUser( conv )
.then( user => {
// Add each item in their usual order to the current items
let usualOrder = user.usualOrder;
usualOrder.forEach( item => conv.user.data.items.push( item ) );
// Send a message back to the user
conv.add( "You got it! Do you want anything else?" );
});
});
Добавление элемента из списка
Если вы предоставили пользователю карусель или список возможных элементов, вашжизнь немного легче (хотя вы можете не думать об этом в данный момент).Вам нужно настроить намерение Dialogflow, которое обрабатывает событие actions_intent_OPTION
(которое в этом случае я назову order.option
).
В обработчике для этого мы будем предполагать, что ключ, который вы использовали для этой опции, также является идентификатором элемента, поэтому вы можете просто добавить его в список
app.intent('order.option', (conv, params, option) => {
// The item is the option sent
let item = option;
// Add the item to the list of items
conv.user.data.items.push( item );
// Send a message back to the user
conv.add( "I've put that in your cart. Anything else?" );
});
Добавление элементапо имени
Но помните, пользователь может вести разговор в любом направлении в любое время.Поэтому они могут попросить предмет, который вы в данный момент не видите в карусели.Лучший способ справиться с этим - создать тип объекта в диалоговом потоке (в качестве примера я назову item
)
Изатем Intent, который захватывает некоторые фразы, выражающие пользователя, который просит добавить их (который я назову order.name
и который имеет параметр itemName
, который пользователь должен включить).
[
В обработчике вам нужно получить имя, которое они произвели, посмотреть, что это за предмет, и добавить его в список заказанных им предметов.
app.intent('order.name', (conv, params) => {
// Get the name
let itemName = params['itemName'];
// Look it up to find out what they ordered
// You need to implement the itemFromName function
return itemFromName( itemName )
.then( item => {
// Add the item
conv.user.data.items.push( item );
// And reply
conv.add( "You got it! Anything else?" );
});
});
ГотовоПостроение заказа
После того, как вы закончили собирать все, что хотите, ваш обработчик намерений должен упорядочить заказ, собрав полный список lineItems
из массива conv.user.data.items
, которым мы былисоставление, расчет налога, итогов и всех других частей order
.
Затем нам нужно предложить заказ , отправив объект TransactionDecision, который содержит наш заказ в proposedOrder
параметр.Умно, нет?Возможно, что-то вроде этого:
app.intent('review', conv => {
// Get the items the user has saved
let items = conv.user.data.items;
// Turn these into more complete lineItems
// You will need to provide the "itemToLineItem" function
let lineItems = items.map( itemToLineItem );
// Get some other objects we need
// You'll need to define these functions, too
let orderId = generateOrderId();
let subtotal = computeSubtotal( lineItems );
let tax = computeTax( lineItems );
let total = computerTotal( subtotal, tax );
// Build the order object
let order = buildOrder( lineItems, subtotal, tax, total );
conv.ask(new TransactionDecision({
orderOptions: {
requestDeliveryAddress: false,
},
paymentOptions: {
googleProvidedOptions: {
prepaidCardDisallowed: false,
supportedCardNetworks: ['VISA', 'AMEX'],
// These will be provided by payment processor,
// like Stripe, Braintree, or Vantiv.
tokenizationParameters: {
tokenizationType: 'PAYMENT_GATEWAY',
parameters: {
'gateway': 'stripe',
'stripe:publishableKey': (conv.sandbox ? 'pk_test_key' : 'pk_live_key'),
'stripe:version': '2017-04-06'
},
},
},
},
proposedOrder: order,
}));
});
Я разбил большую часть материала как функцию, поскольку в них нет ничего конкретного, кроме формата порядка (который вы иллюстрируете в своем примере).Вы действительно можете построить его любым способом.
Заключение
Многое из того, что вам нужно сделать, в действительности сводится к
- Сборинформация о том, что пользователь хочет заказать, в основном сохраняя идентификаторы этих элементов
- Превращение этого списка элементов в полный объект заказа
- Отправка этого заказа для просмотра пользователем