Как правильно организовать внутренний баланс пользователей?
1) Как написали в первом комментарии: делать операции в транзакциях, вести логи транзакций.
2) Двойная запись (https://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%BE%D..., вот лекция с описанием https://vimeo.com/117154510.
3) У денежных систем (Paypal и т.п.) бывают разные способы ответа вашем сайту о том, что пользователь действительно оплатитил счет, так вот, никогда не нужно использовать систему, когда подтверждением является редирект пользователя на страницу вашего сайта с хешом операции. Ваш сайт должен отправлять запрос на проверку операции независимо от пользователя.
4) Ведение логов действий пользователей (когда вы видите, что по логам пользователь 5 раз пополнил баланс на общую сумму 2000 рублей, а на реальный счет вам пришло 400 рублей, то это повод бить тревогу).
5) Бекапы
Был один подводный камень. У человека была большая транзакция, но в определенном месте была отключена валидация save(false). Поскольку валидации не было, юзер мог заходить и делать двойной запрос. Отправляя деньгу при этом оставляя её у себя. К сожалению не могу найти эту тему на тостере. Решилось это более жесткой оберткой данных. Но какой метод использовал не вспомню, увы.