0

https://www.twilio.com/docs/api/rest/change-call-state#postのチュートリアルに従っています。現在のインバウンド コールを新しい Twiml URL に転送できるようにする部分を php でコーディングしています。 . これを機能させるには、更新配列で To および From パラメーターを指定する必要があることがわかりました。To パラメータで指定された番号ではなく、指定された URL にコールを転送する必要があります。ただし、Twilio API は、To パラメーターが必要であるというエラーをスローしますが、ドキュメントにはそうではないと示されています。ここで私が間違っていることはありますか?

<?php
// Get the PHP helper library from twilio.com/docs/php/install
require_once('TwilioAPI/twilio-php-master/Services/Twilio.php'); // Loads the library

// Your Account Sid and Auth Token from twilio.com/user/account
$sid = 'XXXXXXX';
$token  = 'XXXXXXX';
$callSid = $_POST['CallSid'];
$client = new Services_Twilio($sid, $token);

// Get an object from its sid. If you do not have a sid,
// check out the list resource examples on this page



$call = $client->account->calls->get($callSid);

$call->update(array(
        "Url" => "http://ftstoo.com/Phone/TheFinalTouchSecurity/forwardToBob.xml",
    "Method" => "POST"
    ));?>

forwardToBob.xml には、Say Verb を含む Response が含まれています。このphpコード(twimlではない)はエラーをスローします

/home/wcmtechnologies/public_html/Phone/TheFinalTouchSecurity/TwilioAPI/twilio-php-master/Services/Twilio.php:297 で、キャッチされない例外「Services_Twilio_RestException」とメッセージ「No 'To' number is specified」

"To" => "Some Ten Digit Phone Number", "From" => "Some Ten Digit Phone Number" を配列に追加すると、エラーはスローされません。その後、通話は「宛先」の電話番号に転送されます。「To」パラメーターで指定された電話番号が応答すると、通話が接続され、forwardToBob.xml の twiml がすべて同時に実行されます。

編集#3----------------------------------------------- -----------------------

これが私のコード全体です....

これは、Twilio の検証済み番号が呼び出されるたびに実行される Twiml です。このコードは Twilio クイックスタート サイトから取得しました。

    <?php
    header('Content-type: text/xml');

    $callerId = "+19012311158";

    // put your default Twilio Client name here, for when a phone number isn't given
    $number   = "Bob";

    // get the phone number from the page request parameters, if given
    if (isset($_REQUEST['PhoneNumber'])) {
        $number = htmlspecialchars($_REQUEST['PhoneNumber']);
    }

    // wrap the phone number or client name in the appropriate TwiML verb
    // by checking if the number given has only digits and format symbols
    if (preg_match("/^[\d\+\-\(\) ]+$/", $number)) {
        $numberOrClient = "<Number>" . $number . "</Number>";
    } else {
        $numberOrClient = "<Client>" . $number . "</Client>";
    }
    ?>

    <Response>
        <Dial callerId="<?php echo $callerId ?>">
              <?php echo $numberOrClient ?>
        </Dial>
    </Response>

これは、Twilio クイックスタート サイトから大部分をコピーしたクライアント ブラウザーです。

<?php
include 'TwilioAPI/twilio-php-master/Services/Twilio/Capability.php';

// put your Twilio API credentials here
$accountSid = 'XXXXXXXX';
$authToken  = 'XXXXXXXX';

// put your Twilio Application Sid here
$appSid     = 'XXXXXXXXXXXXX';

// put your default Twilio Client name here
$clientName = 'Bob';

// get the Twilio Client name from the page request parameters, if given
if (isset($_REQUEST['client'])) {
    $clientName = $_REQUEST['client'];
}

$capability = new Services_Twilio_Capability($accountSid, $authToken);
$capability->allowClientOutgoing($appSid);
$capability->allowClientIncoming($clientName);
$token = $capability->generateToken();
?>

<!DOCTYPE html>
<html>
  <head>
    <title>Demo</title>
    <script type="text/javascript"
      src="//static.twilio.com/libs/twiliojs/1.2/twilio.min.js"></script>
    <script type="text/javascript"
      src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js">
    </script>
    <link href="http://static0.twilio.com/bundles/quickstart/client.css"
      type="text/css" rel="stylesheet" />
    <script type="text/javascript">
      var callSid = ""; 
      Twilio.Device.setup("<?php echo $token; ?>");

      Twilio.Device.ready(function (device) {
        $("#log").text("Client '<?php echo $clientName ?>' is ready");
      });

      Twilio.Device.error(function (error) {
        $("#log").text("Error: " + error.message);
      });

      Twilio.Device.connect(function (conn) {
        callSid = conn.parameters.CallSid; 
        $("#log").text("Successfully established call");
      });

      Twilio.Device.disconnect(function (conn) {
        $("#log").text("Call ended");
      });

      Twilio.Device.incoming(function (conn) {
        $("#log").text("Incoming connection from " + conn.parameters.From);
        // accept the incoming connection and start two-way audio
        conn.accept();
      });

      Twilio.Device.presence(function (pres) {
        if (pres.available) {
          // create an item for the client that became available
          $("<li>", {id: pres.from, text: pres.from}).click(function () {
            $("#number").val(pres.from);
            call();
          }).prependTo("#people");
        }
        else {
          $("#" + pres.from).remove();
        }
      });

      function call() {
        // get the phone number or client to connect the call to
        params = {"PhoneNumber": $("#number").val()};
        Twilio.Device.connect(params);
      }
      function forward() {
        var xmlhttp = new XMLHttpRequest();

        params = "?CallSid=" + callSid + "&ForwardTo=" + document.getElementById("number").value;

        xmlhttp.open("POST","forward.php" + params,false);
    xmlhttp.send();
    document.getElementById("log").innerHTML=xmlhttp.responseText;
      }
      function hangup() {
        Twilio.Device.disconnectAll();
      }
    </script>
  </head>
  <body>
    <button class="call" onclick="call();">
      Call
    </button>

    <button class="hangup" onclick="hangup();">
      Hangup
    </button>

    <input type="text" id="number" name="number"
      placeholder="Enter a phone number or client to call"/>

    <button class="call" onclick="forward();">
      Forward
    </button>

    <div id="log">Loading pigeons...</div>

    <ul id="people"/>
  </body>
