Dialogflow触发actions.intent类意图失败及交易API集成问题
解决Dialogflow+Google Assistant交易机器人的Webhook问题
我来帮你一步步梳理这些问题,都是开发Google Assistant交易功能时常见的坑:
一、解决"无法解析webhook响应,找不到data字段"与模拟器206错误
这两个问题本质是返回的JSON格式不符合Google Assistant的系统意图触发要求。要触发actions.intent.TRANSACTION_REQUIREMENTS_CHECK,你的Flask webhook必须返回严格符合Actions on Google规范的响应,核心是要在payload.google.systemIntent下包含正确的data字段。
举个正确的Python/Flask返回示例:
from flask import Flask, jsonify, request app = Flask(__name__) @app.route('/webhook', methods=['POST']) def webhook(): req = request.get_json() intent_name = req['queryResult']['intent']['displayName'] if intent_name == 'Int1': # 构造触发交易要求检查的响应 response = { "payload": { "google": { "expectUserResponse": True, "systemIntent": { "intent": "actions.intent.TRANSACTION_REQUIREMENTS_CHECK", "data": { "@type": "type.googleapis.com/google.actions.transactions.v3.TransactionRequirementsCheckSpec", "paymentOptions": { "actionProvidedOptions": { "displayName": "信用卡/借记卡", "paymentType": "PAYMENT_CARD" } } } } } } } return jsonify(response) # 其他意图的处理逻辑 return jsonify({}) if __name__ == '__main__': app.run(port=5000, debug=True)
关键要点:
- 必须包含
payload.google.systemIntent.data字段,且@type要精准指向Google定义的交易规范类型(不能写错) - 用
jsonify返回响应,它会自动设置正确的Content-Type: application/json,避免格式解析问题 - 确保
expectUserResponse设为True,让Assistant继续处理系统意图
二、为何收不到交易要求检查结果?
主要有两个可能:
- 模拟器不支持交易功能:正如Google文档提示的,Web模拟器无法完整模拟交易流程,可能根本不会触发
actions_intent_TRANSACTION_REQUIREMENTS_CHECK系统意图。建议改用真实的Android/iOS设备,用绑定了你开发项目的Google账号测试。 - Int2配置有误:检查你的Int2是否正确绑定了
actions_intent_TRANSACTION_REQUIREMENTS_CHECK事件,并且启用了Webhook调用。只有启用Webhook,Assistant才会把检查结果发送到你的后端。
另外,可以去Dialogflow控制台的「Diagnostics > Logs」查看Webhook的请求/响应日志,确认系统意图是否真的被触发,以及返回的结果是否正常。
三、如何从Webhook触发系统意图?
触发actions.intent.XXX这类系统意图的通用方法,就是在Webhook返回的响应中通过payload.google.systemIntent指定目标意图:
- 在
systemIntent.intent字段填入要触发的系统意图全名(比如actions.intent.TRANSACTION_DECISION、actions.intent.PERMISSION等) - 根据该系统意图的要求,在
systemIntent.data中填入对应结构的参数,必须包含@type字段指向Google定义的类型(每个系统意图的data结构都不同,要严格对照官方文档) - 确保
expectUserResponse设为True,让Assistant接管后续交互
举个触发权限请求系统意图的例子:
response = { "payload": { "google": { "expectUserResponse": True, "systemIntent": { "intent": "actions.intent.PERMISSION", "data": { "@type": "type.googleapis.com/google.actions.v2.PermissionValueSpec", "optContext": "为了帮你完成订单,需要获取你的地址信息", "permissions": ["NAME", "DEVICE_PRECISE_LOCATION"] } } } } }
额外注意事项
- 确保你的Google Cloud项目已经启用了Transactions API,并且在Google Assistant控制台配置了正确的支付设置
- 检查ngrok的隧道是否正常运行,Dialogflow中配置的Webhook URL必须是ngrok提供的HTTPS地址(HTTP会被拒绝)
- 测试交易功能时,要用符合要求的测试账号(比如已绑定支付方式的Google账号,且处于项目的测试白名单中)
内容的提问来源于stack exchange,提问作者Outcast
相关产品推荐
相关产品推荐

