https://d226lax1qjow5r.cloudfront.net/blog/blogposts/forward-a-call-via-voice-proxy-with-php-dr/php-voice-proxy.png

PHPでVoice Proxy経由で電話を転送する

最終更新日 May 13, 2021

所要時間:1 分

本日の投稿では、別の番号からかかってきたように偽装する方法をご紹介します。

通話相手の本当の電話番号を他の通話相手から隠したいと思うのは、ビジネス上やむを得ない理由がたくさんあるからである。

典型的な例は、オンラインタクシーサービスです。予約体験をできるだけスムーズにするために、顧客とドライバーは互いにコミュニケーションが取れるようにしたい。しかし、ドライバーに顧客の本当の番号を知られたくない(顧客のプライバシーを守りたいから)し、逆に、顧客にドライバーの番号を知られ、サービスを利用せずに直接乗車予約をされたくない。

幸いなことに、Nexmo Voice APIを使えばPHPで簡単にできます!ではさっそく 完全なソースコードはGithubにあります。

ステップ

  1. 依存関係をインストールする

  2. ウェブフック・エンドポイントの定義

  3. 通話イベントのログ

  4. ウェブフックにアクセスできるようにする

  5. 番号を購入する

  6. Nexmo Voice APIアプリケーションの作成

  7. Nexmo番号とアプリケーションをリンクする

  8. ネクスモのバーチャル番号に電話する

  9. プロキシロジックの実装

  10. 音声プロキシのテスト

Vonage API Account

To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.

This tutorial also uses a virtual phone number. To purchase one, go to Numbers > Buy Numbers and search for one that meets your needs.

依存関係のインストール

NexmoのVoice APIを使用してインバウンドコールを処理するには、次のものを提供する必要があります。 ウェブフックを提供する必要があります。

これらのウェブフックのコーディングには slimPHP用の軽量ウェブフレームワークです。詳しくは slim こちら.

インストール slimを使用しています。 composer:

composer require slim/slim:^3.8

Webhookエンドポイントの定義

という名前のファイルを作成する。 index.phpという名前のファイルを作成する:

<?php
use \Psr\Http\Message\ResponseInterface as Response;
use \Psr\Http\Message\ServerRequestInterface as Request;
require 'vendor/autoload.php';

$app = new \Slim\App;
$app->get('/webhooks/answer', function (Request $request, Response $response) {
  /* Code to process the inbound call */
});

$app->post('/webhooks/events', function (Request $request, Response $response) {
  /* Code that executes when an event is received */
});

$app->run();

このコードでは slimアプリケーションを作成し、2つのルートを定義します。これらのルートは以下のウェブフックエンドポイントに対応しています:

  • /webhooks/answer:NexmoのAPIは GETこのエンドポイントは、バーチャル番号に着信があったときにリクエストします。

  • /webhooks/events:NexmoのAPIは POSTが発生するたびに、このエンドポイントにリクエストします。 ringingされる answeredそして completedなど) が発生するたびに、このエンドポイントにリクエストを行い、アプリケーションのコール状況を更新します。

通話イベントのログ

まず /webhooks/eventsエンドポイントを扱おう。イベントが通知されるたびに、それをログに記録したい。これは後で問題をデバッグするのに役立ちます。

この例では、PHP 組み込みの Web 開発サーバーと error_log()関数を使用してデータをログファイル (event.log).

アプリケーションのルートに php.iniファイルを作成する:

error_log = ./event.log
log_errors = on
date.timezone = UTC

次に /webhooks/eventsハンドラを更新して、受信イベントデータを記録する:

$app->post('/webhooks/events', function (Request $request, Response $response) {
    error_log($request->getBody());
});

インバウンドコールの処理

インバウンドコールを受信すると、NexmoのAPIは以下のリクエストを行います。 GETエンドポイントにリクエストし /webhooks/answerエンドポイントにリクエストし、そのレスポンスにコールの処理方法が含まれていることを期待します。

これらの指示は、JSON形式のNexmoコール・コントロール・オブジェクト(NCCO)の形で提供されます。NCCOは、通話が取るべきさまざまな「アクション」を定義します。 inputユーザーが電話のキーパッドで押す可能性のある数字を収集する。 stream通話にオーディオを再生する。アクションの完全なリストは NCCOリファレンス.

プロキシロジックを考える前に、まずNexmo番号に着信があることを確認しよう。

アプリケーションのテスト talkアクションを使ってアプリケーションをテストしてください。あなたの /webhooks/answerルート・ハンドラで

$app->get('/webhooks/answer', function (Request $request, Response $response) {

    $ncco = [
        [
            'action' => 'talk',
            'text' => 'Thank you for calling. Everything appears to be working properly',
        ],
    ];
    return $response->withJson($ncco);
});

ウェブフックにアクセスできるようにする

NexmoのAPIがお客様のWebhookエンドポイントにリクエストを行うには、インターネット経由でアクセスできる必要があります。

ローカルの開発環境を公共のインターネットに公開するための優れたツールは、次のとおりである。 ngrok.我々の チュートリアルをインストールして使う方法を説明します。

起動 ngrokを起動する:

ngrok http 3000

作成された公開URLをメモしておく。 ngrokをメモしておいてください。これらは以下に似ている(しかし異なる):

http://066d53c9.ngrok.io -> localhost:3000
https://066d53c9.ngrok.io -> localhost:3000

