Level up your Twilio API skills in TwilioQuest, an educational game for Mac, Windows, and Linux. Download Now

Menu

Expand
Rate this page:

Thanks for rating this page!

We are always striving to improve our documentation quality, and your feedback is valuable to us. How could this documentation serve you better?

Gather User Input via Keypad (DTMF Tones) in PHP

In this guide, we'll show you how to gather user input during a phone call through the phone's keypad (using DTMF tones) in your PHP application. By applying this technique, you can create interactive voice response (IVR) systems and other phone based interfaces for your users. The code snippets in this guide are written using PHP language features in PHP version 4.3 or higher, and make use of Twilio PHP SDK.

Let's get started!

Set up your web application to receive incoming phone calls

This guide assumes you have already set up your web application to receive incoming phone calls. If you still need to complete this step, check out this guide. It should walk you through the process of buying a Twilio number, and configuring it to receive incoming calls.

Collect user input with the <Gather> TwiML verb

The <Gather> TwiML verb allows us to collect input from the user during a phone call. <Gather> can have selected TwiML verbs nested within it, such as <Say> and <Play>. In this example, we will prompt the user to enter a number to connect to a certain department within our little IVR system.

        
        
        
        
        This example returns TwiML containing a <Say> tag nested within a <Gather> tag. The user will be prompted to choose sales or support.

        Use <Gather> to collect user input via the keypad (DTMF tones)

        This example returns TwiML containing a <Say> tag nested within a <Gather> tag. The user will be prompted to choose sales or support.

        If the user doesn't enter any input after a configurable timeout, Twilio will continue processing the TwiML in the document to determine what should happen next in the call, or it will hang up. In the above example, we use the <Redirect> verb to simply have Twilio request the same URL again to prompt for input.

        Now, if you were to run the example above and enter input, you would notice that you'd hear the same prompt over and over again regardless of what button you pressed. By default, if the user does enter input in the <Gather>, Twilio will send another HTTP request to the current webhook URL with a POST parameter containing the Digits entered by the user. In the sample above, we weren't handling this input at all. Let's update that logic to also process user input (if it is present).

              
              
              
              
              By default, <Gather> will "loop" on the current TwiML URL, requesting the same URL every time input is entered.

              Branch your call logic based on the digits sent by the user

              By default, <Gather> will "loop" on the current TwiML URL, requesting the same URL every time input is entered.

              Specify an action to take after user input is collected

              Handling user input and prompts in the same webhook URL is fine, but you may want to have an entirely different endpoint in your application handle the processing of user input. This is possible using the "action" attribute of the <Gather> verb. Let's update our example to add a second endpoint that will be responsible for handling user input.

              Handle the initial webhook request

                    
                    
                    
                    
                    This technique creates a separate route to handle user input.

                    Add another route to handle the input from the user

                    This technique creates a separate route to handle user input.

                    The action attribute takes a relative URL which would point to another route your server is capable of handling.

                    Handle action url request in a different end point

                          
                          
                          
                          
                          This technique creates a separate route to handle user input.

                          Implement an 'action' URL to handle user input

                          This technique creates a separate route to handle user input.

                          Now, instead of conditional logic in a single route, we use actions and redirects to handle our call logic with separate code paths.

                          Where to next?

                          If you're building call center type applications in PHP, you might enjoy stepping through full sample applications written in PHP.

                          Agustin Camino Ricky Robinett David Prothero Rob Spectre Mario Celi Andrew Baker Kevin Whinnery Kat King
                          Rate this page:

                          Need some help?

                          We all do sometimes; code is hard. Get help now from our support team, or lean on the wisdom of the crowd browsing the Twilio tag on Stack Overflow.