не уверен что это верный чат где я могу расписывать как это сделать правильно, всеравно обосрут.
но конкретно в этом куске неверно буквально всё.
капитанские комментарии - например. что за 4 символа? это магия? или это длина пинкода? я должен догадываться что ли.
работа с голым реквестом - я бы взял библиотеку http foundation чтобы работать с объектом Request а не массивом.
типизация входных параметров - создай дто-шку отражающую ожидаемые данные, с нужными полями и типами - да не, нахуй, просто будем в массиве читать-писать.
множество точек выхода - готовь результат, в конце отдай без множества return посредине "метода"
хотя конечно это не метод, это тело скрипта, а значит исполняется просто в глобальном контексте, что тоже хуево.
чем это хуево - тем что человеку не хватает переменных и он начал добавлять индексы (долбоёб).
внедрение зависимостей - нахуй тоже не нужно, просто напишем глобальную функцию и пусть она что то там хуячит через какие то апи.
строки какие то для сравнения использовать - тоже что за хуйня, юзай константы (авось еще где пригодятся).
йода стайл не завезли - тоже ошибка.
из понятного - логи на каждом шагу - ну ок, блять, через функцию, ладно уж.
просто месиво из кода, которое "да, работает, да можно разобраться" но слишком "не так"