如何从我的webhook触发`action.intent.INTENT_NAME`意图?

时间:2018-05-15 16:36:32

标签: actions-on-google dialogflow

我想用Dialogflow和Google智能助理以及Google Transactions API创建一个聊天机器人,以便用户订购巧克力盒。现在我的代理包含以下四个意图:

  • Default Welcome Intent(文字回复:你好,你想买一个巧克力盒吗?)
  • Default Fallback Intent
  • Int1(培训短语:是的,我想要,履行:启用webhook通话)
  • Int2(事件:actions_intent_TRANSACTION_REQUIREMENTS_CHECK)

我使用Dialogflow Json而不是Node.js将我的代理与Transactions API连接起来。我想通过使用Google操作的actions.intent.TRANSACTION_REQUIREMENTS_CHECK操作来测试用户是否符合交易要求(订购巧克力盒时)。出于这个原因,在Google文档之后,当Int1被触发时,我正在使用将Google智能助理连接到以下python脚本(后端)的webhook:

from flask import Flask, render_template, request, jsonify
from flask_cors import CORS
import  requests

app = Flask(__name__)
CORS(app)

@app.route("/",  methods=['POST'])

def index():

    data = request.get_json()    
    intent = data["queryResult"]["intent"]["displayName"]

    if (intent == 'Int1'):

        return jsonify({ "data": {
                "google": {
                "expectUserResponse": True,
                "isSsml": False,
                "noInputPrompts": [],
                "systemIntent": {
                  "data": {
                    "@type": "type.googleapis.com/google.actions.v2.TransactionRequirementsCheckSpec",
                    "paymentOptions": {
                      "actionProvidedOptions": {
                        "displayName": "VISA-1234",
                        "paymentType": "PAYMENT_CARD"
                      }
                    }
                  },
                  "intent": "actions.intent.TRANSACTION_REQUIREMENTS_CHECK"
                                }
                        }
                                        }
                })
    else:
        return jsonify({'message': 'HERE'})

if __name__== "__main__":
    app.run(debug=True)

我在intent = 'Int1'指定的时候返回的json是Google文档指定的#34;使用您自己的付款方式检查要求"。 根据Google文档,这必须在下一步完成:

  

收到需求检查的结果

     

在助理履行意图后,它会发送您的履行a   使用actions.intent.TRANSACTION_REQUIREMENTS_CHECK意图请求   检查结果。

     

要正确处理此请求,请声明一个Dialogflow意图   由actions_intent_TRANSACTION_REQUIREMENTS_CHECK事件触发。

出于这个原因,我定义了Int2,并将其定义为actions_intent_TRANSACTION_REQUIREMENTS_CHECK

但是,由于检查结果,我在后端没有收到任何内容,因此我不知道动作actions.intent.TRANSACTION_REQUIREMENTS_CHECK是否真的被触发了。为什么会这样?

一般情况下,如何从我的webhook /后端触发一个actions.intent.INTENT_NAME意图?

当我使用Dialogflow的v2版本时,我在触发Int1时收到有关Dialogflow上的webhook的以下信息/消息:

  "webhookStatus": {
    "code": 3,
    "message": "Webhook call failed. Error: Failed to parse webhook JSON response: Cannot find field: data in message google.cloud.dialogflow.v2.WebhookResponse."
  }

在相同的情况下,我在触发Int1时收到有关Google智能助理模拟器上的webhook的以下信息/消息:

  "responseMetadata": {
    "status": {
      "code": 14,
      "message": "Webhook error (206)"
    }

最后,让我提一下,我正在本地计算机上使用Pythonngrok对所有这些进行测试,因此这可能会产生问题,因为在Google文档的开头提到了以下内容:

  

警告:不应使用Actions Web Simulator来测试应用   与交易。请使用启用助理的Android或iOS   在开发过程中准确测试应用程序的设备。

2 个答案:

答案 0 :(得分:2)

我终于解决了这个问题。

我必须使用密钥"data"替换Int1触发时jsen中的密钥"payload"。换句话说,我必须调整对v2 version的{​​{1}}的履行回复。

因此,现在我的后端发出第二个帖子请求,因为Dialogflowactions.intent.TRANSACTION_REQUIREMENTS_CHECK的触发而发送。

具体来说,我得到以下内容:

Int2

答案 1 :(得分:-1)

我认为您的回复对象不正确。 intent 属性应位于 systemIntent 对象

"data": {
  "google": {
    "expectUserResponse": true,
    "isSsml": false,
    "noInputPrompts": [],
    "systemIntent": {
      "intent": "actions.intent.TRANSACTION_REQUIREMENTS_CHECK",
      "data": {
        "@type": "type.googleapis.com/google.actions.v2.TransactionRequirementsCheckSpec",
        "paymentOptions": {
          "actionProvidedOptions": {
            "displayName": "VISA-1234",
            "paymentType": "PAYMENT_CARD"
          }
        }
      }
    }
  }
}