/check_yandex_purse

Check Yandex Purse - алгоритм проверки номера счета в системе Яндекс.Деньги

Primary LanguagePHPMIT LicenseMIT

Check Yandex Purse

Выполняет проверку номера счета в системе Яндекс.Деньги по заданному алгоритму проверки действительности строки, представляющей номер счета.

Номер счета в Системе имеет следующий формат NXYZ (пример — 41001123456789),где:

  • N — количество цифр в коде процессингового центра.
  • X — код процессингового центра в Системе. Возможные значения: 1001 — процессинговый центр для валюты 643 (рубли); 1003 — процессинговый центр для валюты 10643 (тестовая валюта, демо-рублики).
  • Y — номер счета в процессинговом центре Системы.
  • последние две цифры это контрольная сумма, которая вычисляется специальной функцией от предшествующей части номера счета, и позволяет выявлять случайные ошибки при вводе номера счета.

Для процессингового центра 1001 минимально возможная длина счета 11 цифр (1 + 4 + 4 + 2), максимально возможная длина счета 26 цифр (1 + 4 + 19 + 2). Длина существующих на данный момент номеров счетов варьируется от 11 до 16 цифр.

Алгоритм проверки действительности строки, представляющей номер счета

Под разбором строки будем понимать определение X, Y и Z по заданному E=NXYZ.

  • Если строка E пуста или содержит символы, отличные от цифр, то разбор невозможен и строка недействительна.
  • Если первая цифра E равна 0, то разбор невозможен и строка недействительна, в противном случае N = первая цифра E.
  • Если длина E меньше N+4, то разбор невозможен и строка недействительна.
  • Если две последние цифры строки E равны "00", то строка недействительна.
  • Если выполнены условия 1-4, то строка E может быть разобрана и: X = N цифр E, начиная со второй; Z = две последних цифры E; Y = оставшиеся цифры E.
  • Если длина Y больше 20, то строка недействительна.
  • Если AccountNumberRedundancy (X,Y) не равно Z, то строка недействительна.

Описание функции AccountNumberRedundancy

При вычислении функции AccountNumberRedundancy строка X записывается как последовательность 10 десятичных цифр: X = X9 X8 … X0 Пример: для X = 67458

X0 = 8 X1 = 5 X2 = 4 X3 = 7	X4 = 6 X5 = 0 X6 = 0 X7 = 0 X8 = 0 X9 = 0

При вычислении функции AccountNumberRedundancy строка Y записывается как последовательность 20 десятичных цифр: Y = Y19 Y18 … Y0 Пример: для Y = 3285076

Y0 = 6 Y1 = 7 Y2 = 0 Y3 = 5	Y4 = 8 Y5 = 2 Y6 = 3
Y7 = 0 Y8 = 0 Y9 = 0 Y10 = 0 Y11 = 0 Y12 = 0 Y13 = 0
Y14 = 0 Y15 = 0 Y16 = 0 Y17 = 0 Y18 = 0 Y19 = 0

Важно! Нули слева в X и Y, которые являются незначащими с точки зрения десятичной записи X и Y, пропускать НЕЛЬЗЯ.

После этого функции AccountNumberRedundancy(X,Y) вычисляется следующим образом:

[T0x(13)2 + T1x(13)3 + … + T19x(13)21 + T20x(13)22 + T21x(13)23 +… + T29x(13)31] mod 99 + 1

, где:

  • Ti = Yi, если Yi != 0; и Ti = 10, если Yi = 0 (I=0,1,…,19)
  • Ti = X(i-20), если X(i-20) != 0; и Ti = 10, если X(i-20) = 0 (I=20,21,…,29)
  • То есть все 0 заменяются на 10.

При этом ответ представляет собой строку из ДВУХ десятичных цифр (например, если получилось число 5, то в ответе нужно записать ‘05’).