Potvrzení o doručení a příchozí SMS (odpovědi)
Chcete-li dostávat DLR záznamy do aplikace, stačí nastavit na portálu url adresu (viz. obrázek níže). Potvrzení o doručení jsou zasílány na url adresu metodou HTTP POST. Formát (Content-Type) odesílaných dat je application/json
. Podívejte se na tabulku parametrů .
Potvrzení o doručení: parametry
NÁZEV PARAMETRU HODNOTA POVINNÝ
status Podívejte se na tabulku o potvrzení o stavu doručení Ano
smsID Unikátní smsID zprávy Ne
price Cena SMS v kreditech Ne
date Čas odeslání a doručení (časová zóna CET), např.: 1812141317;1812141318 (14. prosince 2018, 13:17 a 14. prosince 2018, 13:18) Ne
from Pouze pokud je status=10, ID odesílatele v příchozí SMS v mezinárodním formátu Ne
message Pouze pokud je status=10, Text příchozí SMS v kódování UTF-8 Ne
Ukázka požadavku
POST example.php HTTP/1.1
Host : portal.bulkgate.com
Content-Type : application/json
Cache-Control : no-cache
[
{
"status" :"1" ,
"smsID" :"3t2563af3ff285" ,
"price" :"0.71" ,
"date" :"1904111007;1904111011"
},
{
"status" :"2" ,
"smsID" :"2t2563af3ff285" ,
"price" :"0.71" ,
"date" :"1904111007;1904111011"
},
{
"status" :"10" ,
"from" :"420777777777" ,
"text" :"text odpovědi" ,
}
]
Potvrzení o doručení: stav
STAV POPIS
1 SMS úspěšně doručena
2 SMS ve vyrovnávací paměti na SMSC. SMS bude doručena později. Příjemce není k dispozici
3 SMS nebyla doručena. Neznámý/nedostupný příjemce
10 Příchozí SMS nebo SMS odpověď (kontaktujte nás pro více informací)
13 Zpráva přečtena (pouze Viber)
Příklad implementace skriptu
<?php declare (strict_types=1 );
class Delivery
{
const STATUS_LIST = [
0 => 'unknown' ,
1 => 'delivered' ,
2 => 'unavailable' ,
3 => 'not_delivered'
];
public function __construct ()
{
try
{
foreach ($this ->loadInput() as $key => $row)
{
if ($row['type' ] === 'answer' )
{
$this ->inbox($row['from' ], $row['message' ]);
}
else
{
$this ->delivery($row['smsID' ], $row['status' ], $row['price' ], $row['send_time' ], $row['delivery_time' ]);
}
}
}
catch (\Exception $e)
{
$this ->log($e->getMessage(), 'error' );
exit (1 );
}
exit (0 );
}
public function inbox (string $from, string $message) : void
{
$this ->log(sprintf('From: [%s] Message: [%s]' , $from, $message), 'inbox' );
}
public function delivery (string $sms_id, string $status, float $price, \DateTime $send_time, \DateTime $delivery_time) : void
{
$this ->log(sprintf('Message ID [%s] is in the status [%s], Price: [%f], Time of sending: [%s], Delivery time: [%s]' , $sms_id, $status, $price, $send_time->format('c' ), $delivery_time->format('c' )), 'delivery' );
}
private function log (string $message, string $type) : void
{
$message = '[' .date('Y-m-d H-i-s' ).'] ' . $message . PHP_EOL;
echo $message;
file_put_contents(__DIR__ ."/$type.log" , $message,FILE_APPEND);
}
private function loadInput () : iterable
{
$json = file_get_contents("php://input" );
if ($json && is_string($json))
{
$data = json_decode($json, true , 512 , JSON_BIGINT_AS_STRING);
if ($error = json_last_error())
{
throw new \Exception (json_last_error_msg());
}
if (is_array($data))
{
foreach ($data as $key => $row)
{
if ((int) ($row['status' ] ?? 0 ) === 10 )
{
yield $key => [
'type' => 'answer' ,
'from' => $row['from' ] ?? '' ,
'message' => $row['message' ] ?? ''
];
}
else
{
[$send_time, $delivery_time] = array_pad(explode(';' , $row['date' ] ?? '0;0' ), 2 , 0 );
yield $key => [
'type' => 'dlr' ,
'smsID' => $row['smsID' ] ?? '' ,
'status' => self ::STATUS_LIST[(int) ($row['status' ] ?? 0 )] ?? 'unknown' ,
'price' => (float) $row['price' ] ?? 0.0 ,
'send_time' => new \DateTime('@' .(string) (int) $send_time),
'delivery_time' => new \DateTime('@' .(string) (int) $delivery_time),
];
}
}
}
else
{
throw new \Exception ('Invalid input' );
}
}
else
{
throw new \Exception ('Invalid input' );
}
}
};
new \Delivery();