2016-07-11 5 views
4

ich entwickle hybrid mobile Anwendung für Magento Website. Jetzt muss ich Programme programmatisch erstellen. Ich bin in der Lage, paypal zu integrieren und paypal Erfolgsantwort zu bekommen. Sobald ich eine Paypal-Antwort bekommen habe, poste ich Daten auf Magento. hier bekomme ich Fehler alsPaypal Buchungsfehler in Magento Auftragserstellung programmatisch

Uncaught exception 'Mage_Core_Exception' with message 'PayPal gateway has rejected request. 
Invalid token (#10410: Invalid token).' in public_html/app/code/core/Mage/Paypal/Model/Api/Nvp.php:1062 

Unten ist meine Bestellung Erstellung Code.

<?php 

// Mage Path 
require_once(dirname(__FILE__).'/../app/Mage.php'); 
umask(0); 
// Initialize Magento ... 
Mage::app("default"); 

$id=11; // get Customer Id 
$customer = Mage::getModel('customer/customer')->load($id); 

$transaction = Mage::getModel('core/resource_transaction'); 
$storeId = $customer->getStoreId(); 
$reservedOrderId = Mage::getSingleton('eav/config')->getEntityType('order')->fetchNewIncrementId($storeId); 

$order = Mage::getModel('sales/order') 
->setIncrementId($reservedOrderId) 
->setStoreId($storeId) 
->setQuoteId(0) 
->setGlobal_currency_code('USD') 
->setBase_currency_code('USD') 
->setStore_currency_code('USD') 
->setOrder_currency_code('USD'); 
//Set your store currency USD or any other 

// set Customer data 
$order->setCustomer_email($customer->getEmail()) 
->setCustomerFirstname($customer->getFirstname()) 
->setCustomerLastname($customer->getLastname()) 
->setCustomerGroupId($customer->getGroupId()) 
->setCustomer_is_guest(0) 
->setCustomer($customer); 

// set Billing Address 
$billing = $customer->getDefaultBillingAddress(); 
$billingAddress = Mage::getModel('sales/order_address') 
->setStoreId($storeId) 
->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_BILLING) 
->setCustomerId($customer->getId()) 
->setCustomerAddressId($customer->getDefaultBilling()) 
->setCustomer_address_id($billing->getEntityId()) 
->setPrefix($billing->getPrefix()) 
->setFirstname($billing->getFirstname()) 
->setMiddlename($billing->getMiddlename()) 
->setLastname($billing->getLastname()) 
->setSuffix($billing->getSuffix()) 
->setCompany($billing->getCompany()) 
->setStreet($billing->getStreet()) 
->setCity($billing->getCity()) 
->setCountry_id($billing->getCountryId()) 
->setRegion($billing->getRegion()) 
->setRegion_id($billing->getRegionId()) 
->setPostcode($billing->getPostcode()) 
->setTelephone($billing->getTelephone()) 
->setFax($billing->getFax()); 
$order->setBillingAddress($billingAddress); 

$shipping = $customer->getDefaultShippingAddress(); 
$shippingAddress = Mage::getModel('sales/order_address') 
->setStoreId($storeId) 
->setAddressType(Mage_Sales_Model_Quote_Address::TYPE_SHIPPING) 
->setCustomerId($customer->getId()) 
->setCustomerAddressId($customer->getDefaultShipping()) 
->setCustomer_address_id($shipping->getEntityId()) 
->setPrefix($shipping->getPrefix()) 
->setFirstname($shipping->getFirstname()) 
->setMiddlename($shipping->getMiddlename()) 
->setLastname($shipping->getLastname()) 
->setSuffix($shipping->getSuffix()) 
->setCompany($shipping->getCompany()) 
->setStreet($shipping->getStreet()) 
->setCity($shipping->getCity()) 
->setCountry_id($shipping->getCountryId()) 
->setRegion($shipping->getRegion()) 
->setRegion_id($shipping->getRegionId()) 
->setPostcode($shipping->getPostcode()) 
->setTelephone($shipping->getTelephone()) 
->setFax($shipping->getFax()); 

$order->setShippingAddress($shippingAddress) 
->setShipping_method('flatrate_flatrate'); 
/*->setShippingDescription($this->getCarrierName('flatrate'));*/ 
/*some error i am getting here need to solve further*/ 

//you can set your payment method name here as per your need 
$orderPayment = Mage::getModel('sales/order_payment') 
->setStoreId($storeId) 
->setCustomerPaymentId("PAY-9G20599927263253EK6BC2SA") 
->setMethod('paypal_express') 
->setPo_number('8EV04718DA563240K'); 
$order->setPayment($orderPayment); 

// let say, we have 2 products 
//check that your products exists 
//need to add code for configurable products if any 
$subTotal = 0; 
$products = array(
    '1' => array(
    'qty' => 2 
    )); 

