1) Вы в своей БД заводите запись: пользователь P хочет пополнить баланс на сумму N. У записи должен быть ID.
2) Перенаправляете пользователя на форму оплаты суммы N, передавая также в скрытом поле ID (эта форма обычно - у платёжной системы).
3) После оплаты, платёжная система уведомит вас, что оплата по ID прошла (вызовом по заданному вами URL-у). Для безопасности, вы можете проверять у себя в скрипте, что вызов произошёл именно со стороны платёжной системы путём, например, проверки по IP (порой он оговаривается при подключении к платёжке). Либо же платёжка будет передавать секретный код, либо ещё как-то (опять же - зависит от платёжки).
4) Вы в БД помечаете транзакцию с переданным вам ID как выполненную и накидываете пользователю деньги в вашей системе.