無料プランでは、再起動するたびに ngrokを再起動するたびにURLが変更され、Voice APIアプリケーションの設定を更新する必要があります。そのため、このチュートリアルの期間中は起動したままにしておいてください。

番号を購入する

電話を受けるにはNexmoのバーチャル番号が必要です。まだNexmo番号をお持ちでない場合は Vonage CLI.

を使用してVonage CLIをインストールできます。 ノードパッケージマネージャ, npm:

npm install -g vonage-cli

次に、API キーとシークレットを使用して Vonage CLI を設定します。 開発者ダッシュボード:

vonage config:set --apiKey=YOUR_API_KEY --apiSecret=YOUR_API_SECRET

利用可能な番号を確認するには vonage number:searchを使い、2文字の国番号を渡す。例えば GBイギリスなら USはアメリカです。購入した番号が音声通話を受信できることを確認してください:

vonage number:search COUNTRY_CODE --features=VOICE

リストから番号を選び、次のコマンドで購入する:

vonage number:buy <NUMBER>

購入を確認するプロンプトが表示されます。購入した番号をメモしてください。

Nexmo Voice APIアプリケーションの作成

Nexmo Voice API Applicationsを作成する必要があります。ここでいうアプリケーションとは、今コードを書いたアプリケーションのことではありません。Voice APIを使用するために必要なコンフィギュレーションやセキュリティ情報を格納するコンテナです。

ここでもVonage CLIを使います。以下の情報を指定する必要があります:

  • アプリケーションの名前

  • あなたの /webhooks/answerエンドポイント (例 https://066d53c9.ngrok.io/webhooks/answer)

  • あなたの /webhooks/eventsエンドポイント (例 https://066d53c9.ngrok.io/webhooks/events)

  • セキュリティ認証情報を格納するファイルの名前と場所

PHPアプリケーションと同じディレクトリで、以下のコマンドを入力し、Webhookエンドポイントの適切なURLを指定します:

vonage apps:create “My Voice Proxy” --voice_answer_url=ANSWER_URL --voice_event_url=EVENT_URL

これでVoice APIアプリケーションとWebhookが設定されます。Voice Applicationは一意のアプリケーションIDで識別されます。次のステップで必要になるので、メモしておいてください。秘密鍵もコピーしておきましょう:

vonage apps:show

Nexmo番号とアプリケーションをリンクする

次に、Voice APIアプリケーションをNexmo番号にリンクする必要があります。

以下のコマンドを実行する。 APPLICATION_IDで生成されたものに置き換えて vonage apps:createコマンドで生成されたものに置き換えて、次のコマンドを実行する:

vonage apps:link APPLICATION_ID --number=NEXMO_NUMBER

コマンドを実行して、Numbersとアプリケーションがリンクされていることを確認する。 vonage apps:showコマンドを実行して、番号とアプリケーションがリンクしていることを確認する。この情報は 開発者ダッシュボード.

ネクスモのバーチャル電話番号

あるターミナルウィンドウで ngrokを実行している状態で、 別のターミナルウィンドウで同じポートの PHP アプリケーションを起動します:

php -S localhost:3000 -c php.ini

Nexmo番号に電話をかけます。すべてがうまくいっていれば、NCCOで定義したメッセージが聞こえ、通話が終了します。

をチェックし event.logを確認し、通話中にどのイベントが記録されたかをメモする。

プロキシロジックの実装

Voiceプロキシを作成するには、着信コールをターゲットの受信者の番号に接続し、Nexmoのバーチャル番号を使って着信コールの発信者の実際の番号を隠します。

これらのNumbersを格納するために2つの文字列定数を作成する:

  • FROM_NUMBER:あなたのネクスモ・バーチャル・ナンバー

  • TO_NUMBER:固定電話または携帯電話の番号。これは、最初の通話に使用する番号とは異なるものでなければなりません。

define(FROM_NUMBER, /* Your Nexmo number */);
define(TO_NUMBER, /* Your target number */;

どちらの番号も国番号を含み、先頭のゼロは省略する。例えば、イギリスの国番号は 44.ですから、私の携帯番号が. 07700 900004の場合、正しい書式は 447700900004.

NCCO connectアクションを使用して、着信発信者を受信者に接続します。現在の /webhooks/answerを次のように置き換えます:

    $ncco = [
        [
            'action' => 'connect',
            'from' => FROM_NUMBER,
            'endpoint' => [
                [
                    'type' => 'phone',
                    'number' => TO_NUMBER,
                ],
            ],
        ],
    ];

音声プロキシのテスト

ターミナルウィンドウで ngrokが実行されていることを確認し、 別のターミナルウィンドウで PHP アプリケーションを再起動します:

php -S localhost:3000 -c php.ini

Nexmoのバーチャル番号に電話をかけます。電話に出ると、すぐに2つ目の番号が鳴ります。その電話は、あなたが電話をかけた番号ではなく、あなたのNexmo番号から発信されているはずです。

これで終わりだ!これで、発信者の本当の番号を隠すシンプルなVoice Proxyが実装されたことになる。

さらに読む

Voice APIについてもっと知りたい方は、以下のリソースをご覧ください:

シェア:

https://a.storyblok.com/f/270183/384x384/637d0e41eb/marklewin.png
Mark Lewinヴォネージの卒業生

元Vonageのテクニカルライター。APIをいじり、文書化するのが大好き。