Php 以编程方式创建magento订单时出现Paypal过账错误

Php 以编程方式创建magento订单时出现Paypal过账错误,php,magento,paypal,ionic-framework,paypal-sandbox,Php,Magento,Paypal,Ionic Framework,Paypal Sandbox,我正在为magento网站开发混合移动应用程序。现在我需要以编程方式创建订单。我能够整合paypal并获得paypal成功响应。一旦我收到paypal回复,我会将数据发布到magento。这里我得到的错误如下 Uncaught exception 'Mage_Core_Exception' with message 'PayPal gateway has rejected request. Invalid token (#10410: Invalid token).' in public_ht

我正在为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();
对于paypal支付集成,我使用了这个插件

 https://github.com/paypal/PayPal-Cordova-Plugin
我是magento和ionic应用程序开发的新手,非常感谢您的帮助


提前谢谢

如果这是一次性的导入并且您不想向客户收费,并且您已经准备好使用黑客解决方案,那么您可以尝试修改

\u placeOrder
方法位于

app/code/core/Mage/Paypal/Model/Express.php
并尝试注释

$api->callDoExpressCheckoutPayment();
上述功能将触发整个过程


如果您每天都需要这样做,您可以查看PHP的“monkey patching”,并在不修改文件的情况下动态重写此方法

您还可以扩展此扩展或覆盖app/code/core/Mage/Paypal/Model/Express.php,方法是将其放入本地Magento目录,然后向_placeOrder添加额外的逻辑(如何覆盖)


另一个解决方案可能是在Magento()中创建自定义付款方法,使用自定义付款代码代替paypal_express。之后,您可以将数据库中的字段从自定义方法名称替换为paypal_express

此外,您还可以使用自定义名称创建新的付款方式,如“my_paypal_express”,并使用它代替paypal_express


老实说,我对上面列出的这些解决方案不是很满意,但它们可能会对您有所帮助

但是你希望用这个代码向真正的贝宝账户收费吗?每个型号save上的Magento可以执行观察器,观察器可以连接到真正的paypal网关,paypal当然需要某种身份验证令牌。若你们只想导入旧数据,你们应该采用更简单的查询方法。@Paweldubil我尝试过简单的查询,但在这方面我也遇到了困难。请分享使用DB查询创建订单的示例或参考。
$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;
}