Langkah 1: Daftar & Masuk
- Buka Pendaftaran Message Central
- Buat akun gratis Anda
- Gunakan kredit gratis Anda untuk menguji dan bermain-main dengan OTP
Langkah 2: Integrasi API (Pengembang, Merakit!)
Kami telah membuat semuanya sangat sederhana. Salin beberapa cuplikan kode dan Anda akan menguji dalam waktu singkat.
Lebih suka mengawasi daripada pengkodean? Kami panduan video cepat Sudahkah Anda menutupi.
Parameter API untuk Verify Now
Parameter berikut perlu dikirim saat menggunakan API VerifyNow.
RCS/ SOUND
URL Dasar API Rest
Semua titik akhir API Platform di bawah ini harus diawali dengan URL berikut:
https://cpaas.messagecentral.comMenghasilkan Token
Saat menggunakan API verifikasi SMS Verify Now untuk mengirim kode verifikasi SMS, panggilan awal harus ke API pembuatan token.
API ini mengembalikan token yang harus disertakan dalam semua panggilan berikutnya. Token otentikasi diperlukan untuk memvalidasi pengguna dan harus dimasukkan dalam bagian header dari setiap permintaan.
Meminta Jalur URL:
/auth/v1/authentication/tokencURL
1curl --location 'https://cpaas.messagecentral.com/auth/v1/authentication/token?
2customerId=%3CCustomerId%3E&key=%3CBase64%20Encrypted%20password%3E&scope=NEW&country=91
3&email=test%40messagecentral.com' \
4--header 'accept: */*'
CATATAN: Untuk mengubah perintah cURL menjadi kode menggunakan Postman, buka Postman, impor perintah cURL melalui tombol “Impor”, lalu buat kode dalam bahasa pilihan Anda dengan mengklik tombol “Kode” di sisi kanan permintaan.
Tanggapan JSON
1{
2 "status": Integer,
3 "token": "String"
4}Contoh Kode
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = RequestBody.create(mediaType, "");
Request request = new Request.Builder()
.url("https://cpaas.messagecentral.com/auth/v1/authentication/token?customerId=<CustomerId>&key=<Base64 Encrypted password>&scope=NEW&country=91&email=test@messagecentral.com")
.method("GET", body)
.addHeader("accept", "*/*")
.build();
Response response = client.newCall(request).execute();var request = require('request');
var options = {
'method': 'GET',
'url': 'https://cpaas.messagecentral.com/auth/v1/authentication/token?customerId=<CustomerId>&key=<Base64 Encrypted password>&scope=NEW&country=91&email=test@messagecentral.com',
'headers': {
'accept': '*/*'
}
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://cpaas.messagecentral.com/auth/v1/authentication/token?customerId=<CustomerId>&key=<Base64 Encrypted password>&scope=NEW&country=91&email=test@messagecentral.com');
$request->setMethod(HTTP_Request2::METHOD_GET);
$request->setConfig(array(
'follow_redirects' => TRUE
));
$request->setHeader(array(
'accept' => '*/*'
));
try {
$response = $request->send();
if ($response->getStatus() == 200) {
echo $response->getBody();
}
else {
echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
$response->getReasonPhrase();
}
}
catch(HTTP_Request2_Exception $e) {
echo 'Error: ' . $e->getMessage();
}import requests
url = "https://cpaas.messagecentral.com/auth/v1/authentication/token?customerId=<CustomerId>&key=<Base64 Encrypted password>&scope=NEW&country=91&email=test@messagecentral.com"
payload = {}
headers = {
'accept': '*/*'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "net/http"
url = URI("https://cpaas.messagecentral.com/auth/v1/authentication/token?customerId=<CustomerId>&key=<Base64 Encrypted password>&scope=NEW&country=91&email=test@messagecentral.com")
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
request = Net::HTTP::Get.new(url)
request["accept"] = "*/*"
response = https.request(request)
puts response.read_body
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://cpaas.messagecentral.com/auth/v1/authentication/token?customerId=<CustomerId>&key=<Base64 Encrypted password>&scope=NEW&country=91&email=test@messagecentral.com");
request.Headers.Add("accept", "*/*");
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());Kirim OTP
Untuk SendOTP pada nomor ponsel di bawah ini adalah parameter permintaan. Token otentikasi diperlukan untuk mengirim OTP yang dihasilkan oleh token API yang dihasilkan (yang dapat Anda temukan di atas di bagian Pendahuluan).
Meminta Jalur URL:
Respons yang berhasil akan mengembalikan kode status 200.
/verification/v3/sendParameter URL Minta:
cURL
1curl --location --request POST 'https://cpaas.messagecentral.com/verification/v3/send?
2countryCode=91&flowType=SMS&mobileNumber=9999999999' \
3--header 'authToken:
4eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJDLTMzNDMyQTVGNDIGNzQwNCI6ImIhdCI6MTcxMjExOTA0MCwiZXhwIjo'
CATATAN: Untuk mengubah perintah cURL menjadi kode menggunakan Postman, buka Postman, impor perintah cURL melalui tombol “Impor”, lalu buat kode dalam bahasa pilihan Anda dengan mengklik tombol “Kode” di sisi kanan permintaan. Anda dapat mengubah basis FlowType saluran pilihan Anda.
Tanggapan JSON
1{
2 "responseCode": 200,
3 "message": "SUCCESS",
4 "data": {
5 "verificationId": "xxxx",
6 "mobileNumber": "xxxx",
7 "responseCode": "200",
8 "errorMessage": null,
9 "timeout": "60",
10 "smCLI": null,
11 "transactionId": "xxxx"
12 }
13}Contoh Kode
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = RequestBody.create(mediaType, "");
Request request = new Request.Builder()
.url("https://cpaas.messagecentral.com/verification/v3/send?countryCode=91&flowType=SMS&mobileNumber=9999999999")
.method("POST", body)
.addHeader("authToken", "eyJhbGciOiJIUzUxMiJ9.eyJzdWOiJDLTMzNDMyQTVGNDlGNzQwNCIsImlhdCI6MTcxMjExOTA0MCwiZXhw")
.build();
Response response = client.newCall(request).execute();
var request = require('request');
var options = {
'method': 'POST',
'url': 'https://cpaas.messagecentral.com/verification/v3/send?countryCode=91&flowType=SMS&mobileNumber=9999999999',
'headers': {
'authToken': 'eyJhbGciOiJIUzUxMiJ9.eyJzdWOiJDLTMzNDMyQTVGNDlGNzQwNCIsImlhdCI6MTcxMjExOTA0MCwiZXhw'
}
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://cpaas.messagecentral.com/verification/v3/send?countryCode=91&flowType=SMS&mobileNumber=9999999999');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
'follow_redirects' => TRUE
));
$request->setHeader(array(
'authToken' => 'eyJhbGciOiJIUzUxMiJ9.eyJzdWOiJDLTMzNDMyQTVGNDlGNzQwNCIsImlhdCI6MTcxMjExOTA0MCwiZXhw'
));
try {
$response = $request->send();
if ($response->getStatus() == 200) {
echo $response->getBody();
}
else {
echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
$response->getReasonPhrase();
}
}
catch(HTTP_Request2_Exception $e) {
echo 'Error: ' . $e->getMessage();
}import requests
url = "https://cpaas.messagecentral.com/verification/v3/send?countryCode=91&flowType=SMS&mobileNumber=9999999999"
payload = {}
headers = {
'authToken': 'eyJhbGciOiJIUzUxMiJ9.eyJzdWOiJDLTMzNDMyQTVGNDlGNzQwNCIsImlhdCI6MTcxMjExOTA0MCwiZXhw'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)require "uri"
require "net/http"
url = URI("https://cpaas.messagecentral.com/verification/v3/send?countryCode=91&flowType=SMS&mobileNumber=9999999999")
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
request = Net::HTTP::Post.new(url)
request["authToken"] = "eyJhbGciOiJIUzUxMiJ9.eyJzdWOiJDLTMzNDMyQTVGNDlGNzQwNCIsImlhdCI6MTcxMjExOTA0MCwiZXhw"
response = https.request(request)
puts response.read_bodyvar client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://cpaas.messagecentral.com/verification/v3/send?countryCode=91&flowType=SMS&mobileNumber=9999999999");
request.Headers.Add("authToken", "eyJhbGciOiJIUzUxMiJ9.eyJzdWOiJDLTMzNDMyQTVGNDlGNzQwNCIsImlhdCI6MTcxMjExOTA0MCwiZXhw");
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());Validasi OTP
Metode validateOTP adalah titik akhir REST API untuk memvalidasi kata sandi satu kali (OTP) untuk pelanggan.
Meminta Jalur URL:
Respons yang berhasil akan mengembalikan kode status 200.
/verification/v3/validateOtp/- Untuk dukungan beberapa bahasa
- secara default adalah bahasa Inggris
- Untuk saat ini kami hanya mendukung bahasa Inggris
cURL
1curl --location 'https://cpaas.messagecentral.com/verification/v3/validateOtp?
2&verificationId=2949&code=1476' \
3--header 'authToken:
4eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJDLTMzNDMyQTVGNDIGNzQwNCI6ImIhdCI6MTcxMjExOTA0MC'
CATATAN: Untuk mengubah perintah cURL menjadi kode menggunakan Postman, buka Postman, impor perintah cURL melalui tombol “Impor”, lalu buat kode dalam bahasa pilihan Anda dengan mengklik tombol “Kode” di sisi kanan permintaan.
Tanggapan JSON
Respons yang berhasil akan mengembalikan kode status 200.
1{
2 "responseCode": 200,
3 "message": "SUCCESS",
4 "data": {
5 "verficationId": "xxxx",
6 "mobileNumber": "xxxx",
7 "responseCode": "200",
8 "errorMessage": null,
9 "verificationStatus": "VERIFICATION_COMPLETED",
10 "authToken": null,
11 "transactionId": "xxxx"
12 }
13}Contoh Kode
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = RequestBody.create(mediaType, "");
Request request = new Request.Builder()
.url("https://cpaas.messagecentral.com/verification/v3/validateOtp?&verificationId=2949&code=1476")
.method("GET", body)
.addHeader("authToken", "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJDLTMzNDMyQTVGNDlGNzQwNCIsImlhdCI6MTcxMjExOT")
.build();
Response response = client.newCall(request).execute();var request = require('request');
var options = {
'method': 'GET',
'url': 'https://cpaas.messagecentral.com/verification/v3/validateOtp?&verificationId=2949&code=1476',
'headers': {
'authToken': 'eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJDLTMzNDMyQTVGNDlGNzQwNCIsImlhdCI6MTcxMjExOT'
}
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://cpaas.messagecentral.com/verification/v3/validateOtp?&verificationId=2949&code=1476');
$request->setMethod(HTTP_Request2::METHOD_GET);
$request->setConfig(array(
'follow_redirects' => TRUE
));
$request->setHeader(array(
'authToken' => 'eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJDLTMzNDMyQTVGNDlGNzQwNCIsImlhdCI6MTcxMjExOT'
));
try {
$response = $request->send();
if ($response->getStatus() == 200) {
echo $response->getBody();
}
else {
echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
$response->getReasonPhrase();
}
}
catch(HTTP_Request2_Exception $e) {
echo 'Error: ' . $e->getMessage();
}var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://cpaas.messagecentral.com/verification/v3/validateOtp?&verificationId=2949&code=1476");
request.Headers.Add("authToken", "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJDLTMzNDMyQTVGNDlGNzQwNCIsImlhdCI6MTcxMjExOT");
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
require "uri"
require "net/http"
url = URI("https://cpaas.messagecentral.com/verification/v3/send?countryCode=91&flowType=SMS&mobileNumber=9999999999")
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
request = Net::HTTP::Post.new(url)
request["authToken"] = "eyJhbGciOiJIUzUxMiJ9.eyJzdWOiJDLTMzNDMyQTVGNDlGNzQwNCIsImlhdCI6MTcxMjExOTA0MCwiZXhw"
response = https.request(request)
puts response.read_bodyvar client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://cpaas.messagecentral.com/verification/v3/send?countryCode=91&flowType=SMS&mobileNumber=9999999999");
request.Headers.Add("authToken", "eyJhbGciOiJIUzUxMiJ9.eyJzdWOiJDLTMzNDMyQTVGNDlGNzQwNCIsImlhdCI6MTcxMjExOTA0MCwiZXhw");
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());Kode Respon
Bantuan dan Dukungan
Butuh bantuan? Pakar kami tersedia 24/7 untuk memandu Anda melalui apa pun, kapan saja.
Email dukungan: support@messagecentral.com
Pertanyaan yang Sering Diajukan
Apa API OTP SMS terbaik untuk India berdasarkan keandalan pengiriman dan latensi?
Pilih penyedia API OTP SMS yang menawarkan rute operator langsung, peering operator regional, pengiriman ulang/fallback otomatis, dan SLA pengiriman yang terukur. Penyedia terbaik juga mendukung kepatuhan DLT, laporan pengiriman (DLR), perutean berlatensi rendah, dan fallback SMS + WhatsApp. Evaluasi dengan mengukur tingkat pengiriman nyata, latensi rata-rata (ms), dan rincian error di operator utama India (Jio, Airtel, Vi).
Seberapa cepat pengiriman OTP seharusnya untuk aplikasi di India, dan apa yang memengaruhi latensi?
Targetkan pengiriman di bawah 2 detik untuk UX terbaik (di bawah 5 detik masih dapat diterima). Latensi dipengaruhi oleh perutean operator, antrean saat lalu lintas puncak, kepadatan jaringan, jumlah lompatan agregator SMS, serta penundaan DLT/templat. Gunakan rute langsung, perutean paralel, dan fallback SMS + WhatsApp bawaan untuk meminimalkan latensi OTP end-to-end dan meningkatkan tingkat penyelesaian.
Bagaimana cara mengintegrasikan API OTP SMS ke aplikasi saya di India (Node.js, Python, PHP, Java)?
Alur dasar: buat OTP yang aman → panggil API kirim-OTP penyedia → simpan hash OTP + masa berlaku → verifikasi input pengguna terhadap hash yang tersimpan melalui API/webhook verifikasi-OTP. Sebagian besar penyedia menawarkan endpoint REST dan SDK Verifikasi OTP. Contoh (pseudo):
Node.js (fetch):
await fetch('https://api.provider/send', {
method:'POST',
headers:{'Authorization':'Bearer KEY','Content-Type':'application/json'},
body: JSON.stringify({to:'+91XXXXXXXXXX', template:'OTP {{code}}',
variables:{code:123456}}) });
Gunakan HTTPS, HMAC/penandatanganan, pengiriman ulang, dan webhook untuk laporan pengiriman (DLR).
Bagaimana cara mencegah penyalahgunaan kirim ulang OTP atau serangan brute-force pada alur autentikasi saya?
Terapkan perlindungan di sisi server:
- Batasi jumlah kirim ulang per nomor telepon per jangka waktu (misalnya 3 kali kirim / 10 menit).
- Batasi jumlah percobaan verifikasi dan tambahkan jeda bertahap atau blokir sementara setelah gagal.
- Gunakan sidik jari perangkat + IP dan CAPTCHA untuk alur yang mencurigakan.
- Kunci akun atau minta verifikasi tambahan setelah N kali percobaan gagal. Catat setiap percobaan dan beri tahu tim keamanan.
Apa penyebab kegagalan pengiriman OTP di India dan bagaimana developer mengatasinya?
Penyebab umum: penolakan DLT/templat, pemfilteran operator (DND), perutean yang buruk, sender ID yang salah, format nomor yang keliru, atau gangguan sementara di operator. Solusi: pastikan persetujuan DLT & templat, gunakan format nomor E.164 yang benar (+91), kirim ulang melalui rute alternatif, aktifkan fallback SMS, pantau DLR, dan gunakan penyedia yang memiliki hubungan langsung dengan operator.
Bagaimana cara menguji API OTP dalam mode sandbox tanpa mengirim SMS sungguhan?
Gunakan sandbox atau kunci uji dari penyedia untuk menyimulasikan pengiriman/laporan. Fitur sandbox biasanya mengembalikan DLR dan respons verifikasi yang disimulasikan. Secara lokal, gunakan respons API tiruan (mock) untuk unit test dan kredensial staging untuk QA end-to-end. Selalu validasi webhook di staging (gunakan alat seperti ngrok) dan catat semua event agar dapat diputar ulang saat pengujian.
Bagaimana cara menerapkan pembatasan laju (rate limiting) dan logika pengiriman ulang untuk OTP?
Pembatasan laju: terapkan batas per nomor telepon dan per IP di API gateway (misalnya 3 kali kirim per 10 menit). Logika pengiriman ulang: terapkan exponential backoff untuk error sementara dan kirim ulang segera melalui rute alternatif untuk kegagalan ringan. Selalu batasi jumlah pengiriman ulang (misalnya 3 kali) dan lacak hasilnya agar tidak dianggap spam atau diblokir operator.
Bisakah saya menggunakan Sender ID alfanumerik untuk OTP di India?
Tidak — India mewajibkan Sender ID numerik melalui rute yang disetujui DLT untuk sebagian besar alur transaksional; Sender ID alfanumerik umumnya tidak diizinkan untuk OTP. OTP harus mengikuti aturan telekomunikasi/DLT. Gunakan penyedia yang patuh dan mengelola registrasi DLT serta pengaturan Sender ID numerik untuk Anda.
Berapa masa berlaku OTP dan siklus kirim ulang yang direkomendasikan untuk pengguna di India?
Masa berlaku: 3–5 menit adalah standar untuk OTP transaksional (2FA). Siklus kirim ulang: izinkan 1–2 kali kirim ulang langsung dengan batas anti-penyalahgunaan (misalnya maksimal 3 kali kirim per 10–15 menit). Masa berlaku yang singkat mengurangi penipuan; batas kirim ulang yang wajar mengurangi beban dukungan dan pemfilteran operator.
Apa perbedaan rute OTP Transaksional dan Service Implicit?
Rute Transaksional digunakan untuk pesan penting yang dinantikan (OTP, pembaruan pesanan) dengan aturan kepatuhan yang lebih ketat dan biasanya prioritas pengiriman lebih tinggi. Rute Service Implicit (atau rute layanan lainnya) dapat berbeda per operator dan sering menerapkan aturan templat/persetujuan yang berbeda. Periksa dokumentasi perutean penyedia Anda — pilih rute transaksional untuk OTP agar keterkiriman dan kepatuhan maksimal.
Bagaimana cara bermigrasi dari penyedia SMS lain ke API OTP baru tanpa downtime?
Rencanakan peralihan bertahap:
- Konfigurasikan penyedia baru dan siapkan DLT/templat secara paralel.
- Duplikasi trafik (kirim batch uji) dan verifikasi metrik pengiriman.
- Terapkan pengiriman ganda untuk sebagian kecil trafik live (A/B) dan pantau hasilnya.
- Alihkan trafik secara bertahap sambil tetap menjadikan penyedia lama sebagai cadangan.
- Perbarui endpoint DNS/webhook dan cabut kunci lama setelah stabil. Pantau log dan tingkat pengiriman dengan cermat.
