Hromadné potvrzení o doručení příchozích zpráv
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 |
| to | Telefonní číslo příjemce v mezinárodním formátu bez "+" (např. 420777777777) | Ne |
| price | Cena SMS v kreditech | Ne |
| channel | Kanál použitý k doručení zprávy | 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();