/
BulkGate Entwicklerdokumentation
/
OTP API
/
OTP-Beispiele
OTP-Beispiele
Beispiele für die Verwendung der OTP API . Ein Code wird über send gesendet, über verify geprüft und bei Bedarf über resend erneut gesendet — alle drei arbeiten mit der id, die die erste Anfrage zurückgibt.
Kleinstmögliche Anfrage
Pflicht sind nur die Nummer des Empfängers und request_quota_identification — die Identifikation des Anfragenden, an die das Minutenkontingent gebunden ist. Wir empfehlen dessen IP-Adresse. Ohne channel wird der Code per SMS versendet.
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"
}
Eigenes Codeformat
code_type bestimmt die Zeichen (int, string, combined), code_length die Länge (4–100). language wählt die Sprache der Nachricht aus 100 unterstützten ISO-Codes.
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" : "de"
}
Automatisches Ausfüllen des Codes im Web (WebOTP)
developer.mozilla.org/WebOTP_API
domain im SMS-Objekt hängt eine Zeile an, dank der der Browser den Code selbst anbieten kann. Die Domain muss mit der Website übereinstimmen, auf der der Code eingegeben wird.
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"
}
}
}
Kanalkaskade
Die Reihenfolge der Schlüssel ist die Reihenfolge der Kaskade. Hier wird zuerst Viber versucht, nach 60 Sekunden ohne Zustellung RCS und zuletzt SMS. Eine expiration unter 60 wird ignoriert.
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"
}
}
}
Vorgelesener Code
Text2Voice liest den Code vor. repeat wiederholt ihn während des Anrufs, damit sich der Empfänger ihn notieren kann.
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" : "de" ,
"prefer_gender" : "female" ,
"repeat" : 2
}
}
}
Limits gegen Missbrauch
trials_available_* begrenzt, wie oft ein Code erneut gesendet und verifiziert werden kann, daily_limit die Anzahl der Anfragen pro 24 Stunden. daily_limit_country lässt zusätzlich nur die aufgeführten Länder zu — jedes andere schlägt mit country_is_disabled fehl.
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" : {
"de" : 100,
"at" : 50
} ,
"expiration" : 600
}
Verifizierung des Codes
id ist der Wert aus der Antwort auf send. Die Antwort liefert verified; false bedeutet einen ungültigen Code, keine fehlgeschlagene Anfrage.
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"
}
Erneutes Senden des Codes
Erzeugt für dieselbe Anfrage einen neuen Code und sendet ihn über denselben Kanal. Zwischen zwei erneuten Sendungen müssen 60 Sekunden liegen.
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"
}
Codebeispiele
Nachfolgend dieselbe Anfrage send in verschiedenen Programmiersprachen:
Die Bedeutung der einzelnen Parameter ist in der Spezifikation beschrieben.
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' => 'de' ,
'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 hat nicht geantwortet.' );
}
$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' => 'de' ,
'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' => 'de' ,
'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": "de", "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' : 'de' ,
'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" : "de" ,
"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": "de",
"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": "de",
"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": "de",
"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": "de",
"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' => 'de' ,
'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": "de", "code_length": 6, "channel": {"sms": {"sender_id": "gText", "sender_id_value": "BulkGate"}}}'
War diese Seite hilfreich?
thumb_up Ja
thumb_down Nein
Vielen Dank für Ihr Feedback.