如何解决Twiml和TwiML之间的混淆-“无效的内容类型”或“检索失败”

时间:2019-07-07 08:54:24

标签: wordpress wordpress-rest-api twilio-php

我想为WordPress写一个插件,上面写着“ Hello World”,用于打给我的Twillio电话号码。 我在Twilio管理员https://myWPsite.com/wp-json/callcenter/incoming上为拨入电话设置了POST网络挂接。 我用following code (found in Twilio Docs)创建了一个WP插件,并将Twilio PHP helper lib放到了它的文件夹中:

<?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 :(得分:0)

为解决此错误,我将use Twilio\TwiML;更改为use Twilio\Twiml;,尽管我读到Twimldepracted,但是我无法使其工作了。

此后,我仍然出现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',
  ) );
} );