我建立一个AOG项目,会做基本的交易功能(对谷歌的行为)。因为我还是有点新的AOG,我完全被卡住就如何采取什么样的用户选择(无论它是一个旋转木马,基本卡等),并通过该参数值/关键,他们选择到提出订购或订购预览他们完成他们的交易之前。
这基本上是我曾尝试(这是不实际的代码,因为它是相当长的,但它还是横跨有想法)
app.intent('delivery_address_complete', (conv) => {
const arg = conv.arguments.get('DELIVERY_ADDRESS_VALUE');
if (arg.userDecision ==='ACCEPTED') {
conv.ask('Ok, what would you like to order?');
conv.ask(new Suggestions(intentSuggestions));
conv.ask(new Carousel({
items: {
// Add the first item to the carousel
SELECTION_KEY_COFFEE: {
synonyms: [
'Coffee'
],
title: 'Coffee',
description: 'Sweet cream and sugar coffee.',
image: new Image({
url: IMG_URL_COFFEE,
alt: 'Image alternate text',
}),
},
}));
}
});
const yesOrno = [
'Yes',
'No'
];
app.intent('actions.intent.OPTION', (conv ) => {
conv.ask('Okay, are you ready to proceed?');
conv.ask(new Suggestions(yesOrno));
});
app.intent('transaction_decision_action', (conv) => {
const order = {
id: UNIQUE_ORDER_ID,
cart: {
merchant: {
id: 'coffee',
name: 'Coffee Store',
},
lineItems: [
{
name: 'My Memoirs',
id: 'coffee_1',
price: {
amount: {
currencyCode: 'USD',
nanos: 990000000,
units: 3,
},
type: 'ACTUAL',
},
quantity: 1,
subLines: [
{
note: 'coffee',
},
],
type: 'REGULAR',
},
otherItems: [
{
name: 'Subtotal',
id: 'subtotal',
price: {
amount: {
currencyCode: 'USD',
nanos: 220000000,
units: 32,
},
type: 'ESTIMATE',
},
type: 'SUBTOTAL',
},
{
name: 'Tax',
id: 'tax',
price: {
amount: {
currencyCode: 'USD',
nanos: 780000000,
units: 2,
},
type: 'ESTIMATE',
},
type: 'TAX',
},
],
totalPrice: {
amount: {
currencyCode: 'USD',
nanos: 0,
units: 35,
},
type: 'ESTIMATE',
},
};
请注意:这多半是假的代码,所以如果喜欢过充电或价格不决策意识正在发生的一些事情,这不是问题,我试图修复。
我怎样才能把用户从任何方法选择了什么,并获得它,所以它会出现在顺序预览或建议的订单?我并不需要提供有关制造循环或基本卡ECT的任何帮助。只是如何得到这个选定的信息与订单预览。
更加具体:
order
对象,我知道如何把它作为成为ProposedOrder
对象的一部分TransactionDecision
对象的一部分发送给谷歌(然后到用户)。 (其中“transaction_decision_action”意图在码处理程序的上方。)order
。 (我怎么在“actions.intent.OPTION”意向处理上面做,比如?)编辑:这也可以消除混淆。这就是我试图做(在下面的评论中提到)的视频表示:
你希望做什么是谷歌称之为building the order。因为它指出该链接
一旦你有你需要的用户信息,您将构建一个“购物车集结号”的经验,指导用户构建一个订单。每一个动作将可能有一个稍微不同的车装配流程以适合您的产品或服务。
你可以建立一个购物车组装体验,使用户能够重新排序通过一个简单的是或否的问题,他们最近购买。你也可以为用户呈现顶部的“精选”或“推荐”的项目旋转木马或列表卡。我们建议您使用rich responses以可视化方式呈现用户的选择,同时也设计了对话,使得用户可以只使用其语音建立自己的购物车。
关于如何建立一个高质量的车装配经验的更多信息,请参阅Transactions Design Guidelines。
因此,有没有人做你问什么样的方式。然而,有事情可以和应该做的构建proposed order的一些技巧。
管理秩序
你需要做的最重要的事情就是保持一切,当你经历的过程用户订购的东西的轨道。这里有许多可以存储这些信息的方式:
总之,任何现行方式,你必须存储会话信息。下面所有的信息假定你找一些方法来做到这一点。
既然一切都将成为lineItems
之一,一个简单的解决方案是构建这个数组,你走,然后你可以在阵列直接复制到订单对象。另一种方法是只存储物品ID的列表,然后填充的信息,剩下的以后,当我们建立秩序。
在这个例子中,我们将与后者的方案去(因为它更容易显示),并使用操作上,谷歌图书馆将其存储在会话存储对象。
所以对于初学者来说,当我们开始行动,或当我们知道我们将采取订单,我们需要初始化我们的项目清单,像被责令
conv.user.data.items = [];
现在,我们有我们最初的项目列表中,我们可以探索不同的方式来添加到这个列表。
添加一个项目:“我经常”
对于某些类型的订单,它可能是有意义的用户可以说“我要我平常”的。在这样的情况下,我们要处理这一短语(或处理“是”回应我们的提示)的意图和意图处理程序中查找用户的正常秩序,并把它添加到项目。也许是这样的:
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
)。
在处理此,我们假设你使用该选项的按键也恰好是该项目的ID,所以你可以把它添加到列表
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?" );
});
按名称添加项目
但要记住,用户可以在任何时间通话在任何方向。因此,他们可能会要求你目前在转盘没有显示的项目。处理这种情况最好的方法是通过创建一个实体类型的Dialogflow(我会打电话给item
,作为一个例子)
然后捕捉一些短语表达了用户要求添加它们(我会打电话给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
的所有其它部分。
然后,我们需要通过发送包含我们的propose the 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,
}));
});
我打破了大部分的东西作为一个功能,因为没有什么具体的关于他们,除了顺序(你在你的例子说明)的格式。你真的可以建立你想要的任何方式。
结论
大部分的你需要做的确实可归结为