Вообще, неплохо было бы подстраховаться и на серверной стороне: например, генерировать уникальный ключ платежа, и если он дублирует предыдущий, игнорировать.
Дерево можно обойти без рекурсии. Достаточно использовать стек и хранить в нём необходимые данные (указатель на текущий узел etc). Собственно, то же самое происходит при рекурсивном обходе, но при этом совершается ещё много лишних действий.
Шаблонизаторы шаблонизировали-шаблонизировали шаблоны, да не вышаблонизировали :)