php – 以编程方式在magento订单创建中发布Paypal错误
我正在为magento网站开发混合移动应用程序.现在我需要以编程方式创建订单.我能够整合paypal并获得paypal成功响应.一旦我得到paypal响应我发布数据到magento.这里得到的错误是
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 以下是我的订单创建代码. <?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(); 参考我跟着是 http://pragneshkaria.com/programmatically-create-order-in-magento/ 对于paypal支付集成,我使用了这个插件 https://github.com/paypal/PayPal-Cordova-Plugin 我是magento和离子应用程序开发的新手,所以感谢任何形式的帮助. 提前致谢. 解决方法
如果这一次关闭导入并且您不希望向客户收费,并且您准备使用hacky解决方案,那么您可以尝试修改
_placeOrder方法在 app / code / core / Mage / Paypal / Model / Express.php并尝试注释掉 $api->callDoExpressCheckoutPayment(); 上面的这个功能正在触发整个过程. /** * 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; } 如果您需要每天进行,您可以查看PHP的“猴子修补”并在不修改文件的情况下快速覆盖此方法. 您也可以扩展此扩展或覆盖app / code / core / Mage / Paypal / Model / Express.php,方法是将其放入本地Magento目录,然后向_placeOrder添加额外的逻辑(如何覆盖https://magento2.atlassian.net/wiki/pages/viewpage.action?pageId=14024897) 另一个解决方案是在Magento(http://inchoo.net/magento/how-to-create-magento-payment-module/)中创建自定义支付方式,使用自定义支付代码,而不是paypal_express.之后,您可以将数据库中的字段从自定义方法名称替换为paypal_express. 您还可以使用自定义名称(例如“my_paypal_express”)创建新的付款方式,并使用它而不是paypal_express. 说实话,我对上面列出的这些解决方案不是很满意,但它们可能对你有所帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |