Magento SOAP API sales_order_shipment创建和addTrack问题
问题描述:
一些前程序员使用Magento SOAP API V1编写了该程序,以便将已发货的订单标记为已发货。在以前的Magento vs 1.5平台上它运行良好,但是现在在1.7版跟踪号码本身并没有被导入。正如你所看到的一样,我的名字已被注释掉// Caitlin。上面这行代码是前程序员放的,之后的两行代码是我认为代码应该用于Magento vs 1.7的代码,但是我最后一次尝试使用这个代码段时停止了他们的操作。这对你看起来是否正确?有任何想法吗?Magento SOAP API sales_order_shipment创建和addTrack问题
$comment = '<b><br>*** Order has shipped. ***</b><br/><br/>' .
'<b>3PL order number:</b> ' . $fields[1] . '<br/>' .
'<b>Weight:</b> ' . $fields[2] . '<br/>' .
'<b>Shipped via:</b> ' . $fields[3] . '<br/>' .
'<b>Tracking number:</b> ' . $fields[4] . '<br/>' .
'<b>Ship date:</b> ' . $fields[5] . '<br/>' .
'<b>Postage:</b> ' . $fields[6] . '<br/>' .
'<b>Fulfillment:</b> ' . $fields[7] . '<br/>' .
'<b>Per packslip:</b> ' . $fields[8];
// Make shipment and add tracking number
if ($fields[3] == 'UPS-RESIDENTIAL') { $shippedby = 'ups'; $shipname = 'UPS Ground'; }
elseif ($fields[3] == 'UPS-2') { $shippedby = 'ups'; $shipname = 'UPS 2nd Day Air'; }
elseif ($fields[3] == 'UPS-OVERNIGHT') { $shippedby = 'ups'; $shipname = 'UPS Next Day Air Saver'; }
elseif ($fields[3] == 'USPS-PRI') { $shippedby = 'usps'; $shipname = 'USPS Priority'; }
elseif ($fields[3] == 'CANADA') { $shippedby = 'custom'; $shipname = 'MSI Canada (Standard) '; }
elseif ($fields[3] == 'MSITRACK') { $shippedby = 'custom'; $shipname = 'MSI Canada (Express)'; }
else { $shippedby = 'custom'; }
// Attempt to create the order, notify on failure
try {
$newShipmentId = $client->call($sess_id, 'sales_order_shipment.create', array($ShippedOrderId, array(), $comment, true, false, $shippedby, $shipname, $fields[4]));
//Caitlin
//$newShipmentId = $client->call($sess_id, 'sales_order_shipment.create', array($ShippedOrderId, array(), $comment, true, false));
//$newTrackId = $proxy->call($sessionId, 'sales_order_shipment.addTrack', array($newShipmentId, $shippedby, $shipname, $fields[4]));
}
catch (Exception $e) { echo 'Shipment creation failed on order '. $ShippedOrderId . ': ', $e->getMessage(); }
// Add comment to order with all the info
$client->call($sess_id, 'sales_order.addComment', array($ShippedOrderId, 'complete', $comment, false));
$mail_content .= $line . "\n";
$importcount++;
}
//}
}
编辑13年2月25日
使用下面的实现。我从运行此脚本错误。我还没有能够测试它,因为我不得不在cron在凌晨5点运行。
// Make shipment and add tracking number
if ($fields[3] == 'UPS-RESIDENTIAL') { $shippedby = 'ups'; $shipname = 'UPS Ground'; }
elseif ($fields[3] == 'UPS-2') { $shippedby = 'ups'; $shipname = 'UPS 2nd Day Air'; }
elseif ($fields[3] == 'UPS-OVERNIGHT') { $shippedby = 'ups'; $shipname = 'UPS Next Day Air Saver'; }
elseif ($fields[3] == 'USPS-PRI') { $shippedby = 'usps'; $shipname = 'USPS Priority'; }
elseif ($fields[3] == 'CANADA') { $shippedby = 'custom'; $shipname = 'MSI Canada (Standard) '; }
elseif ($fields[3] == 'MSITRACK') { $shippedby = 'custom'; $shipname = 'MSI Canada (Express)'; }
else { $shippedby = 'custom'; }
/////////////////////////////////////////////
$order = Mage::getModel('sales/order')->loadByIncrementId($orderId);
$shipment_collection = Mage::getResourceModel('sales/order_shipment_collection');
$shipment_collection->addAttributeToFilter('order_id', $orderId);
$shipment_collection->load();
$firstItem = $shipment_collection->getFirstItem();
if(count($shipment_collection) > 1)
{
$track_no = $fields[4]; // insert tracking # string here
$shipment = Mage::getModel('sales/order_shipment');
$shipment->load($firstItem->getId());
if($shipment->getId() != '')
{
$track = Mage::getModel('sales/order_shipment_track')
->setShipment($shipment)
->setData('title', $shipname) // User syntax correct name here
->setData('number', $track_no)
->setData('carrier_code', $shippedby) // use code that matches DB code for ship method here
->setData('order_id', $shipment->getData('order_id'));
$track->save();
}
return true;
} else {
$orderShip = $order->prepareShipment(); // can take sku => qty array
$orderShip->register();
$orderShip->sendEmail();
$tracker = Mage::getModel('sales/order_shipment_track');
$tracker->setShipment($orderShip);
$tracker->setData('title', $shipname);
$tracker->setData('number', $importData['Tracking Number']);
$tracker->setData('carrier_code', $shippedby);
$tracker->setData('order_id', $orderId);
$orderShip->addTrack($tracker);
$orderShip->save();
$order->setData('state', "complete");
$order->setStatus("complete");
$history = $order->addStatusHistoryComment('Order marked as complete by shipment code.', false);
$history->setIsCustomerNotified(false);
$order->save();
/////////////////////////////////////////////////
// Add comment to order with all the info
$client->call($sess_id, 'sales_order.addComment', array($ShippedOrderId, 'complete', $comment, false));
$mail_content .= $line . "\n";
$importcount++;
}
//}
}
答
我会一起去除API的使用。
试试这个:
$order = Mage::getModel('sales/order')->loadByIncrementId($orderId);
$shipment_collection = Mage::getResourceModel('sales/order_shipment_collection');
$shipment_collection->addAttributeToFilter('order_id', $orderId);
$shipment_collection->load();
$firstItem = $shipment_collection->getFirstItem();
if(count($shipment_collection) > 1)
{
$track_no = "FEDEX9879879"; // insert tracking # string here
$shipment = Mage::getModel('sales/order_shipment');
$shipment->load($firstItem->getId());
if($shipment->getId() != '')
{
$track = Mage::getModel('sales/order_shipment_track')
->setShipment($shipment)
->setData('title', 'United Parcel Service') // User syntax correct name here
->setData('number', $track_no)
->setData('carrier_code', 'ups') // use code that matches DB code for ship method here
->setData('order_id', $shipment->getData('order_id'));
$track->save();
}
return true;
} else {
$orderShip = $order->prepareShipment(); // can take sku => qty array
$orderShip->register();
$orderShip->sendEmail();
$tracker = Mage::getModel('sales/order_shipment_track');
$tracker->setShipment($orderShip);
$tracker->setData('title', 'United Parcel Service');
$tracker->setData('number', $importData['Tracking Number']);
$tracker->setData('carrier_code', 'ups');
$tracker->setData('order_id', $orderId);
$orderShip->addTrack($tracker);
$orderShip->save();
$order->setData('state', "complete");
$order->setStatus("complete");
$history = $order->addStatusHistoryComment('Order marked as complete by shipment code.', false);
$history->setIsCustomerNotified(false);
$order->save();
通知orderShip的保存自动保存的跟踪,你不能保存在它自己的一个跟踪对象,因为它会失败外键约束。
答
上面的实现几乎为我工作,但我无法添加跟踪号码。我最终回去测试了Magento soap API的代码。下面还增加了查询号码:
try {
// Create new shipment
$newShipmentId = $client->call($sess_id, 'sales_order_shipment.create', array($ShippedOrderId, array(), 'Shipment Created', true, true));
$newTrackId = $client->call($sess_id, 'sales_order_shipment.addTrack', array($newShipmentId, $shippedby, $shipname, $fields[4]));
}
catch (Exception $e) { echo 'Shipment creation failed on order '. $ShippedOrderId . ': ', $e->getMessage(); }
不能相信我花了这么多时间,因为之前我曾尝试这样做,我想我只是搞砸的变量。乐意帮助任何可能需要额外帮助的人。
我拿出了试试看,并把我上面的东西(见我的编辑)和克隆没有运行那天晚上。你有没有看到任何错误? – CaitlinHavener 2013-02-25 17:27:43
尝试从shell进行手动运行以进行调试。有时Magento的内置cron不能按预期运行。 – mprototype 2013-02-26 08:23:26
我确实在您的实现中看到错误,其中一些变量需要用您的数据替换。特别是在注入实际追踪号码的地方。 – mprototype 2013-02-26 08:24:12