</html>

これは、forward() 関数から HTTP POST 要求を介して呼び出される転送コードです。

<?php
// Get the PHP helper library from twilio.com/docs/php/install
require_once('TwilioAPI/twilio-php-master/Services/Twilio.php'); // Loads the library

// Your Account Sid and Auth Token from twilio.com/user/account
$sid = 'XXXXXX';
$token  = 'XXXXXX';
$callSid = $_POST['CallSid'];
$client = new Services_Twilio($sid, $token);

// Get an object from its sid. If you do not have a sid,
// check out the list resource examples on this page



$call = $client->account->calls->get($callSid);

$call->update(array(
        "Url" => "http://ftstoo.com/Phone/TheFinalTouchSecurity/forwardToBob.xml",
    "Method" => "POST"
    ));

最初のコード スニペットは、901-231-1158 が呼び出されたときに実行される Twiml を示しています。次に、クライアント「Bob」に送信されます。接続が成功したら、追加した転送ボタンを押します。この転送ボタンは forward 関数を呼び出し、最後のスニペットである PHP スクリプトに HTTP POST 要求を行います。実行時に、更新関数の配列に "To" および "From" パラメーターが指定されていないと、エラーが発生します。これを修正するために何をすべきかについての提案は、非常に役立ちます!

注意: HTML で作成したボタンは Forward と呼ばれ、作成した関数 forward() を呼び出します。呼び出し Sid を取得し、インスタンス変数に保存しています。Twilio.Device.Connect 関数でこの値を取得します。

完全なスタック トレース。

Stack trace:
#0 /home/wcmtechnologies/public_html/Phone/TheFinalTouchSecurity/TwilioAPI/twilio-php-master/Services/Twilio.php(180): Base_Services_Twilio->_processResponse(Array)
#1 /home/wcmtechnologies/public_html/Phone/TheFinalTouchSecurity/TwilioAPI/twilio-php-master/Services/Twilio/InstanceResource.php(31): Base_Services_Twilio->createData('/2010-04-01/Acc...', Array)
#2 /home/wcmtechnologies/public_html/Phone/TheFinalTouchSecurity/forward.php(22): Services_Twilio_InstanceResource->update(Array)
#3 {main}
  thrown in /home/wcmtechnologies/public_html/Phone/TheFinalTouchSecurity/TwilioAPI/twilio-php-master/Services/Twilio.php on line 297
[12-Jun-2015 00:19:39 UTC] PHP Fatal error:  Uncaught exception 'Services_Twilio_RestException' with message 'No 'To' number is specified' in /home/wcmtechnologies/public_html/Phone/TheFinalTouchSecurity/TwilioAPI/twilio-php-master/Services/Twilio.php:297
4

1 に答える 1

1

Twilio 開発者エバンジェリストはこちら。

すべての詳細をありがとう、エラーを見つけるためにあなたがしようとしていたことのほとんどをまとめることができました. あなたが持っていたエラーメッセージを受け取ったことはありません。

これを機能させるには、コードの次の部分を変更する必要があることがわかりました。

XHR リクエストでは、リクエストを同期的に行うのをやめてください (私は Firefox を使用していましたが、廃止されました)。

xmlhttp.open("POST","forward.php" + params);

また、PHP の XHR リクエストから call sid を取得していなかったので、に変更$_POST$_REQUESTて動作するようになりました。

最後に、クライアント側の呼び出し sid は、元の呼び出し sid と同じではありません。これが親呼び出しであり、 twilio-php ヘルパー ライブラリを使用して次のように取得できます。

$callSid = $_REQUEST['CallSid'];
$client = new Services_Twilio($sid, $token);

// Get an object from its sid. If you do not have a sid,
// check out the list resource examples on this page

$call = $client->account->calls->get($callSid);

$parentCall = $client->account->calls->get($call->parent_call_sid);

$parentCall->update(array(
    "Url" => "http://ftstoo.com/Phone/TheFinalTouchSecurity/forwardToBob.xml",
    "Method" => "POST"
));

次に、親呼び出しを更新して元の URL に転送し、クライアント側で電話を切る必要があります。

これが役立つことを願っています!

于 2015-06-15T11:19:50.147 に答える