Skip to content

Instantly share code, notes, and snippets.

@merkuriy
Last active August 8, 2019 14:12
Show Gist options
  • Save merkuriy/aa1c28da40df76640adb85b6b6d813eb to your computer and use it in GitHub Desktop.
Save merkuriy/aa1c28da40df76640adb85b6b6d813eb to your computer and use it in GitHub Desktop.
parseYandexMoneyResponceSMS
<?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));
}
@merkuriy
Copy link
Author

merkuriy commented Aug 5, 2019

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment