J'ai vu à l'occasion le cas où une commande est passée, une autorisation de paiement est faite sur la carte client, le client reçoit un email de confirmation de commande - mais aucune commande n'existe dans Magento's sales_flat_order
ou sales_flat_order_grid
.
L'arme de choix ici est d'exiger que l'administrateur annule le paiement dans la passerelle, demande au client de le remplacer.
Cependant, nous avons tous les devis, les articles de devis, le paiement de devis, l'adresse de devis. En théorie, cette commande est valide, après tout, nous avons l'autorisation et le client a un e-mail de commande. L'erreur s'est produite quelque temps après la génération de l'e-mail de commande qui a provoqué un retour en arrière (la théorie de travail actuelle).
J'ai créé un script de test unique pour convertir cette citation à l'aide d'une passerelle sandbox. Cependant, j'ai du mal à générer le paiement. Je l' ai essayé d'utiliser checkmo
, free
, authorizenet
, retourner tous la même exception:
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...')
Voir mon code ci-dessous . Vos commentaires sont les bienvenus.
<?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();