Convertir un devis personnalisé en commande - "Impossible de récupérer l'instance de mode de paiement"

10

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_orderou 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();
philwinkle
la source

Réponses:

7

Vous envoyez la commande

 $quote->getPayment()

votre code devrait ressembler à ceci

...

$payment = $convert->paymentToOrderPayment($quote->getPayment());

$order->setPayment($payment);

...
Jeffrey L. Roberts
la source
Vous avez raison - c'est tout. Bon appel.
philwinkle
Je reçois une erreur PHP Fatal error: Uncaught exception 'Mage_Core_Exception' with message 'The requested Payment Method is not available.' in /var/www/html/app/Mage.php:594J'ai activé le mode de paiement en tant que bon de commande et je souhaite créer une nouvelle commande à coût nul sans mode de paiement.
Rahul