/
Documentación para desarrolladores de BulkGate
/
OTP API
/
Ejemplos de OTP
Ejemplos de OTP
Ejemplos de uso de la OTP API . El código se envía mediante send, se verifica mediante verify y, cuando es necesario, se vuelve a enviar mediante resend; los tres trabajan con el id que devuelve la primera solicitud.
Solicitud mínima
Solo son obligatorios el número del destinatario y request_quota_identification, la identificación del solicitante a la que se vincula la cuota por minuto. Recomendamos utilizar su dirección IP. Sin channel, el código se envía por SMS.
POST /api/1.0/otp/send HTTP/1.1
Host : portal.bulkgate.com
Content-Type : application/json
{
"application_id" : 451,
"application_token" : "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj" ,
"number" : "420777777777" ,
"request_quota_identification" : "127.0.0.1"
}
Formato propio del código
code_type elige los caracteres (int, string, combined) y code_length, la longitud (4–100). language selecciona el idioma del mensaje entre 100 códigos ISO compatibles.
POST /api/1.0/otp/send HTTP/1.1
Host : portal.bulkgate.com
Content-Type : application/json
{
"application_id" : 451,
"application_token" : "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj" ,
"number" : "420777777777" ,
"request_quota_identification" : "127.0.0.1" ,
"code_type" : "combined" ,
"code_length" : 8,
"language" : "es"
}
Autocompletado del código en la web (WebOTP)
developer.mozilla.org/WebOTP_API
domain en el objeto SMS añade una línea que permite al navegador ofrecer el código por sí mismo. El dominio debe coincidir con el sitio web en el que se introduce el código.
POST /api/1.0/otp/send HTTP/1.1
Host : portal.bulkgate.com
Content-Type : application/json
{
"application_id" : 451,
"application_token" : "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj" ,
"number" : "420777777777" ,
"request_quota_identification" : "127.0.0.1" ,
"channel" : {
"sms" : {
"sender_id" : "gText" ,
"sender_id_value" : "BulkGate" ,
"domain" : "https://example.com"
}
}
}
Cascada de canales
El orden de las claves es el orden de la cascada. Aquí se prueba primero Viber, tras 60 segundos sin entrega RCS y, por último, SMS. Una expiration inferior a 60 se ignora.
POST /api/1.0/otp/send HTTP/1.1
Host : portal.bulkgate.com
Content-Type : application/json
{
"application_id" : 451,
"application_token" : "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj" ,
"number" : "420777777777" ,
"request_quota_identification" : "127.0.0.1" ,
"channel" : {
"viber" : {
"sender" : "BulkGate" ,
"expiration" : 60
} ,
"rcs" : {
"sender" : "BulkGate" ,
"expiration" : 60
} ,
"sms" : {
"sender_id" : "gText" ,
"sender_id_value" : "BulkGate"
}
}
}
Código leído en voz alta
Text2Voice lee el código. repeat lo repite durante la llamada para que el destinatario pueda anotarlo.
POST /api/1.0/otp/send HTTP/1.1
Host : portal.bulkgate.com
Content-Type : application/json
{
"application_id" : 451,
"application_token" : "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj" ,
"number" : "420777777777" ,
"request_quota_identification" : "127.0.0.1" ,
"code_type" : "int" ,
"code_length" : 4,
"channel" : {
"text2voice" : {
"sender" : "420777777777" ,
"language" : "es" ,
"prefer_gender" : "female" ,
"repeat" : 2
}
}
}
Límites contra el abuso
trials_available_* limita cuántas veces se puede reenviar y verificar un mismo código, y daily_limit, el número de solicitudes en 24 horas. daily_limit_country permite además solo los países indicados; cualquier otro falla con country_is_disabled.
POST /api/1.0/otp/send HTTP/1.1
Host : portal.bulkgate.com
Content-Type : application/json
{
"application_id" : 451,
"application_token" : "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj" ,
"number" : "420777777777" ,
"request_quota_identification" : "127.0.0.1" ,
"request_quota_number" : 3,
"trials_available_resend" : 2,
"trials_available_verification" : 5,
"daily_limit" : 100,
"daily_limit_country" : {
"cz" : 100,
"sk" : 50
} ,
"expiration" : 600
}
Verificación del código
id es el valor de la respuesta a send. La respuesta devuelve verified; false significa un código no válido, no una solicitud fallida.
POST /api/1.0/otp/verify HTTP/1.1
Host : portal.bulkgate.com
Content-Type : application/json
{
"application_id" : 451,
"application_token" : "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj" ,
"id" : "otp-65cca8b4b6a6a2.24308291" ,
"code" : "123456"
}
Reenvío del código
Genera un nuevo código para la misma solicitud y lo envía por el mismo canal. Entre dos reenvíos deben pasar 60 segundos.
POST /api/1.0/otp/resend HTTP/1.1
Host : portal.bulkgate.com
Content-Type : application/json
{
"application_id" : 451,
"application_token" : "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj" ,
"id" : "otp-65cca8b4b6a6a2.24308291"
}
Ejemplos de código
A continuación tiene la misma solicitud send en distintos lenguajes de programación:
El significado de cada parámetro se describe en la especificación .
PHP
php.net
$context = stream_context_create (['http' => [
'method' => 'POST' ,
'header' => 'Content-Type: application/json' ,
'content' => json_encode ([
'application_id' => 451,
'application_token' => 'NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj' ,
'number' => '420777777777' ,
'request_quota_identification' => '127.0.0.1' ,
'language' => 'es' ,
'code_length' => 6,
'channel' => [
'sms' => [
'sender_id' => 'gText' ,
'sender_id_value' => 'BulkGate' ,
],
],
], JSON_THROW_ON_ERROR ),
'timeout' => 30,
'ignore_errors' => true ,
]]);
$body = file_get_contents ('https://portal.bulkgate.com/api/1.0/otp/send' , false , $context );
if ($body === false )
{
throw new RuntimeException ('BulkGate API no respondió.' );
}
$response = json_decode ($body , true , flags : JSON_THROW_ON_ERROR );
if (isset ($response ['error' ]))
{
throw new RuntimeException ("BulkGate: {$response['error']} ({$response['type']})" );
}
print_r ($response ['data' ]);
PHP cURL
php.net/curl
$curl = curl_init ();
curl_setopt_array ($curl , [
CURLOPT_URL => 'https://portal.bulkgate.com/api/1.0/otp/send' ,
CURLOPT_POST => true ,
CURLOPT_RETURNTRANSFER => true ,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Content-Type: application/json' ],
CURLOPT_POSTFIELDS => json_encode ([
'application_id' => 451,
'application_token' => 'NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj' ,
'number' => '420777777777' ,
'request_quota_identification' => '127.0.0.1' ,
'language' => 'es' ,
'code_length' => 6,
'channel' => [
'sms' => [
'sender_id' => 'gText' ,
'sender_id_value' => 'BulkGate' ,
],
],
], JSON_THROW_ON_ERROR ),
]);
$body = curl_exec ($curl );
$error = curl_error ($curl );
curl_close ($curl );
if ($error !== '' )
{
throw new RuntimeException ("BulkGate API: $error" );
}
print_r (json_decode ($body , true , flags : JSON_THROW_ON_ERROR ));
PHP Guzzle
docs.guzzlephp.org
use GuzzleHttp\Client ;
use GuzzleHttp\Exception\GuzzleException ;
$client = new Client (['timeout' => 30, 'http_errors' => false]);
try
{
$result = $client ->post ('https://portal.bulkgate.com/api/1.0/otp/send' , ['json' => [
'application_id' => 451,
'application_token' => 'NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj' ,
'number' => '420777777777' ,
'request_quota_identification' => '127.0.0.1' ,
'language' => 'es' ,
'code_length' => 6,
'channel' => [
'sms' => [
'sender_id' => 'gText' ,
'sender_id_value' => 'BulkGate' ,
],
],
]]);
}
catch (GuzzleException $e )
{
throw new RuntimeException ('BulkGate: ' . $e ->getMessage (), previous : $e );
}
print_r (json_decode ((string ) $result ->getBody (), true , flags : JSON_THROW_ON_ERROR ));
Go
go.dev
package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main ( ) {
url := "https://portal.bulkgate.com/api/1.0/otp/send"
payload := strings. NewReader ( `{"application_id": 451, "application_token": "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj", "number": "420777777777", "request_quota_identification": "127.0.0.1", "language": "es", "code_length": 6, "channel": {"sms": {"sender_id": "gText", "sender_id_value": "BulkGate"}}}` )
req, _ := http. NewRequest ( "POST" , url, payload)
req. Header. Add ( "Content-Type" , "application/json" )
res, err := http. DefaultClient. Do ( req)
if err != nil {
panic ( err)
}
defer res. Body. Close ( )
body, _ := io. ReadAll ( res. Body)
fmt. Println ( res. StatusCode, string ( body) )
}
Python
python.org
import requests
response = requests.post('https://portal.bulkgate.com/api/1.0/otp/send' , json = {
'application_id' : 451 ,
'application_token' : 'NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj' ,
'number' : '420777777777' ,
'request_quota_identification' : '127.0.0.1' ,
'language' : 'es' ,
'code_length' : 6 ,
'channel' : {
'sms' : {
'sender_id' : 'gText' ,
'sender_id_value' : 'BulkGate' ,
},
},
}, timeout = 30 )
data = response.json()
if 'error' in data:
raise RuntimeError(f"BulkGate: {data['error']} ({data['type']})" )
print (data['data' ]['id' ])
Node.js
nodejs.org
const response = await fetch ("https://portal.bulkgate.com/api/1.0/otp/send" , {
method : "POST" ,
headers : { "Content-Type" : "application/json" },
body : JSON .stringify ({
"application_id" : 451,
"application_token" : "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj" ,
"number" : "420777777777" ,
"request_quota_identification" : "127.0.0.1" ,
"language" : "es" ,
"code_length" : 6,
"channel" : {
"sms" : {
"sender_id" : "gText" ,
"sender_id_value" : "BulkGate"
}
}
}),
});
const result = await response.json ();
if (result.error ) {
throw new Error (`BulkGate : ${result.error } (${result.type })`);
}
console.log (result.data .id );
Java
java.net.http.HttpClient
import java. net. URI ;
import java. net. http. HttpClient ;
import java. net. http. HttpRequest ;
import java. net. http. HttpResponse ;
HttpClient client = HttpClient . newHttpClient ( ) ;
HttpRequest request = HttpRequest . newBuilder ( )
. uri ( URI . create ( "https://portal.bulkgate.com/api/1.0/otp/send" ) )
. header ( "Content-Type" , "application/json" )
. POST ( HttpRequest . BodyPublishers . ofString ( """
{
"application_id": 451,
"application_token": "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj",
"number": "420777777777",
"request_quota_identification": "127.0.0.1",
"language": "es",
"code_length": 6,
"channel": {
"sms": {
"sender_id": "gText",
"sender_id_value": "BulkGate"
}
}
}""" ) )
. build ( ) ;
HttpResponse < String > response = client. send ( request, HttpResponse . BodyHandlers . ofString ( ) ) ;
System . out. println ( response. statusCode ( ) + " " + response. body ( ) ) ;
Kotlin
kotlinlang.org
import java. net. URI
import java. net. http. HttpClient
import java. net. http. HttpRequest
import java. net. http. HttpResponse
val payload = """
{
"application_id": 451,
"application_token": "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj",
"number": "420777777777",
"request_quota_identification": "127.0.0.1",
"language": "es",
"code_length": 6,
"channel": {
"sms": {
"sender_id": "gText",
"sender_id_value": "BulkGate"
}
}
}
""" . trimIndent ( )
val request = HttpRequest . newBuilder ( )
. uri ( URI . create ( "https://portal.bulkgate.com/api/1.0/otp/send" ) )
. header ( "Content-Type" , "application/json" )
. POST ( HttpRequest . BodyPublishers . ofString ( payload) )
. build ( )
val response = HttpClient . newHttpClient ( ) . send ( request, HttpResponse . BodyHandlers . ofString ( ) )
println ( "${response.statusCode()} ${response.body()}" )
C# .NET
learn.microsoft.com
using System. Net. Http ;
using System. Text ;
var payload = """
{
"application_id": 451,
"application_token": "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj",
"number": "420777777777",
"request_quota_identification": "127.0.0.1",
"language": "es",
"code_length": 6,
"channel": {
"sms": {
"sender_id": "gText",
"sender_id_value": "BulkGate"
}
}
}
""" ;
using var client = new HttpClient ( ) ;
var response = await client. PostAsync (
"https://portal.bulkgate.com/api/1.0/otp/send" ,
new StringContent ( payload, Encoding . UTF8 , "application/json" ) ) ;
Console . WriteLine ( $"{(int) response.StatusCode} {await response.Content.ReadAsStringAsync()}" ) ;
C++ libcurl
curl.se/libcurl
#include <curl/curl.h>
#include <iostream>
#include <string>
static size_t collect ( char * data, size_t size, size_t nmemb, std :: string * out)
{
out-> append ( data, size * nmemb) ;
return size * nmemb;
}
int main ( )
{
const std :: string payload = R"json(
{
"application_id": 451,
"application_token": "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj",
"number": "420777777777",
"request_quota_identification": "127.0.0.1",
"language": "es",
"code_length": 6,
"channel": {
"sms": {
"sender_id": "gText",
"sender_id_value": "BulkGate"
}
}
}
)json" ;
CURL * curl = curl_easy_init ( ) ;
if ( curl == nullptr )
{
std :: cerr << "curl_easy_init failed\n" ;
return 1 ;
}
curl_slist * headers = curl_slist_append ( nullptr , "Content-Type: application/json" ) ;
std :: string body;
curl_easy_setopt ( curl, CURLOPT_URL, "https://portal.bulkgate.com/api/1.0/otp/send" ) ;
curl_easy_setopt ( curl, CURLOPT_HTTPHEADER, headers) ;
curl_easy_setopt ( curl, CURLOPT_POSTFIELDS, payload. c_str ( ) ) ;
curl_easy_setopt ( curl, CURLOPT_WRITEFUNCTION, collect) ;
curl_easy_setopt ( curl, CURLOPT_WRITEDATA, & body) ;
const CURLcode result = curl_easy_perform ( curl) ;
long status = 0 ;
curl_easy_getinfo ( curl, CURLINFO_RESPONSE_CODE, & status) ;
curl_slist_free_all ( headers) ;
curl_easy_cleanup ( curl) ;
if ( result != CURLE_OK)
{
std :: cerr << curl_easy_strerror ( result) << "\n" ;
return 1 ;
}
std :: cout << status << " " << body << "\n" ;
return 0 ;
}
Ruby
ruby-lang.org
require 'json'
require 'net/http'
uri = URI ('https://portal.bulkgate.com/api/1.0/otp/send' )
response = Net ::HTTP .post(uri, {
'application_id' => 451 ,
'application_token' => 'NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj' ,
'number' => '420777777777' ,
'request_quota_identification' => '127.0.0.1' ,
'language' => 'es' ,
'code_length' => 6 ,
'channel' => {
'sms' => {
'sender_id' => 'gText' ,
'sender_id_value' => 'BulkGate'
}
}
}.to_json, 'Content-Type' => 'application/json' )
puts "#{response.code} #{response.body}"
Bash cURL
curl.se
curl --request POST \
--url https://portal.bulkgate.com/api/1 .0 /otp/send \
--header 'Content-Type: application/json' \
--data '{"application_id": 451, "application_token": "NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj", "number": "420777777777", "request_quota_identification": "127.0.0.1", "language": "es", "code_length": 6, "channel": {"sms": {"sender_id": "gText", "sender_id_value": "BulkGate"}}}'
¿Le ha resultado útil esta página?
thumb_up Sí
thumb_down No
Gracias por su opinión.