Вот возможное решение. Я проверил это, и это работает.
Основная идея заключается в воспроизведении некоторого сообщения / музыки в цикле до тех пор, пока ColdFusion не выполнит свою работу, а затем, когда ColdFusion будет завершен, проинструктируйте вызов для выполнения другого Twilio XML, сделав запрос POST к ресурсу вызова API Twilio.
Когда поступит вызов, и Twilio достигнет вашей конечной точки, захватит идентификатор вызова , он будет использоваться для переключения вызова на другой XML. Идентификатор вызова передается как FORM.CALLSID
или URL.CALLSID
в зависимости от конфигурации вашего интернет-крюка в Twilio.
Идентификатор вызова выглядит примерно так: CAdecbfa7e8e2a9d09336abcd57044cf74
.
Передайте идентификатор вызова через ваш поток (так как параметр url должен быть в порядке), чтобы он достиг processtopup.cfm
.
Переместите длинный код из processtopup.cfm
в, скажем,
processtopup-action.cfm
Код в processtopup.cfm
теперь должен немедленно возвращать XML для воспроизведения цикла (или вы можете воспроизвести некоторые .mp3), я показываю с сообщением:
<cfoutput><?xml version="1.0" encoding="UTF-8"?>
<Response>
<Say loop="0">Please wait while we process your request...</Say>
</Response>
</cfoutput>
<cfhttp
url="http://www.yourwebsite.com/processtopup-action.cfm?callsid=#FORM.CALLSID#"
method="get"
timeout="1" />
код для processtopup-action.cfm
<!--- // place your long running code here --->
<cfset accountSid = '{your account sid}' />
<cfset authToken = '{your auth token}' />
<cfhttp
url="https://api.twilio.com/2010-04-01/Accounts/#variables.accountSid#/Calls/#URL.CALLSID#.json"
method="POST"
username="#variables.accountSid#"
password="#variables.authToken#"
result="http_result">
<cfhttpparam
name="Url"
value="http://www.yourwebsite.com/finish.cfm"
type="formfield" />
</cfhttp>
Код для finish.cfm
<cfoutput><?xml version="1.0" encoding="UTF-8"?>
<Response>
<Say>This is the data you're looking for.</Say>
<Say>Thank you. Goodbye!</Say>
<Hangup />
</Response>
</cfoutput>
Конечно, вы можете передавать другие параметры по мере необходимости.
Опять же, основная идея заключается в том, что processtopup-action.cfm
после выполнения вашего долго работающего кода делает POST-запрос к API Twilio и инструктирует вызов переключиться на выполнение нового TwiML, расположенного в http://www.yourwebsite.com/finish.cfm
Docs:
- Перенаправление вызовов через Twilio REST API
- Изменение живых звонков