Ich habe gelegentlich den Fall gesehen, dass eine Bestellung aufgegeben wird, eine Autorisierung für die Zahlung auf der Kundenkarte erfolgt, der Kunde eine Bestellbestätigungs-E-Mail erhält - aber keine Bestellung bei Magento sales_flat_order
oder sales_flat_order_grid
.
Die Waffe der Wahl besteht darin, den Administrator zu verpflichten, die Zahlung im Gateway für ungültig zu erklären, und den Kunden zu bitten, sie erneut zu platzieren.
Wir haben jedoch alle Angebote, Angebotsartikel, Angebotszahlungen und Angebotsadressen. Theoretisch ist diese Bestellung gültig, schließlich haben wir eine Autorisierung und der Kunde hat eine Bestell-E-Mail. Der Fehler trat einige Zeit nach der Generierung der Bestell-E-Mail auf, die einen Rollback verursachte (die aktuelle Arbeitstheorie).
Ich habe ein einmaliges Testskript erstellt, um dieses Zitat mithilfe eines Sandbox-Gateways zu konvertieren. Ich habe jedoch Probleme beim Generieren der Zahlung. Ich habe zu verwenden versucht checkmo
, free
, authorizenet
, alle die gleiche Ausnahme zurück:
PHP Fatal error: Uncaught exception 'Mage_Core_Exception' with message 'Cannot retrieve payment method instance.' in /var/www/vhosts/magento/app/Mage.php:563
Stack trace:
#0 /var/www/vhosts/magento/app/code/core/Mage/Payment/Model/Info.php(83): Mage::throwException('Cannot retrieve...')
Siehe meinen Code unten . Feedback erwünscht.
<?php
//.... stuff
$quote = Mage::getModel('sales/quote')->load(745);
$convert = Mage::getModel('sales/convert_quote');
$order = $convert->toOrder($quote);
$order->addressToOrder($quote->getAddress(),$order);
foreach($quote->getAllItems() as $item){
$orderItem = $convert->itemToOrderItem($item);
if ($item->getParentItem()) {
$orderItem->setParentItem($order->getItemByQuoteItemId($item->getParentItem()->getId()));
}
$order->addItem($orderItem);
}
$data = array(
'method' => 'authorizenet',
'cc_type' => 'VI',
'cc_number' => '4111111111111111',
'cc_exp_month' => '1',
'cc_exp_year' => (date('Y') + 6),
'cc_cid' => '444'
);
$quote->getShippingAddress()->setPaymentMethod('authorizenet');
$quote->getShippingAddress()->setCollectShippingRates(true);
$payment = $quote->getPayment();
$payment->importData($data);
$quote->save();
$payment = $convert->paymentToOrderPayment($quote->getPayment());
$order->setPayment($quote->getPayment());
$message = '[Notice] - Order converted from quote manually';
$order->addStatusToHistory($order->getStatus(), $message);
$order->place();
$order->save();
$quote->setIsActive(false)->save();