https://d226lax1qjow5r.cloudfront.net/blog/blogposts/receive-an-inbound-voice-call-with-php-dr/inbound-voice-calls.png

Eingehende Voice-Anrufe mit PHP entgegennehmen

Zuletzt aktualisiert am May 13, 2021

Lesedauer: 10 Minuten

In unserem letzten PHP- und Voice-Blogbeitrag haben wir beschrieben, wie man einen ausgehenden Sprachanruf mit Text-To-Speech. In diesem Beitrag werden wir die Richtung ändern und eine Anwendung schreiben, die eingehende Sprachanrufe bearbeitet und eine dynamische Antwort zurückgibt.

Der Quellcode für diesen Blogbeitrag ist verfügbar auf Github.

Voraussetzungen

Vonage API-Konto

Um dieses Tutorial durchzuführen, benötigen Sie ein Vonage API-Konto. Wenn Sie noch keines haben, können Sie sich noch heute anmelden und mit einem kostenlosen Guthaben beginnen. Sobald Sie ein Konto haben, finden Sie Ihren API-Schlüssel und Ihr API-Geheimnis oben auf dem Vonage-API-Dashboard.

In diesem Lernprogramm wird auch eine virtuelle Telefonnummer verwendet. Um eine zu erwerben, gehen Sie zu Rufnummern > Rufnummern kaufen und suchen Sie nach einer Nummer, die Ihren Anforderungen entspricht.

Bevor Sie diesen Beitrag durcharbeiten, müssen Sie PHP installiert haben. Ich verwende PHP 7.2, aber der Code hier sollte auch mit PHP 5.6 und höher funktionieren. Sie benötigen außerdem Composer um unsere Abhängigkeiten herunterzuladen.

Schließlich benötigen Sie die Vonage CLI installiert sein. Damit werden wir unseren Vonage Account konfigurieren und eine Telefonnummer erwerben.

Entgegennahme eines Anrufs mit PHP

Bevor wir uns mit den Details der Funktionsweise befassen, erstellen wir zunächst eine PHP-Anwendung, die eingehende Sprachanrufe verarbeitet. Wenn ein Sprachanruf eingeht, stellt Vonage eine Anfrage an Ihre Anwendung, um herauszufinden, wie der Anruf zu beantworten ist.

Wir werden das Slim-Framework verwenden, um die eingehenden Anfragen zu bearbeiten, also installieren wir es jetzt mit composer:

composer require slim/slim "^3.0"

Sobald dies abgeschlossen ist, erstellen Sie eine neue Datei namens index.php mit dem folgenden Inhalt. Damit wird eine neue Slim-Anwendung erstellt und ein einzelner Endpunkt (/webhook/answer), der eine GET Anfrage mit einem from Query-String-Parameter akzeptiert und den from Wert im Body zurückgibt.

<?php
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;

require 'vendor/autoload.php';

$app = new \Slim\App;
$app->get('/webhook/answer', function (Request $request, Response $response) {
    $params = $request->getQueryParams();
    return $response->withJson($params['from']);
});

$app->run();

Speichern Sie diese Datei und öffnen Sie dann ein neues Terminalfenster. Starten wir den eingebauten PHP-Server und bedienen unsere Anwendung auf Port 8000.

php -t . -S localhost:8000

Besuchen Sie http://localhost:8000/webhook/answer?from=14155550100besuchen, sehen Sie die from Nummer, die im Antwortkörper zurückgegeben wird.

Das ist ein guter Anfang, aber Vonage weiß nicht, was zu tun ist, wenn wir nur mit der Telefonnummer des Anrufers antworten. Um Vonage mitzuteilen, wie der Anruf behandelt werden soll, müssen wir eine NCCO.

Der Einfachheit halber verwenden wir Text-To-Speech, um die Telefonnummer des Anrufers Ziffer für Ziffer vorzulesen. Zuerst teilen wir die Nummer in eine Reihe von Zeichen auf und fügen sie dann mit Leerzeichen zusammen:

$fromSplitIntoCharacters = implode(" ", str_split($params['from']));

Als nächstes definieren wir einen NCCO, der die talk Aktion verwendet, um diese Zeichen auszulesen:

$ncco = [
    [
        'action' => 'talk',
        'text' => 'Thank you for calling from '.$fromSplitIntoCharacters
    ]
];

Dann schließlich geben wir diesen NCCO zurück anstelle von $params['from']:

return $response->withJson($ncco);

Wenn wir das alles zusammenfügen, index.php sieht es folgendermaßen aus:

<?php
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;

require 'vendor/autoload.php';

$app = new \Slim\App;
$app->get('/webhook/answer', function (Request $request, Response $response) {
    $params = $request->getQueryParams();
    $fromSplitIntoCharacters = implode(" ", str_split($params['from']));

    $ncco = [
        [
            'action' => 'talk',
            'text' => 'Thank you for calling from '.$fromSplitIntoCharacters
        ]
    ];

    return $response->withJson($ncco);
});

$app->run();

Besuchen Sie http://localhost:8000/webhook/answer?from=14155550100 erneut auf und Sie erhalten die folgende Anzeige:

[
  {
    "action": "talk",
    "text": "Thank you for calling from 1 4 1 5 5 5 5 0 1 0 0"
  }
]

