Сделали правильно с редиректами.
Только единственное уточнение - заказ создается с нулевым статусом, а метод confirm подтверждает этот заказ (переводит в статус больше 0) причем сделает это только в случае, если у заказа статус 0, кстати в этот момент и отсылаются письма о заказе.
По второй части - это не баг, а фича опенкарта, чуть ниже - один из ответов почему так сделано.
У себя в Simple я решил этот момент немного иначе, чем в вкмоде, плюс сделал кое-какую проверку, которой в этом вкмоде нет.
А именно может возникнуть такая ситуация (опять же зависит от реализации модулей оплаты)
Клиент создал заказ из 5 товаров на сумму 5000 рублей, номер заказа 20, затем нажал кнопку подтвердить и ушел на оплату заказа номер 20 на сумму 5000 рублей
В другой вкладке открыл страницу корзины, поменял товары, изменив количество/сумму (например стало 6000), прошел шаги заказа, заказ у него пересохранился под номером 20, но в первом окне у него уже инициирована оплата заказа 20 на 5000, которую он может провести. Соответственно без проверки модулем оплаты суммы заказа и суммы оплаты заказ успешно подтвердится, а если даже не подтвердится, то уже добавит головной боли, так как деньги фактически спишутся.
Ситуация конечно гипотетическая, но не невероятная, и поэтому защиту от дурака исключать не стоит.
И поэтому опенкарт пошел по такому пути.