问题描述
我是Alexa技能开发的新手。我正在尝试创建语音图钉身份验证。
这是我要实现的目标:
用户:“打开灯”
Alexa:“您的安全密码是什么?”
Alexa:“身份验证失败!请重试。”
用户:“ 1234”(正确的针脚)
Alexa:“打开灯!”
如果用户第一次告诉正确的密码没有问题,但是如果用户第一次告诉错误的密码,Alexa只是说出了提示信息并且不采用新的密码,我将如何获得新的针脚值,并在相同的Intent处理程序中再次检查该针脚?
这是我的代码:
const RemoteControlIntentHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
&& Alexa.getIntentName(handlerInput.requestEnvelope) === 'RemoteControlIntent';
},handle(handlerInput) {
var speakOutput = '';
var userPin = handlerInput.requestEnvelope.request.intent.slots.securityPin.value;
if (userPin !== userSecurityPin) {
speakOutput = 'Authentication Failed! Please retry!';
return handlerInput.responseBuilder
.speak(speakOutput)
.reprompt(speakOutput)
.getResponse();
} else {
speakOutput = 'Turning ON the light!';
return handlerInput.responseBuilder
.speak(speakOutput)
.reprompt('add a reprompt if you want to keep the session open for the user to respond')
.getResponse();
}
}
解决方法
问题是您的RemoteControlIntent
没有与引脚说话相对应。因此,当您第二次尝试使用实际的pin时,alexa不知道应将其映射到哪个意图。
您需要一种使用实际管脚再次执行RemoteControlIntent
的方法。
这需要您的意图模式才能正确解决问题,但这是一种可行的解决方案
const RemoteControlIntentHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
&& Alexa.getIntentName(handlerInput.requestEnvelope) === 'RemoteControlIntent';
},handle(handlerInput) {
var speakOutput = '';
var userPin =handlerInput.requestEnvelope.request.intent.slots.securityPin.value;
const request = handlerInput.requestEnvelope.request;
if (userPin !== userSecurityPin) {
speakOutput = 'Authentication Failed! Please retry!';
return handlerInput.responseBuilder
.speak(speakOutput)
.addElicitSlotDirective('securityPin') // this line will ask for the pin again against the same intent
.getResponse();
} else {
speakOutput = 'Turning ON the light!';
return handlerInput.responseBuilder
.speak(speakOutput)
.reprompt('add a reprompt if you want to keep the session open for the
user to respond')
.withShouldEndSession(true)
.getResponse();
}
}
};
请记住RemoteControlIntent
启用自动委派,并在securityPin
提示符下使用您的安全密码是什么?。