Это может помочь вам.
Пример из одного из наших модулей:
$order = Mage::getModel('sales/order')->loadByIncrementId($incrementId);
if ($order->getTotalPaid() == 0) {
$invoice = $order->prepareInvoice();
$invoice->register()->capture();
Mage::getModel('core/resource_transaction')
->addObject($invoice)
->addObject($invoice->getOrder())
->save();
$order->save();
Этот параметр проверяет, не был ли еще зарегистрирован платеж (пользователь может отправить несколько успешных запросов с помощью многократного нажатия), затем создает счет, регистрирует его, получает и сохраняет счет и заказы.
РЕДАКТИРОВАТЬ 1
private function markOrderPayd($incrementId, $status) {
$order = Mage::getModel('sales/order')->loadByIncrementId($incrementId);
if ($order->getTotalPaid() == 0) {
...
$order->save();
$invoice = $order->prepareInvoice();
$invoice->register()->capture();
...
Mage::getModel('core/resource_transaction')
->addObject($invoice)
->addObject($invoice->getOrder())
->save();
$order->save();
...
} else {
...
$order->save();
}
}
Полагаю, у вас нет чека, поэтому генерируются 2 счета.