foreach ($products as $productId=>$product) { 
//$_product = Mage::getModel('catalog/product')->load($productId); 
$id = Mage::getModel('catalog/product')->getResource()->getIdBySku('property_415682'); 

if ($id) { 
    $_product = Mage::getModel('catalog/product')->load($id); 
} 

$rowTotal = $_product->getPrice() * $product['qty']; 
$orderItem = Mage::getModel('sales/order_item') 
->setStoreId($storeId) 
->setQuoteItemId(0) 
->setQuoteParentItemId(NULL) 
->setProductId($productId) 
->setProductType($_product->getTypeId()) 
->setQtyBackordered(NULL) 
->setTotalQtyOrdered($product['rqty']) 
->setQtyOrdered($product['qty']) 
->setName($_product->getName()) 
->setSku($_product->getSku()) 
->setPrice($_product->getPrice()) 
->setBasePrice($_product->getPrice()) 
->setOriginalPrice($_product->getPrice()) 
->setRowTotal($rowTotal) 
->setBaseRowTotal($rowTotal); 

$subTotal += $rowTotal; 
$order->addItem($orderItem); 
} 

$order->setSubtotal($subTotal) 
->setBaseSubtotal($subTotal) 
->setGrandTotal($subTotal) 
->setBaseGrandTotal($subTotal); 

$transaction->addObject($order); 
$transaction->addCommitCallback(array($order, 'place')); 
$transaction->addCommitCallback(array($order, 'save')); 
$transaction->save(); 

Referenz i i dieses Plugin

https://github.com/paypal/PayPal-Cordova-Plugin 

Ich bin neu zu magento und ionische App-Entwicklung so Jede Art von Hilfe zu schätzen verwendet

http://pragneshkaria.com/programmatically-create-order-in-magento/ 

Für PayPal-Zahlung Integration folgt .

Vielen Dank im Voraus.

+0

Aber erwarten Sie, dass Sie einen echten PayPal-Account mit diesem Code bezahlen? Magento bei jedem Modell speichern können Beobachter ausführen, die eine Verbindung mit dem echten Paypal-Gateway herstellen können, und PayPal erfordert natürlich eine Art von Authentifizierungs-Token. Wenn Sie nur alte Daten importieren möchten, sollten Sie einfachere Abfragen durchlaufen. –

+0

@PawelDubiel Ich habe versucht, mit einfachen Abfragen, aber ich habe auch Schwierigkeiten dabei.können Sie bitte ein beliebiges Beispiel oder Referenzen angeben, um Bestellungen mit DB-Abfragen zu erstellen. – venkatesh

Antwort

0

Wenn diese einmaligeImport und Sie wollen nicht verantwortlich Kunden, und Sie sind bereit Hacky Lösungen zu verwenden, versuchen Sie können dann

_placeOrder Methode bei

app/code/core/Mage/Paypal/Model/Express.php zu ändern und versuchen, kommentieren Sie

$api->callDoExpressCheckoutPayment(); 

Diese Funktion oben ist t den gesamten Prozess in Ordnung bringen.


/** 
* Place an order with authorization or capture action 
* 
* @param Mage_Sales_Model_Order_Payment $payment 
* @param float $amount 
* @return Mage_Paypal_Model_Express 
*/ 
protected function _placeOrder(Mage_Sales_Model_Order_Payment $payment, $amount) 
{ 
    $order = $payment->getOrder(); 

    // prepare api call 
    $token = $payment->getAdditionalInformation(Mage_Paypal_Model_Express_Checkout::PAYMENT_INFO_TRANSPORT_TOKEN); 
    $api = $this->_pro->getApi() 
     ->setToken($token) 
     ->setPayerId($payment-> 
      getAdditionalInformation(Mage_Paypal_Model_Express_Checkout::PAYMENT_INFO_TRANSPORT_PAYER_ID)) 
     ->setAmount($amount) 
     ->setPaymentAction($this->_pro->getConfig()->paymentAction) 
     ->setNotifyUrl(Mage::getUrl('paypal/ipn/')) 
     ->setInvNum($order->getIncrementId()) 
     ->setCurrencyCode($order->getBaseCurrencyCode()) 
     ->setPaypalCart(Mage::getModel('paypal/cart', array($order))) 
     ->setIsLineItemsEnabled($this->_pro->getConfig()->lineItemsEnabled); 

    // COMMENT LINE BELOW 
    $api->callDoExpressCheckoutPayment(); 

    $this->_importToPayment($api, $payment); 
    return $this; 
} 

Wenn Sie es auf einer täglichen Basis zu tun, die Sie in „Monkey Patching“ für PHP und überschreiben diese Methode auf eine Fliege ohne Änderung der Datei suchen.

Sie könnten auch wahrscheinlich diese Erweiterung erweitern oder einfach nur app/code/core/Mage/Paypal/Model/Express.php außer Kraft setzen, indem sie es in die lokalen Magento Verzeichnis platzieren und dann zusätzliche Logik zu _placeOrder hinzufügen


Eine andere Lösung Erstellen von benutzerdefinierten werden könnte (wie https://magento2.atlassian.net/wiki/pages/viewpage.action?pageId=14024897 außer Kraft zu setzen) Zahlungsmethode in Magento (http://inchoo.net/magento/how-to-create-magento-payment-module/) mit benutzerdefinierten Zahlungscode, die Sie anstelle von paypal_express verwenden werden. Danach können Sie Felder in der Datenbank von Ihrem benutzerdefinierten Methodennamen zu paypal_express ersetzen.

Sie können auch eine neue Zahlungsmethode mit dem benutzerdefinierten Namen wie "my_paypal_express" erstellen und anstelle von paypal_express verwenden.

Um ehrlich zu sein, bin ich nicht sehr glücklich mit diesen oben aufgeführten Lösungen, aber sie können Ihnen ein wenig helfen.

Verwandte Themen