如何将Api.Ai(Dialogflow)聊天机器人与交易类网站集成实现预订/下单
嘿,你这个想法超实用!既然已经用Dialogflow搭好了能日常对话的机器人,用Webhook来对接这些交易平台确实是最顺的路子——毕竟Dialogflow的Webhook本来就是用来扩展自定义功能的核心入口。下面我结合你提到的三个平台,给你拆解具体的实现步骤,都是实打实的可操作方案:
核心逻辑:用Dialogflow Webhook串联第三方API
简单来说,整个流程是这样的:
- 用户跟机器人说“我要订个大号芝士披萨”,Dialogflow识别出意图是「订披萨」,同时提取出「尺寸:大号」「口味:芝士」这些关键实体
- Dialogflow把这些数据发送给你搭建的Webhook服务
- 你的Webhook服务调用对应平台的API(比如Domino's的订单接口)完成操作
- Webhook把操作结果返回给Dialogflow,机器人再把结果用自然语言告诉用户
下面是三个平台的具体落地步骤:
1. 对接 Domino's 订购披萨
Domino's在部分地区提供官方开发者API,你可以按以下步骤来:
- 第一步:拿API权限:去Domino's开发者平台注册账号,申请API密钥,同时熟悉他们的接口文档(比如获取菜单、创建订单、查询配送状态这些)
- 第二步:配置Dialogflow意图:创建名为
OrderPizza的意图,添加「披萨尺寸」「口味」「配送地址」「联系方式」这些实体(Dialogflow自带的地址、文本实体可以直接用,也可以自定义),确保机器人能准确提取用户的需求 - 第三步:写Webhook服务:用你熟悉的语言(比如Python/Node.js)搭建一个接收Dialogflow请求的服务,把提取到的实体整理成Domino's API要求的格式,调用订单接口。举个Python(Flask)的简单示例:
from flask import Flask, request, jsonify import requests app = Flask(__name__) # 替换成你自己的Domino's API密钥和接口地址 DOMINOS_API_KEY = "your_api_key_here" DOMINOS_ORDER_URL = "https://api.dominos.com/order/create" @app.route('/webhook', methods=['POST']) def webhook(): req = request.get_json() intent_name = req['queryResult']['intent']['displayName'] if intent_name == 'OrderPizza': # 提取Dialogflow传来的用户需求 pizza_size = req['queryResult']['parameters']['size'] pizza_topping = req['queryResult']['parameters']['topping'] delivery_addr = req['queryResult']['parameters']['address'] # 构造Domino's API需要的请求数据 order_payload = { "size": pizza_size, "toppings": [pizza_topping], "deliveryAddress": delivery_addr, "apiKey": DOMINOS_API_KEY } # 调用Domino's API创建订单 api_response = requests.post(DOMINOS_ORDER_URL, json=order_payload) result = api_response.json() # 把结果返回给Dialogflow,让机器人告诉用户 if result.get('status') == 'success': fulfillment_text = f"搞定啦!你的披萨订单号是{result['orderId']},预计30分钟内送到~" else: fulfillment_text = "抱歉哦,刚才创建订单失败了,麻烦再试一次?" return jsonify({'fulfillmentText': fulfillment_text}) return jsonify({'fulfillmentText': "我暂时处理不了这个请求哦😅"}) if __name__ == '__main__': app.run(port=5000, debug=True)
- 第四步:部署+配置:把Webhook服务部署到公网(比如用Heroku、AWS Lambda),然后在Dialogflow的「Fulfillment」页面里填好你的Webhook URL,给
OrderPizza意图开启Webhook调用权限
2. 对接 Expedia 预订机票
Expedia有专门的合作伙伴开发者平台,提供航班、酒店等预订API,流程会比订披萨复杂一点(因为涉及多轮对话):
- 第一步:申请API权限:注册Expedia开发者账号,申请航班预订相关的API权限,获取API密钥和OAuth令牌(部分接口需要身份验证)
- 第二步:配置Dialogflow意图和上下文:创建
BookFlight意图,添加「出发地」「目的地」「出发日期」「乘客数」这些实体;同时配置上下文(Contexts),用来保存中间状态(比如用户选了航班后,把航班ID存在上下文里,下一步收集乘客信息) - 第三步:Webhook处理多轮流程:先调用Expedia的航班搜索API,返回几个可选航班让用户选择,用户选完后再调用预订接口。举个Node.js(Express)的示例片段:
const express = require('express'); const request = require('request'); const app = express(); app.use(express.json()); // 替换成你自己的Expedia API信息 const EXPEDIA_API_KEY = 'your_api_key_here'; const EXPEDIA_FLIGHT_SEARCH_URL = 'https://api.expedia.com/v1/flights/search'; app.post('/webhook', (req, res) => { const intentName = req.body.queryResult.intent.displayName; if (intentName === 'BookFlight') { const origin = req.body.queryResult.parameters.origin; const destination = req.body.queryResult.parameters.destination; const departureDate = req.body.queryResult.parameters.departureDate; // 构造航班搜索参数 const searchParams = { origin, destination, departureDate, apiKey: EXPEDIA_API_KEY }; // 调用Expedia航班搜索API request.post({url: EXPEDIA_FLIGHT_SEARCH_URL, json: searchParams}, (error, response, body) => { if (!error && response.statusCode === 200) { // 取前3个航班选项给用户选 const topFlights = body.flights.slice(0, 3); let replyText = "找到以下合适的航班:\n"; topFlights.forEach((flight, idx) => { replyText += `${idx+1}. ${flight.airlineName},${flight.departureTime}起飞,价格${flight.totalPrice}元\n`; }); replyText += "请告诉我你想选哪一个?"; // 把航班信息存在上下文里,方便后续调用预订接口 const outputContexts = [ { name: `${req.body.session}/contexts/flight-options`, lifespanCount: 5, parameters: {flights: topFlights} } ]; res.json({ fulfillmentText: replyText, outputContexts: outputContexts }); } else { res.json({fulfillmentText: "抱歉,暂时搜不到合适的航班,麻烦稍后再试?"}); } }); } }); app.listen(3000, () => console.log('Webhook服务器跑在3000端口啦'));
- 第四步:处理支付与确认:机票预订需要用户填写乘客信息、完成支付,这部分可以引导用户跳转到Expedia的官方页面完成,或者调用Expedia的支付API(需要额外的权限)
3. 对接 eBay 添加商品到购物车
eBay的开发者平台提供购物车相关API,需要注意用户授权的问题(因为要添加到用户自己的购物车):
- 第一步:申请API权限:注册eBay开发者账号,创建应用,获取OAuth令牌(用于调用需要用户授权的接口)
- 第二步:配置Dialogflow意图:创建
AddToEBayCart意图,添加「商品名称」「数量」这些实体,也可以让用户描述商品,你调用eBay的搜索API找到对应的商品ID - 第三步:Webhook实现添加逻辑:先调用eBay的商品搜索API找到商品ID,再调用「添加到购物车」接口。如果用户还没授权,要引导用户完成授权流程。举个Python示例:
import requests from flask import Flask, request, jsonify app = Flask(__name__) # 替换成你自己的eBay应用信息 EBAY_CLIENT_ID = "your_client_id_here" EBAY_OAUTH_URL = "https://api.ebay.com/identity/v1/oauth2/token" EBAY_SEARCH_URL = "https://api.ebay.com/buy/browse/v1/item_summary/search" EBAY_ADD_CART_URL = "https://api.ebay.com/buy/basket/v1/basket/add_item" def get_ebay_token(): # 获取eBay的OAuth令牌 response = requests.post(EBAY_OAUTH_URL, data={ "grant_type": "client_credentials", "client_id": EBAY_CLIENT_ID, "scope": "https://api.ebay.com/oauth/api_scope/buy.basket" }) return response.json()['access_token'] @app.route('/webhook', methods=['POST']) def webhook(): req = request.get_json() intent_name = req['queryResult']['intent']['displayName'] if intent_name == 'AddToEBayCart': product_name = req['queryResult']['parameters']['product-name'] token = get_ebay_token() # 搜索用户要的商品 search_params = {"q": product_name, "limit": 1} search_res = requests.get(EBAY_SEARCH_URL, params=search_params, headers={ "Authorization": f"Bearer {token}" }) product = search_res.json()['itemSummaries'][0] item_id = product['itemId'] # 添加到购物车 add_payload = {"itemId": item_id, "quantity": 1} add_res = requests.post(EBAY_ADD_CART_URL, json=add_payload, headers={ "Authorization": f"Bearer {token}", "Content-Type": "application/json" }) if add_res.status_code == 200: fulfillment_text = f"已经把「{product['title']}」添加到你的eBay购物车啦!" else: fulfillment_text = "抱歉,添加商品失败了,麻烦再试一次?" return jsonify({'fulfillmentText': fulfillment_text}) return jsonify({'fulfillmentText': "我暂时帮不了你这个忙哦😅"}) if __name__ == '__main__': app.run(port=4000, debug=True)
几个关键注意事项
- API合规性:每个平台的API都有使用限制和合规要求,比如Domino's的API可能只针对特定地区,Expedia需要合作伙伴资质,一定要严格按照官方文档来,别违规导致API被封
- 错误处理:Webhook里一定要处理API调用失败的情况(比如网络错误、参数错误),返回友好的提示给用户,别让机器人卡壳
- 多轮对话设计:像机票预订这种复杂流程,一定要用Dialogflow的上下文来保存中间数据,一步步引导用户完成所有必要信息的输入
- 服务部署:Webhook服务必须能被公网访问,用云服务平台(Heroku、AWS Lambda、Google Cloud Functions)的免费额度足够支撑小项目
内容的提问来源于stack exchange,提问作者Akshat Chaturvedi
相关产品推荐
相关产品推荐

