Как исправить путаницу между Twiml и TwiML - «Недопустимый тип контента» или «Ошибка поиска» - PullRequest
0 голосов
/ 07 июля 2019

Я хочу написать плагин для WordPress, который говорит «Hello World» для входящих звонков на мой номер телефона Twillio. Я установил POST webhook для входящих звонков на Twilio admin: https://myWPsite.com/wp-json/callcenter/incoming. Я создал WP-плагин со следующим кодом (который можно найти в Twilio Docs) и поместил вспомогательную библиотеку Twilio PHP в свою папку:

<?php
require_once( plugin_dir_path( __FILE__ ) . 'twilio-php-master/Twilio/autoload.php');
use Twilio\TwiML;

defined( 'ABSPATH' ) or die( 'Nope!' );

function respond_incoming( $data ) {
  $response = new TwiML;
  $response->say("hello world!", array('voice' => 'alice'));
  echo $response;
}

add_action( 'rest_api_init', function () {
  register_rest_route( 'callcenter', '/incoming/', array(
    'methods' => array('POST'),
    'callback' => 'respond_incoming',
  ) );
} );

Если я позвоню на свой номер Twillio, я вижу следующую ошибку в Twilio-Debugger: Invalid Content-Type, и в теле ответа я вижу следующее:

Warning: require(/wp-content/plugins/twilio-for-DNH/twilio-php-master/Twilio/TwiML.php): failed to open stream: No such file or directory in /wp-content/plugins/twilio-for-DNH/twilio-php-master/Twilio/autoload.php on line 140

Fatal error: require(): Failed opening required '/wp-content/plugins/twilio-for-DNH/twilio-php-master/Twilio/TwiML.php' (include_path='.:/opt/alt/php73/usr/share/pear') in /wp-content/plugins/twilio-for-DNH/twilio-php-master/Twilio/autoload.php on line 140

1 Ответ

0 голосов
/ 07 июля 2019

Чтобы устранить эту ошибку, я изменил use Twilio\TwiML; на use Twilio\Twiml;, хотя я читал, что Twiml - это развеяно , но я не мог заставить его работать по-другому.

После этого я все еще получаю ошибку Invalid Content-Type и вижу в отладчике, что тип контента: Content-Type application/json; charset=UTF-8.Поэтому я добавил следующую строку в свою функцию: header('content-type: text/xml');.

Теперь я получаю ошибку Document parse failure, и мое тело ответа выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Say voice="alice">hello world!</Say>
</Response>
null

Чтобы решить эту проблему,Я добавил функцию die() в конец своей функции.И вот наконец-то все работает.Полный рабочий код:

<?php
require_once( plugin_dir_path( __FILE__ ) . 'twilio-php-master/Twilio/autoload.php');
use Twilio\Twiml;

defined( 'ABSPATH' ) or die( 'Nope!' );

function respond_incoming( $data ) {
  $response = new TwiML;
  $response->say("hello world!", array('voice' => 'alice'));
  header('content-type: text/xml');
  echo $response;
  die();
}

add_action( 'rest_api_init', function () {
  register_rest_route( 'callcenter', '/incoming/', array(
    'methods' => array('POST'),
    'callback' => 'respond_incoming',
  ) );
} );
...