Herzlichen Glückwunsch! Sie haben soeben eine Anwendung geschrieben, die einen eingehenden Telefonanruf empfängt und mit dynamischen Inhalten antwortet. Sie können Ihre Antwort mit jedem der von Vonage bereitgestellten Parameter anpassen, einschließlich to, from und conversation_uuid.

Offenlegung Ihrer Anwendung mit ngrok

Wir haben eine Anwendung entwickelt, die so reagiert, wie wir es erwarten, aber im Moment gibt es ein großes Problem. Vonage soll eine Anfrage an die Anwendung stellen, wenn ein Anruf eingeht, aber sie läuft auf unserem lokalen Rechner!

Aber keine Sorge, ngrok kann den Tag retten. Wenn Sie mit ngrok nicht vertraut sind, gibt es eine fantastische Einführung in ngrok auf dem Vonage Blog.

Sobald Sie ngrok installiert haben, führen Sie ngrok http 8000 aus, um Ihre Anwendung dem Internet zugänglich zu machen. Notieren Sie sich die generierte ngrok URL notieren, da wir diese an Vonage weitergeben müssen (sie wird etwa so aussehen http://abc123.ngrok.io).

Konfigurieren Sie Ihren Vonage Account

Sobald Ihre Anwendung mit dem Internet verbunden ist, müssen Sie sie nur noch an eine Vonage-Telefonnummer anschließen. Beginnen wir mit dem Erwerb einer Rufnummer über die Vonage CLI. Suchen Sie zunächst nach einer Nummer:

vonage numbers:search US

Dann kaufen Sie eine der Numbers, die als verfügbar aufgelistet sind:

vonage numbers:buy US

Der nächste Schritt besteht darin, eine Vonage-Anwendung zu erstellen, die als Container für alle Einstellungen dient, die für Ihre Anwendung erforderlich sind. In diesem Fall müssen wir Vonage mitteilen, an welche URL eine Anfrage gestellt werden soll, wenn ein Anruf eingeht (answer_url), und wohin alle Ereignisinformationen über den Anruf gesendet werden sollen (event_url).

Wir können die Nexmo CLI verwenden, um eine Anwendung zu erstellen, wobei wir sicherstellen, dass wir die http://abc123.ngrok.io durch Ihre eigene generierte URL zu ersetzen. Wir geben einen Namen an, dann ein answer_url und event_url für die Anwendung:

vonage apps:create "InboundCalls" --voice_answer_url=http://abc123.ngrok.io/webhook/answer --voice_event_url=http://abc123.ngrok.io/webhook/event

Notieren Sie sich die ID Ihrer Anwendung (sie sieht so ähnlich aus wie aaaaaaaa-bbbb-cccc-dddd-0123456789ab) und lesen Sie dann weiter.

Als Letztes müssen Sie die gekaufte Nummer mit der soeben erstellten Anwendung verknüpfen. Dadurch wird Vonage mitgeteilt, dass bei einem eingehenden Anruf eine GET Anfrage an die Anwendung answer_url um herauszufinden, wie es mit dem Anruf weitergehen soll.

Auch hier können wir die Nexmo CLI verwenden und die Beispieltelefonnummer und die Anwendungs-ID durch Ihre eigene ersetzen:

vonage apps:link aaaaaaaa-bbbb-cccc-dddd-0123456789ab --number=14155550100

Das ist alles, was wir tun mussten, damit Vonage unsere PHP-Anwendung mit einem eingehenden Telefonanruf verknüpft. Probieren Sie es jetzt aus, indem Sie die von Ihnen erworbene Telefonnummer anrufen.

Schlussfolgerung

Gemeinsam haben wir gerade eine Anwendung entwickelt, die einen eingehenden Telefonanruf entgegennehmen und dynamisch eine Antwort in nur 22 Zeilen Code generieren kann!

Wenn Sie mehr über Voice-Anrufe mit PHP und Vonage erfahren möchten, finden Sie Beispiel-Bausteine in Nexmo Developer. Wenn Sie Ihre Antwort auf eingehende Anrufe komplexer gestalten wollen (z.B. Aufzeichnung des Tons des Anrufers), können Sie mehr über NCCOs in der NCCO-Referenz

Wie immer, wenn Sie Fragen zu diesem Beitrag haben, können Sie eine E-Mail an devrel@nexmo.com schicken oder treten Sie dem Slack-Kanal der Nexmo-Community beiwo wir auf Sie warten und bereit sind, Ihnen zu helfen.

Teilen Sie:

https://a.storyblok.com/f/270183/384x384/1c8825919c/mheap.png
Michael HeapVonage Ehemalige

Michael ist ein polyglotter Software-Ingenieur, der sich dafür einsetzt, die Komplexität von Systemen zu reduzieren und sie berechenbarer zu machen. Er arbeitet mit einer Vielzahl von Sprachen und Tools und gibt sein technisches Fachwissen auf Benutzergruppen und Konferenzen in der ganzen Welt weiter. Im Alltag ist Michael ein ehemaliger Developer Advocate bei Vonage, wo er seine Zeit damit verbrachte, über alle Arten von Technologie zu lernen, zu lehren und zu schreiben.