如何获得用户权利以在整个对话中持续存在

时间:2019-05-28 01:29:40

标签: actions-on-google

我试图通过检查conv.user.entitlements来查看用户是否购买了产品,但购买后立即除外,这是空的。

此值以前在对话之间似乎一直存在,现在始终为空。购买后我可以立即使用conv.user.entitlements看到该权利,但是随后它消失了。

 if (arg.purchaseStatus === 'PURCHASE_STATUS_OK') {
 console.log('purchase2 ', conv.user.entitlements);
//this works as expected showing the entitlement

在日志中,我看到:Purchase2 [{授权:[[Object]],     packageName:'com.chad.myfirstapp'}]

但是当我尝试在下一次对话中记录相同内容时,我得到:

purchase2 []

2 个答案:

答案 0 :(得分:0)

尽管conv.user对象能够跨会话存储数据,但要记住documented here既有技术限制,也有法律限制。

当Assistant可以将身份与用户匹配时,用户存储的内容将永不过期,只有用户或操作本身可以清除它。

当助手无法将身份与用户匹配时,将在对话结束时清除用户存储的内容。助手无法将身份与用户匹配的情况的示例包括:

  • 已设置语音匹配,但没有匹配。
  • 用户禁用了个人数据。

除了conv.user对象之外,您还可以将数据存储在首选数据库中。 This Github sample演示了如何将Dialogflow连接到Firebase Firestore数据库。 您可以找到写入功能here

  function writeToDb (agent) {

    // Get parameter from Dialogflow with the string to add to the database
    const databaseEntry = agent.parameters.databaseEntry;

    // Get the database collection 'dialogflow' and document 'agent' and store
    // the document  {entry: "<value of database entry>"} in the 'agent' document
    const dialogflowAgentRef = db.collection('dialogflow').doc('agent');
    return db.runTransaction(t => {
      t.set(dialogflowAgentRef, {entry: databaseEntry});
      return Promise.resolve('Write complete');
    }).then(doc => {
      agent.add(`Wrote "${databaseEntry}" to the Firestore database.`);
    }).catch(err => {
      console.log(`Error writing to Firestore: ${err}`);
      agent.add(`Failed to write "${databaseEntry}" to the Firestore database.`);
    });
  }

答案 1 :(得分:0)

如果您只想查看用户是否曾经购买过商品,请使用conv.user.storage存储一个布尔值,以了解用户是否曾经购买过商品:

conv.user.storage.hasPurchasedItem = true

或者也许您可以在conv.user.storage中进行购买并检查其长度:

conv.user.storage.purchases = conv.user.storage.purchases || [] conv.user.storage.purchases.push({item: bananas, cost: 0.99})