Paypal und Onestepcheckout

Die Problemstellung: Wir verwenden den Onestepcheckout von Magestore und haben die Gift Wrap Funktionalität (Geschenkverpackung) zur Transportversicherung umgewidmet, die man damit optional zu jeder Bestellung hinzuwählen kann.

Die Kosten für die Transportversicherung werden jedoch im Rahmen der Zahlart "Paypal" nicht standardmäßig über die Zahlungsschnittstelle übermittelt - mit der Folge, dass Magento die Bestellung nicht fehlerfrei abwickeln kann und diese dann als "Suspected Fraud", also als Betrugsversuch klassifiziert.
Diesen Sachverhalt kann man lösen, in dem man den Betrag für die Transportversicherung als zusätzlichen Artikel an Paypal übermittelt:

Zuerst müssen wir die Session-Werte des Checkout-Prozesses zwischenspeichern, um auf diese bei der Übermittlung an Paypal zugreifen zu können. Dies realisieren wir durch die Anpassung der Datei

\app\code\local\Magestore\Onestepcheckout\Model\Observer.php

In der Funktion "orderPlaceAfter($observers)" fügen wir nach der Zeile

if($giftwrap || $giftwrapAmount){

diesen Code ein:

$session->setData('onestepcheckout_giftwrap_helper_temp', 1);
$session->setData('onestepcheckout_giftwrap_amount_helper_temp', $giftwrapAmount*100);

Nachdem wir die Beträge nun zwischengespeichert haben, erstellen wir einen Override mit der Datei

\app\code\local\Mage\Paypal\Model\Cart.php

Hier suchen wir die Funktion "_render()" und fügen nach der Anweisung

if ($this->_isShippingAsItem && (float)$this->_totals[self::TOTAL_SHIPPING]) {
$this->addItem(Mage::helper('paypal')->__('Shipping'), 1, (float)$this->_totals[self::TOTAL_SHIPPING],
$shippingItemId
);
}

folgenden Code ein, um den Artikel hinzuzufügen:

$session = Mage::getSingleton('checkout/session');
if($session->getData('onestepcheckout_giftwrap_helper_temp') === 1) {
$giftwrapAmount = $session->getData('onestepcheckout_giftwrap_amount_helper_temp');
$session->unsetData('onestepcheckout_giftwrap_helper_temp');
$session->unsetData('onestepcheckout_giftwrap_amount_helper_temp');
$giftwrapAmount_net = round($giftwrapAmount/100,2);
$this->addItem(Mage::helper('paypal')->__('Transportversicherung'), 1, $giftwrapAmount_net,'transport_insurance');
}

Auf ähnliche Weise lassen sich so auch Beträge hinzufügen, die aus Preisregeln entstehen, wie zum Beispiel ein Mindermengenzuschlag, der bei niedrigen Warenkörben aufgeschlagen wird. Getestet in Magento 1.7.0.2.

... zurück zum Blog