Twillio
Twillio provides voice and messaging to the web and mobile applications. Twillio is powerful / low cost of entry / extremely simple interface.
Typical Cost Plan
United Kingdom 0.04$ Per Send
India 0.01$ Per Send
US 0.0075$ Per Send
Singapore 0.012$ Per Send
France 0.07$ Per Send
Spain 0.08$ Per Send
Italy 0.072$ Per Send
Assumption :
- 10000k / month subscription from US : 75.00$
- 10000k / month subscription from UK : 400.00$
- 10000k / month subscription from India : 100.00$
- 10000k / month subscription from Singapore : 120.00$
- 10000k / month subscription from France : 700.00$
= 1395.00 $ / month / 50K subscription
Using Twillio with REST DropWizard framework
Step 1: Register for account in the Twillio
Need to provide valid mobile number for registration and need to provide the verification code for authentication. Twillio provides option to simulate the voice and sms calls and provides API calls which used to invoke the sample calls. Store the unique phone number generated for your account, that number will be used for all communication as FROM / Originator of the SMS messages.
Step 2: Get Authentication Id and Token from the account dashboard
Step 3: Include latest Twillio SDK library in the Maven XML
< dependency >
< groupId >com.twilio.sdk</ groupId >
< artifactId >twilio-java-sdk</ artifactId >
< version >3.4.5</ version >
</ dependency >
|
Step 4: Create Dropwizard Configuration with Twillio Authentication Details.
....
twilioConfiguration:
accountId: < account ID received from the Twillio page >
accountToken: < account token received from the Twillio account page >
number: < unique number generated for the Twillio account >
....
Step 5: Twillio Dropwizard Configuration Loader.
import
com.fasterxml.jackson.annotation.JsonProperty;
public class TwilioConfiguration
{
public String
getAccountId() {
return accountId;
}
public void setAccountId(String
accountId) {
this.accountId = accountId;
}
public String
getAccountToken() {
return accountToken;
}
public void
setAccountToken(String accountToken) {
this.accountToken = accountToken;
}
public String getNumber() {
return number;
}
public void setNumber(String
number) {
this.number = number;
}
@NotEmpty
@JsonProperty
private String accountId;
@NotEmpty
@JsonProperty
private String accountToken;
@NotEmpty
@JsonProperty
private String number;
}
Step 6: Include the configuration in the master application configuration.
......
@Valid
@NotNull
@JsonProperty
private TwilioConfiguration twilioConfiguration;
public TwilioConfiguration
getTwilioConfiguration() {
return twilioConfiguration;
}
public void setTwilioConfiguration(TwilioConfiguration twilioConfiguration) {
this.twilioConfiguration =
twilioConfiguration;
}
......
Step 7: Create a class which can use Twillio SDK to send SMS.
import java.io.IOException;
import
java.util.LinkedList;
import java.util.List;
import
org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import
com.twilio.sdk.TwilioRestClient;
import
com.twilio.sdk.TwilioRestException;
import
com.twilio.sdk.resource.factory.MessageFactory;
public class TwilioVerificationSmsSender {
private final String accountId;
private final String accountToken;
private final String number;
public TwilioVerificationSmsSender (TwilioConfiguration config) {
this.accountId =
config.getAccountId();
this.accountToken =
config.getAccountToken();
this.number =
config.getNumber();
}
public void
sendSmsVerificationCode(String destination,
String
verificationCode) throws IOException, TwilioRestException {
TwilioRestClient
client = new TwilioRestClient(accountId, accountToken);
MessageFactory
messageFactory = client.getAccount().getMessageFactory();
List
messageParameters = new LinkedList<>();
messageParameters.add(new BasicNameValuePair("To", destination));
messageParameters.add(new BasicNameValuePair("From", number));
messageParameters.add(new BasicNameValuePair("Body", "Authentication
code for accessing the application:" + verificationCode));
try {
messageFactory.create(messageParameters);
}
catch (RuntimeException
damnYouTwilio) {
throw new
IOException(damnYouTwilio);
}
}
Step 8: Create a Dropwizard controller to handle the registration.
In the controller REST API for registration will help to communicate the short code to the destination.
.....
@Timed
@GET
@Path("/sms/code/{number}")
public Response
createAccount(@PathParam("number") String number) {
// Check the
validity of the destination number
//
if (!Utility.isValidPhoneNumber(number))
{
logger.error("Invalid destination number [ " + number + " ]");
throw new MobileApplicationException(Response.status(400).build());
}
VerificationCode
verificationCode = generateUniqueVerificationCode();
try {
twillioSender.sendSmsVerificationCode
(number, generateUniqueVerificationCode ());
}
catch (IOException e) {
e.printStackTrace();
}
return Response.ok().build();
}
protected int generateUniqueVerificationCode
() {
try {
SecureRandom
random = SecureRandom.getInstance("SHA1PRNG");
int code = 100000 +
random.nextInt(900000);
return new code;
}
catch
(NoSuchAlgorithmException e) {
throw new AssertionError(e);
}
}
.....
Will cover the Nexom and BulkSms solution usage in next article.