SMS Mailing Integration (Twilio) with Website
Twilio is an American provider of communication APIs: SMS, voice, video, WhatsApp. One of the standards for international projects. Phone numbers are available in most countries, but sending to Russian numbers may have carrier restrictions — testing in advance is recommended.
Sending SMS
// composer require twilio/sdk
$twilio = new \Twilio\Rest\Client(
env('TWILIO_ACCOUNT_SID'),
env('TWILIO_AUTH_TOKEN')
);
$message = $twilio->messages->create(
$to, // '+79001234567'
[
'from' => env('TWILIO_PHONE_NUMBER'), // '+12025551234'
'body' => "Your verification code: {$code}"
]
);
$messageSid = $message->sid; // save for tracking
Verification via Twilio Verify
Twilio Verify is a specialized service for OTP codes (better than custom implementation):
// Send OTP
$verification = $twilio->verify->v2
->services(env('TWILIO_VERIFY_SERVICE_SID'))
->verifications->create($phone, 'sms');
// Check code
$check = $twilio->verify->v2
->services(env('TWILIO_VERIFY_SERVICE_SID'))
->verificationChecks->create(['to' => $phone, 'code' => $userCode]);
if ($check->status === 'approved') {
// Code is correct
}
Verify advantage: no need to store codes in DB, manage expiration, count attempts — Twilio handles this automatically.
Webhook for Delivery Status
Twilio sends delivery status to a URL:
Route::post('/webhooks/twilio/sms', function (Request $request) {
// Verify X-Twilio-Signature header
$validator = new \Twilio\Security\RequestValidator(env('TWILIO_AUTH_TOKEN'));
if (!$validator->validate($request->header('X-Twilio-Signature'), $url, $request->all())) {
return response('Unauthorized', 403);
}
SmsDelivery::updateOrCreate(
['message_sid' => $request->MessageSid],
['status' => $request->MessageStatus] // sent, delivered, failed
);
});
Integration timeframe: 1 business day, including Verify setup for OTP.







