Соответствие Twilio PCI ‹Gather› в виджете функций с Studio

Я бродил здесь и получил большинство ответов, пока пробираюсь через этот новый инструмент, но теперь я застрял и нуждаюсь в прямом совете.

Функция Gather в Studio не совместима с PCI, поэтому мне нужно перенести свой вызов на функцию и вернуть проанализированные данные - я наконец понял, как это сделать, - однако я обнаружил, что не могу вызвать веб сервис, размещенный в одной функции, и должен был отправить with event.Digits другой функции, чтобы вызвать веб-сервис к моему провайдеру токенов. Это работает, однако привело к странному результату: мой токен считывается как TTS, а затем вызов прерывается. Я не участвую в игре TTS. Ниже приведены мои наборы кода:

Первоначальная функция, вызываемая из Studio:

const got = require('got');

exports.handler = function(context, event, callback) {
    let twiml = new Twilio.twiml.VoiceResponse();

    twiml.gather({
        input: 'dtmf',
        finishOnKey: '#',
        timeout: 10,
        action: 'paymenttest',
        method: 'GET'
    }).say('Enter CC');

    console.log(twiml);
    callback(null, twiml);
};

Это успешно вызывает мою функцию с введенными цифрами:

const got = require('got');

exports.handler = function(context, event, callback) {
    let twiml = new Twilio.twiml.MessagingResponse();
    const url ='my payment gateway' + event.Digits + '&EXPDATE=1220&CARDTYPE=VI';

    got.get(url, {
        headers: {
            'content-Type': 'application/x-www-form-urlencoded'
        }
    }).then(function(response) {
        // Check the response and ask your second question here
        event.callback(null, response.body);
    }).catch(function(error) {
        // Boo, there was an error.
        callback(error)
    });
};

Это успешно возвращает токен ... но, как упоминалось ранее ... он зачитывается мне, а не включается в данные, возвращаемые обратно в Studio.


person rasstwo    schedule 28.12.2018    source источник
comment
Вы проверяли глагол ‹Pay›: twilio.com/pay Он предлагает совместимый с PCI способ принимать информацию о кредитной карте посредством телефонных звонков.   -  person Devin Rader    schedule 28.12.2018
comment
Привет, Девин, к сожалению, глагол pay запрещает вам использовать только Stripe, но Gather также совместим с pci и отлично работает ... просто нужно, чтобы Studio правильно прочитала тело второй вызванной функции.   -  person rasstwo    schedule 28.12.2018
comment
@rasstwo Я думаю, что вы не хотите использовать только callback() вместо event.callback() в вашем .then второй функции.   -  person Charlie Weems    schedule 02.01.2019
comment
Спасибо, попробовали изменить, но токен по-прежнему считывает, а ему не говорят.   -  person rasstwo    schedule 04.01.2019


Ответы (2)


Проповедник разработчиков Twilio здесь.

Прямо сейчас Studio не очень хорошо настроена для использования TwiML из функции Twilio и последующего продолжения работы. В вашем случае, когда вы возвращаете токен из своей второй функции, Twilio работает с ним, как если бы вы только что вернули текст в обычный веб-перехватчик TwiML. Когда это происходит, Twilio по умолчанию предполагает, что вы имели в виду <Say>, и зачитывает текст.

Пока команда работает над перенаправлением вызовов обратно в потоки Studio, существует обходной путь.

Вместо того, чтобы возвращать токен во второй функции, верните некоторый TwiML, который включает _2 _ к URL-адресу веб-перехватчика вашего потока Studio с добавлением ?FlowEvent=audioComplete. Вам также потребуется добавить фиктивный виджет Say / Play после виджета Function (он становится следующей частью в потоке, которая может запускать сообщение «аудио завершено», поэтому существует для его сбора и отправки следующему виджету).

Единственное, что мы не рассмотрели в обходном пути, - это отправка токена в поток. Я не верю, что мы можем сделать это с помощью этого обходного пути перенаправления, поэтому вместо этого я бы рекомендовал сохранить токен в вашей собственной базе данных или что-то вроде Twilio Sync. Таким образом, вы можете использовать его вне Studio, как вам нравится. Если вам это нужно в потоке Studio, вы можете создать еще одну функцию, которая возвращает токен как JSON, и тогда она будет сохранена в переменных потока.

Если вы предпочитаете использовать <Pay>, поскольку это было бы намного проще, я также рекомендую запрос нужного вам коннектора оплаты.

