Last active
August 8, 2019 14:12
-
-
Save merkuriy/aa1c28da40df76640adb85b6b6d813eb to your computer and use it in GitHub Desktop.
parseYandexMoneyResponceSMS
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Разбирает текст СМС ответного сообщения от Yandex Money | |
* с секретным кодом подтверждения. | |
* | |
* Вслучае успешного разбора сообщения | |
* возвращает массив с ключами secret, amount и id | |
* Иначе возаращает FALSE. | |
* | |
* @param string $message Текст сообщения | |
* @return array|bool Массив [secret, amount, id] или FALSE | |
*/ | |
function parseYandexMoneyResponceSMS (string $message) { | |
/* | |
## Номер кошелька (id): | |
11–20 цифр. | |
https://kassa.yandex.ru/tech/payout/wallet.html | |
С резервом на будущее можно поставить до 25 символов. | |
Начинается не с 0. | |
## Сумма (amount): | |
Целое число или число с плавающей точкой 0–999999. | |
В конце должен стоять постфикс названия валюты «рубль» как на русском, так и на английском. | |
## Пароль (secret): | |
4–6 цифр. | |
*/ | |
// parse amount | |
$result = preg_match( | |
'/(\D|\A)(0[,.]\d{1,2}|([1-9]\d{0,5}([,.]\d{1,2})?))\s?(р|Р|p|P|r|R)(уб|УБ|ub|UB)?([.,\s]|л|\z)/', | |
$message, | |
$matches, | |
PREG_OFFSET_CAPTURE | |
); | |
if ($result !== 1) { | |
return false; | |
} | |
// simple normalize format | |
$amount = str_replace(',', '.', $matches[2][0]); | |
// delete amount | |
// Удаляем amount из тела сообщения для того, чтобы не мешало искать секретный код | |
$message = substr($message, 0, $matches[0][1]) . substr($message, $matches[0][1] + strlen($matches[0][0])); | |
// parse id | |
$result = preg_match( | |
'/(\D|\A)([1-9]\d{10,24})(\D|\z)/', | |
$message, | |
$matches | |
); | |
if ($result !== 1) { | |
return false; | |
} | |
$id = $matches[2]; | |
// parse secret | |
$result = preg_match( | |
'/(\D|\A)(\d{4,5})(\D|\z)/', | |
$message, | |
$matches | |
); | |
if ($result !== 1) { | |
return false; | |
} | |
$secret = $matches[2]; | |
return [ | |
'secret' => $secret, | |
'amount' => $amount, | |
'id' => $id | |
]; | |
} | |
$msgs = [ | |
"Другое сообщение", | |
"Недостаточно средств.", | |
"Пароль: 2098 | |
Спишется 3015,08р. | |
Перевод на счет | |
4100119545336890001000200 | |
.", | |
"Пароль: 2098 | |
Спишется 3015.08 р. | |
Перевод на счет 410011954533689", | |
"Вы переводите на этот счёт 41001195488 | |
Итого 300060,90 рублей | |
Код 4848", | |
"Никому не говорите пароль! Его спрашивают только мошенники. | |
Пароль: 19545 | |
Перевод на счет 410011954533689 | |
Вы потратите 9246р.", | |
"Никому не говорите пароль! Его спрашивают только мошенники. | |
Пароль: 67358 | |
Перевод на счет 410011954533689 | |
Вы потратите 5025,63р.", | |
"41001195488 | |
Вы переводите на этот счёт | |
3000.9 руб | |
Пароль | |
4848", | |
"Пароль: 9141 | |
Спишется 0,92 р, | |
Перевод на счет 410011954533689", | |
"Код 9141, к списанию 500 руб, перевод на счет 410011954533689.", | |
"Код 9141 Реквизиты получателя 410011954533689 Спишется 500 рублей" | |
]; | |
foreach ($msgs as $msg) { | |
echo "\n\n«\n$msg\n»\n"; | |
var_dump(parseYandexMoneyResponceSMS($msg)); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Run/Test: tehplayground.com/M7xVZBRiaEC9tLUD