新手求教:如何完成Lex Bot多卡支付预订流程后续步骤搭建
Lex Bot多卡支付流程实现方案
1. 核心Intent与Slots设计
创建MultiCardPayment主Intent,定义以下Slots:
UseMultipleCards:布尔类型,用于确认用户是否使用多张卡(选项:是/否)CardCount:数值类型,限制输入≥2的整数,收集需使用的卡数量n- 单卡信息Slots(循环复用):
CardNumber:文本类型,添加Luhn算法格式校验ExpiryDate:文本类型,校验格式为MM/YY且未过期AllocatedAmount:数值类型,校验大于0且累计金额不超过订单总金额InvoiceEmail:文本类型,校验邮箱格式SeparateInvoice:布尔类型,确认是否分开发票给代理和客人
2. 对话流程配置
多卡支付分支触发
当UseMultipleCards被用户确认为“是”时,触发后续流程:
- 先引导用户输入
CardCount,完成后初始化会话变量:currentCardIndex(当前收集卡的序号,初始为1)、cardDetailsList(存储所有卡信息的数组,初始为空)
循环收集卡信息
通过Dialog Code Hook(Lambda函数)控制循环逻辑:
- 若
currentCardIndex ≤ CardCount,依次触发单卡Slots的收集:先问卡号,再有效期,接着金额分配,然后发票邮箱,最后是否分开发票 - 每完成一张卡的所有Slots收集,将信息存入
cardDetailsList,重置单卡Slots,currentCardIndex加1 - 当
currentCardIndex > CardCount时,结束循环,触发订单确认环节
3. Dialog Code Hook核心逻辑(Python示例)
def lambda_handler(event, context): session_attrs = event.get('sessionAttributes', {}) current_intent = event['currentIntent'] slots = current_intent['slots'] # 初始化会话变量 if 'currentCardIndex' not in session_attrs: session_attrs['currentCardIndex'] = 1 session_attrs['cardDetailsList'] = [] current_idx = int(session_attrs['currentCardIndex']) card_count = int(slots.get('CardCount', 0)) if current_idx <= card_count: required_slots = ['CardNumber', 'ExpiryDate', 'AllocatedAmount', 'InvoiceEmail', 'SeparateInvoice'] missing_slots = [s for s in required_slots if slots.get(s) is None] if missing_slots: # 引导用户补充缺失的Slot return { 'sessionAttributes': session_attrs, 'dialogAction': { 'type': 'ElicitSlot', 'intentName': current_intent['name'], 'slots': slots, 'slotToElicit': missing_slots[0], 'message': {'contentType': 'PlainText', 'content': f"请提供第{current_idx}张卡的{missing_slots[0]}"} } } else: # 存储当前卡信息 card_info = { 'cardNumber': slots['CardNumber'], 'expiryDate': slots['ExpiryDate'], 'allocatedAmount': slots['AllocatedAmount'], 'invoiceEmail': slots['InvoiceEmail'], 'separateInvoice': slots['SeparateInvoice'] } session_attrs['cardDetailsList'].append(card_info) # 重置单卡Slots,准备下一轮收集 for s in required_slots: slots[s] = None session_attrs['currentCardIndex'] = current_idx + 1 if session_attrs['currentCardIndex'] <= card_count: # 开始下一张卡的收集 return { 'sessionAttributes': session_attrs, 'dialogAction': { 'type': 'ElicitSlot', 'intentName': current_intent['name'], 'slots': slots, 'slotToElicit': 'CardNumber', 'message': {'contentType': 'PlainText', 'content': f"请提供第{session_attrs['currentCardIndex']}张卡的卡号"} } } else: # 所有卡信息收集完成,请求确认 return { 'sessionAttributes': session_attrs, 'dialogAction': { 'type': 'ConfirmIntent', 'intentName': current_intent['name'], 'slots': slots, 'message': {'contentType': 'PlainText', 'content': "已完成所有卡的信息收集,是否确认提交?"} } } else: # 进入支付与发票处理的Fulfillment流程 return { 'sessionAttributes': session_attrs, 'dialogAction': { 'type': 'Close', 'fulfillmentState': 'Fulfilled', 'message': {'contentType': 'PlainText', 'content': "多卡支付信息已提交,我们将尽快处理您的订单"} } }
4. 测试与验证
- 在Lex控制台测试窗口模拟对话,验证循环收集逻辑是否正常触发
- 测试Slot校验规则(卡号格式、有效期、金额累计)是否生效
- 检查会话变量的存储与更新是否准确
内容的提问来源于stack exchange,提问作者Raja
相关产品推荐
相关产品推荐

