This repository has been archived by the owner on Jul 5, 2021. It is now read-only.
/
InfobipTransport.php
125 lines (111 loc) · 3.41 KB
/
InfobipTransport.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<?php
/**
* Infobip transport
*
* @author Maxim Petrovich <m.petrovich@artox.com>
*/
namespace ArtoxLab\Component\Notifier\Bridge\Infobip;
use Symfony\Component\Notifier\Exception\LogicException;
use Symfony\Component\Notifier\Exception\TransportException;
use Symfony\Component\Notifier\Message\MessageInterface;
use Symfony\Component\Notifier\Transport\AbstractTransport;
use Symfony\Component\Notifier\Message\SmsMessage;
use Symfony\Contracts\HttpClient\HttpClientInterface;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
class InfobipTransport extends AbstractTransport
{
public const HOST = 'api.infobip.com';
/**
* Login
*
* @var string
*/
private string $token;
/**
* Sender name
*
* @var string
*/
private string $from;
/**
* SmsLineTransport constructor.
*
* @param string $token Password
* @param string $from Sender name
* @param HttpClientInterface|null $client Http client
* @param EventDispatcherInterface|null $dispatcher Event dispatcher
*/
public function __construct(
string $token,
string $from,
HttpClientInterface $client = null,
EventDispatcherInterface $dispatcher = null
) {
$this->token = $token;
$this->from = $from;
parent::__construct($client, $dispatcher);
}
/**
* Send message
*
* @param MessageInterface $message Message
*
* @return void
*/
protected function doSend(MessageInterface $message): void
{
if (false === $message instanceof SmsMessage) {
throw new LogicException(sprintf('The "%s" transport only supports instances of "%s" (instance of "%s" given).', __CLASS__, SmsMessage::class, get_debug_type($message)));
}
$endpoint = sprintf('https://%s/sms/2/text/advanced', $this->getEndpoint());
$response = $this->client->request(
'POST',
$endpoint,
[
'headers' => [
'Authorization' => 'App ' . $this->token,
],
'json' => [
'messages' => [
[
'from' => $this->from,
'destinations' => [
[
'to' => $message->getPhone(),
],
],
'text' => $message->getSubject(),
],
],
],
]
);
if (200 !== $response->getStatusCode()) {
$error = $response->toArray(false)['requestError']['serviceException'];
throw new TransportException(
'Unable to send the SMS: ' . $error['text'] . sprintf(' (id %s).', $error['messageId']),
$response
);
}
}
/**
* Supports
*
* @param MessageInterface $message Message
*
* @return bool
*/
public function supports(MessageInterface $message): bool
{
return $message instanceof SmsMessage;
}
/**
* To string
*
* @return string
*/
public function __toString(): string
{
return sprintf('infobip://%s?from=%s', $this->getEndpoint(), $this->from);
}
}