Receiving an SMS
To receive an SMS, you need to:
- Rent a virtual number to receive messages
- Create a webhook endpoint using one of the code examples shown below
- Configure the webhook in your Vonage Dashboard
Prerequisites
npm install express body-parser
Create a file named receive-express.js
and add the following code:
const app = require('express')()
const bodyParser = require('body-parser')
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true }))
Write the code
Add the following to receive-express.js
:
app
.route('/webhooks/inbound-sms')
.get(handleInboundSms)
.post(handleInboundSms)
function handleInboundSms(request, response) {
const params = Object.assign(request.query, request.body)
console.log(params)
response.status(204).send()
}
app.listen(process.env.PORT || 3000)
Run your code
Save this file to your machine and run it:
node receive-express.js
Prerequisites
Add the following to `build.gradle`:
compile 'com.vonage:client:5.5.0'
compile 'com.sparkjava:spark-core:2.7.2'
Write the code
Add the following to the main
method of the ReceiveSMS
class:
/*
* Route to handle incoming SMS GET request.
*/
Route inboundSmsAsGet = (req, res) -> {
System.out.println("msisdn: " + req.queryParams("msisdn"));
System.out.println("messageId: " + req.queryParams("messageId"));
System.out.println("text: " + req.queryParams("text"));
System.out.println("type: " + req.queryParams("type"));
System.out.println("keyword: " + req.queryParams("keyword"));
System.out.println("messageTimestamp: " + req.queryParams("message-timestamp"));
res.status(204);
return "";
};
/*
* Route to handle incoming SMS with POST form-encoded or JSON body.
*/
Route inboundSmsAsPost = (req, res) -> {
// The body will be form-encoded or a JSON object:
if (req.contentType().startsWith("application/x-www-form-urlencoded")) {
System.out.println("msisdn: " + req.queryParams("msisdn"));
System.out.println("messageId: " + req.queryParams("messageId"));
System.out.println("text: " + req.queryParams("text"));
System.out.println("type: " + req.queryParams("type"));
System.out.println("keyword: " + req.queryParams("keyword"));
System.out.println("messageTimestamp: " + req.queryParams("message-timestamp"));
} else {
MessageEvent event = MessageEvent.fromJson(req.body());
System.out.println("msisdn: " + event.getMsisdn());
System.out.println("messageId: " + event.getMessageId());
System.out.println("text: " + event.getText());
System.out.println("type: " + event.getType());
System.out.println("keyword: " + event.getKeyword());
System.out.println("messageTimestamp: " + event.getMessageTimestamp());
}
res.status(204);
return "";
};
Spark.port(8080);
Spark.get("/webhooks/inbound-sms", inboundSmsAsGet);
Spark.post("/webhooks/inbound-sms", inboundSmsAsPost);
Run your code
We can use the application
plugin for Gradle to simplify the running of our application.
Update your build.gradle
with the following:
apply plugin: 'application'
mainClassName = project.hasProperty('main') ? project.getProperty('main') : ''
Run the following gradle
command to execute your application, replacing com.vonage.quickstart.sms
with the package containing ReceiveSMS
:
gradle run -Pmain=com.vonage.quickstart.sms.ReceiveSMS
Prerequisites
Install-Package Vonage
Create a file named SmsController.cs
and add the following code:
using Vonage.Messaging;
using Vonage.Utility;
Write the code
Add the following to SmsController.cs
:
[HttpGet("webhooks/inbound-sms")]
public IActionResult InboundSms()
{
var sms = WebhookParser.ParseQuery<InboundSms>(Request.Query);
Console.WriteLine($"SMS Received with message: {sms.Text}");
return NoContent();
}
Prerequisites
composer require slim/slim:^3.8 vonage/client
Create a file named index.php
and add the following code:
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;
Write the code
Add the following to index.php
:
$handler = function (Request $request, Response $response) {
$sms = \Vonage\SMS\Webhook\Factory::createFromRequest($request);
error_log('From: ' . $sms->getMsisdn() . ' message: ' . $sms->getText());
return $response->withStatus(204);
};
$app->map(['GET', 'POST'], '/webhooks/inbound-sms', $handler);
$app->run();
Run your code
Save this file to your machine and run it:
php -S localhost:3000 -t .
Prerequisites
pip install flask
Create a file named receive-flask.py
and add the following code:
from pprint import pprint
from flask import Flask, request
app = Flask(__name__)
Write the code
Add the following to receive-flask.py
:
@app.route('/webhooks/inbound-sms', methods=['GET', 'POST'])
def inbound_sms():
if request.is_json:
pprint(request.get_json())
else:
data = dict(request.form) or dict(request.args)
pprint(data)
return ('', 204)
app.run(port=3000)
Run your code
Save this file to your machine and run it:
python receive-flask.py
Prerequisites
gem install sinatra sinatra-contrib
Create a file named receive.rb
and add the following code:
require 'sinatra'
require 'sinatra/multi_route'
require 'json'
helpers do
def parsed_body
json? ? JSON.parse(request.body.read) : {}
end
def json?
request.content_type == 'application/json'
end
end
Write the code
Add the following to receive.rb
:
route :get, :post, '/webhooks/inbound-sms' do
puts params.merge(parsed_body)
status 204
end
set :port, 3000
Run your code
Save this file to your machine and run it:
ruby receive.rb
Configure the webhook endpoint in your Vonage Dashboard
So that Vonage knows how to access your webhook, you must configure it in your Vonage account.
In the code snippets, the webhook is located at /webhooks/inbound-sms
. If you are using Ngrok, the webhook you need to configure in your Vonage Dashboard API Settings page is of the form https://demo.ngrok.io/webhooks/inbound-sms
. Replace demo
with the subdomain provided by Ngrok and enter your endpoint in the field labeled Webhook URL for Inbound Message:
Try it out
Now when you send your Vonage number an SMS you should see it logged in your console. The message object contains the following properties:
{
"msisdn": "447700900001",
"to": "447700900000",
"messageId": "0A0000000123ABCD1",
"text": "Hello world",
"type": "text",
"keyword": "Hello",
"message-timestamp": "2020-01-01T12:00:00.000+00:00",
"timestamp": "1578787200",
"nonce": "aaaaaaaa-bbbb-cccc-dddd-0123456789ab",
"concat": "true",
"concat-ref": "1",
"concat-total": "3",
"concat-part": "2",
"data": "abc123",
"udh": "abc123"
}