Skip to content

Commit 34a172e

Browse files
authored
Messages validation added to remove a leading plus for the developer, but only valid E164 can be sent (#507)
1 parent 24bcc1a commit 34a172e

File tree

2 files changed

+72
-1
lines changed

2 files changed

+72
-1
lines changed

src/Messages/Client.php

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,14 @@ public function getAPIResource(): APIResource
2323

2424
public function send(BaseMessage $message): ?array
2525
{
26-
return $this->getAPIResource()->create($message->toArray());
26+
$messageArray = $message->toArray();
27+
28+
if ($this->isValidE164($messageArray['to'])) {
29+
$messageArray['to'] = $this->stripLeadingPlus($messageArray['to']);
30+
return $this->getAPIResource()->create($messageArray);
31+
};
32+
33+
throw new \InvalidArgumentException('Number provided is not a valid E164 number');
2734
}
2835

2936
public function updateRcsStatus(string $messageUuid, string $status): bool
@@ -36,4 +43,22 @@ public function updateRcsStatus(string $messageUuid, string $status): bool
3643
}
3744
return false;
3845
}
46+
47+
protected function stripLeadingPlus(string $phoneNumber): string
48+
{
49+
if (str_starts_with($phoneNumber, '+')) {
50+
return substr($phoneNumber, 1);
51+
}
52+
53+
return $phoneNumber;
54+
}
55+
56+
public function isValidE164(string $phoneNumber): bool
57+
{
58+
$phoneNumber = $this->stripLeadingPlus($phoneNumber);
59+
60+
$regex = '/^\+?[1-9]\d{1,14}$/';
61+
62+
return preg_match($regex, $phoneNumber) === 1;
63+
}
3964
}

test/Messages/ClientTest.php

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1243,4 +1243,50 @@ public function stickerTypeProvider(): array
12431243
['caption', 'this is not valid', false]
12441244
];
12451245
}
1246+
1247+
public function testWillSendValidE164Number()
1248+
{
1249+
$message = new SMSText('447700900000', '16105551212', 'Reticulating Splines');
1250+
1251+
$this->vonageClient->send(Argument::that(function (Request $request) {
1252+
$this->assertRequestJsonBodyContains('to', '447700900000', $request);
1253+
$this->assertEquals('POST', $request->getMethod());
1254+
1255+
return true;
1256+
}))->willReturn($this->getResponse('sms-success', 202));
1257+
$result = $this->messageClient->send($message);
1258+
$this->assertIsArray($result);
1259+
$this->assertArrayHasKey('message_uuid', $result);
1260+
}
1261+
1262+
public function testWillSendValidE164NumberWithPlus()
1263+
{
1264+
$message = new SMSText('+447700900000', '16105551212', 'Reticulating Splines');
1265+
1266+
$this->vonageClient->send(Argument::that(function (Request $request) {
1267+
$this->assertRequestJsonBodyContains('to', '447700900000', $request);
1268+
$this->assertEquals('POST', $request->getMethod());
1269+
1270+
return true;
1271+
}))->willReturn($this->getResponse('sms-success', 202));
1272+
$result = $this->messageClient->send($message);
1273+
$this->assertIsArray($result);
1274+
$this->assertArrayHasKey('message_uuid', $result);
1275+
}
1276+
1277+
public function testWillErrorOnInvalidE164Number()
1278+
{
1279+
$this->expectException(\InvalidArgumentException::class);
1280+
$message = new SMSText('00447700900000', '16105551212', 'Reticulating Splines');
1281+
1282+
$result = $this->messageClient->send($message);
1283+
}
1284+
1285+
public function testWillErrorOnInvalidE164NumberWithPlus()
1286+
{
1287+
$this->expectException(\InvalidArgumentException::class);
1288+
$message = new SMSText('+00447700900000', '16105551212', 'Reticulating Splines');
1289+
1290+
$result = $this->messageClient->send($message);
1291+
}
12461292
}

0 commit comments

Comments
 (0)