person philnash    schedule 07.01.2019
comment
Спасибо, Фил. Я заметил, что перенаправление обратно на веб-перехватчик потока было тем, что он пытался, когда вы не указали URL-адрес действия, но еще не испортил его. Я попробую и посмотрю, что я могу получить от этого. В противном случае я собирался просто сделать весь IVR из связанных функций вместо виджетов Studio. - person rasstwo; 07.01.2019
comment
Дайте мне знать, если это сработает для вас! В противном случае вы, безусловно, могли бы связать кучу функций для достижения того же. - person philnash; 08.01.2019
comment
Что касается настройки другой функции для возврата токена как JSON, вы говорите, что нужно запустить другую функцию сразу после того, как получить возвращенный токен? Функция будет хранить эти данные там, которые будут вызываться как база данных? - person rasstwo; 09.01.2019
comment
Хм. Я предполагаю, что вам не обязательно нужен токен, чтобы быть частью самого потока Studio, вам просто нужно отправить его куда-нибудь, чтобы вы собирались использовать его для оплаты. Возможно, вы можете проигнорировать то, что я говорю о попадании токена в поток! - person philnash; 10.01.2019
comment
Предпочтительно, я бы хотел вернуть его в поток, поскольку я хотел бы использовать успех / неудачу оттуда, чтобы предлагать различные варианты / перенаправление в колл-центр. - person rasstwo; 10.01.2019
comment
Поэтому я бы сохранил его где-нибудь, а затем получил бы с помощью функции, возвращающей JSON. - person philnash; 10.01.2019
comment
Привет, Фил, я так близок ... однако я столкнулся с другой проблемой, которую необходимо решить ... 5-секундный тайм-аут функций. Я могу сделать несколько звонков подряд и все будет хорошо, потом вдруг получится блок отказов. Я уменьшил некоторые из них, удалив ненужные параметры, передаваемые от функции к функции, но мой самый важный параметр - тот, который фактически отправляет токен для применения платежа, - теперь является единственной несовместимой функцией по времени. Есть ли какие-нибудь мысли, чтобы обойти правило 5 секунд? - person rasstwo; 18.01.2019
comment
var got = require ('got'); exports.handler = function (context, event, callback) {let twiml = new Twilio.twiml.VoiceResponse (); const url = 'mygateway / PayFees? Number = 12345 & Number2 = 3 & paymentToken = ID: 0002 & paymentAmount = 5.00' got.post (url, {headers: {'content-Type': 'application / json', 'Authorization': 'Bearer' + event.oAuth}}) .then (function (response) {console.log (response.body); var IsSuccess = JSON.parse (response.body) .IsSuccess; twiml.redirect ('/ paysuccess? paymentAmount = 5.00 & IsSuccess = '+ IsSuccess); callback (null, twiml);});}; - person rasstwo; 18.01.2019
comment
Реальная проблема заключается в том, что запрос API вашего платежного провайдера занимает более 5 секунд, что является тайм-аутом функции Twilio? Я проверяю, можем ли мы продлить тайм-аут, но, возможно, вам нужно использовать эту часть платформы Twilio. Планом может быть запуск вашей собственной функции AWS Lambda (которая имеет более длительный тайм-аут). Если я узнаю, что мы можем его продлить, я дам вам знать. - person philnash; 18.01.2019
comment
Вполне может быть, мы тоже этим занимаемся. Я также придумал другое решение для вызова службы, предоставления ей токена и получения простого ответа, отправки вызова на удержание, служба на нашей стороне выполняет обработку, а затем вызывает функцию webhook или поток студии с помощью data, тогда у меня будет twiml, чтобы найти вызов в очереди, передать параметры и перенаправить на другую функцию для обработки результатов платежа. - person rasstwo; 19.01.2019
comment
Это звучит как хорошая идея. Сделать этот процесс более фоновым и обновить его, как только он будет завершен, - это также лучший опыт для вызывающего абонента. Я дам вам знать, если узнаю о более длительном времени выполнения функций. - person philnash; 19.01.2019
comment
Хорошо, работает хорошо; однако, если возникает проблема с задержкой в ​​том, что только я возвращаю подтвержденную передачу обслуживания, я проиграю вызов. Я играл с callback (), чтобы попытаться заставить его запустить и забыть о вызове веб-службы, но я могу только заставить его ждать ответа или вообще пропустить HTTP-запрос. Есть ли предложения по тому, чтобы функция игнорировала ожидание ответа и просто отправляла вызов прямо для удержания музыки после отправки запроса? - person rasstwo; 29.01.2019
comment
Я придумал обходной путь: используя параметр тайм-аута в модуле Got (), я заставляю его выводить ошибку из запроса. Поскольку я каждый раз гарантирую ошибку, я удалил .then (response), заменил его на .catch (error) и поместил туда twiml.redirect. Таким образом, я точно знаю, что происходит при каждой попытке: он выдает ошибку после того, как я отправил запрос, и не полагается на своевременный ответ, чтобы двигаться дальше, зная, что ответ приходит позже и будет перенаправлять в зависимости от результатов. в любом случае. - person rasstwo; 29.01.2019
comment
Рад, что у вас есть обходной путь. Как построены функции Twilio: как только вы делаете callback, функция отключается, так что нет "выстрелил и забыл". - person philnash; 29.01.2019

Я думаю, что ответ Филнаша здесь устарел, даже когда он все еще работает.

Прямо сейчас вам нужно вызвать первую функцию с помощью узла TwiML Redirect.

Во второй функции вам нужно будет добавить перенаправление на веб-перехватчик добавления потока? FlowEvent=return&foo=bar (где foo=bar следует заменить на информацию, которую вы действительно хотите вернуть).

person ricardo    schedule 04.12.2020
comment
и каковы преимущества этого? - person Abilogos; 04.12.2020
comment
Филнаш объяснил обходной путь, при котором вам нужно добавить фиктивный виджет. С этим решением вам не нужен фиктивный виджет, возврат идет к тому же виджету перенаправления. Также я добавляю, как вернуть информацию из функции. - person ricardo; 09.12.2020