Integrate SimplyPost with Magento store
-
17-12-2020 - |
Pregunta
Does anyone try integrating SimplyPost with Magento, Is there any plugins or giudes I can follow? So far I could find only the SimplyPost API. I'm new to magento, So have no idea where to start. I will appreciate any kick-start. Peace!
Solución
I manage write an custom module to connect SimplyPost with Magento via RESTful API. I Just wanna share the code. Check Github to find the complete source.
1- app/code/local/Mymodule/Simplypost/etc/config.xml
<?xml version="1.0" encoding="utf-8"?>
<config>
<modules>
<Mymodule_Simplypost>
<version>1.0.0</version>
</Mymodule_Simplypost>
</modules>
<global>
<models>
<simplypost>
<class>Mymodule_Simplypost_Model</class>
</simplypost>
</models>
<helpers>
<simplypost>
<class>Mymodule_Simplypost_Helper</class>
</simplypost>
</helpers>
<blocks>
<simplypost>
<class>Mymodule_Simplypost_Block</class>
</simplypost>
</blocks>
</global>
<adminhtml>
<!--call simplypost process before save shipment-->
<events>
<sales_order_shipment_save_before>
<observers>
<create_simplypost>
<type>singleton</type>
<class>simplypost/observer</class>
<method>createSimplypost</method>
</create_simplypost>
</observers>
</sales_order_shipment_save_before>
</events>
<!--customize the grid on order view page to show the SimplyPost tracking status-->
<events>
<core_block_abstract_to_html_after>
<observers>
<simplypost_custom_order_view_info>
<class>simplypost/observer</class>
<method>getSalesOrderViewInfo</method>
</simplypost_custom_order_view_info>
</observers>
</core_block_abstract_to_html_after>
</events>
<!--create a custom grid on order view page : app/design/adminhtml/default/default/layout/mymodule_simplypost.xml -->
<layout>
<updates>
<simplypost>
<file>mymodule_simplypost.xml</file>
</simplypost>
</updates>
</layout>
</adminhtml>
</config>
2- app/code/local/Mymodule/Simplypost/Model/Observer.php
<?php
/*
* Observer Event : sales_order_shipment_save_before
* This is the function which post data SimplyPost
*/
class Mymodule_Simplypost_Model_Observer {
public function createSimplypost(Varien_Event_Observer $observer) {
$shipment = $observer->getEvent()->getShipment();
$order = $shipment->getOrder();
//This can be serve from admin cms, check the Github link for more details
$spEnable = true;
$spAuthEndpoint = https://app.simplypost.asia/api/gateway/v1/auth/login/;
$spLoginToken = 'Basic weloYUBasd313WEdfsf23423429tOnhwbzEyMw==';
$spEndpoint = 'https://app.simplypost.asia/api/gateway/v1/deliveries/';
$spMerchantCode = 'W2134';
$spServiceCode = 'DOMN';
if($spEnable){
//check all configurations exists
if($spAuthEndpoint == null || $spLoginToken == null || $spEndpoint == null || $spMerchantCode == null || $spServiceCode == null){
Mage::getSingleton('core/session')->addError('SimplyPost failed, Configurations Error.');
//stop the process
Mage::app()->getResponse()->setRedirect($_SERVER['HTTP_REFERER']);
Mage::app()->getResponse()->sendResponse();
exit;
}
else{
// get all order items and make an array
$orderitems = $order->getAllVisibleItems();
$arrItem = array();
$arrItems = array();
foreach ($orderitems as $orderitem):
$product = $orderitem->getProduct();
$arrItem['weight'] = ($product->getData('weight')) ? $product->getData('weight') : 0;
$arrItem['description'] = ($product->getData('short_description')) ? $product->getData('short_description') : 0;
$arrItem['weight_unit'] = "Kg";
$arrItems[] = $arrItem;
unset($arrItem);
endforeach;
/*
* Send data to Simplypost via Zend_Http_Client
*/
//genarate new token, because this token is only valid for 1 hour
$auth = $spLoginToken;
$clientLogin = new Zend_Http_Client();
$clientLogin->setHeaders(array(
'Authorization' => $auth
));
$clientLogin->setUri($spAuthEndpoint);
$clientLogin->setMethod(Zend_Http_Client::POST);
$responseLogin = $clientLogin->request();
if ($responseLogin->isSuccessful()) {
$responseLogin = json_decode($responseLogin->getBody());
//our new token
$token = "JWT ".$responseLogin->token;
//end point post order details to simplypost
$url = $spEndpoint;
//obj Zend_Http_Client
$client = new Zend_Http_Client();
//set Authentication and other headers
$client->setHeaders(array(
'Content-Type' => 'application/json',
'Authorization' => $token
));
//set endpoint url
$client->setUri($url);
//create post data into SimplyPost array format
$customerFName = ($order->getShippingAddress()->getData('firstname')) ? $order->getShippingAddress()->getData('firstname') : null;
$customerLName = ($order->getShippingAddress()->getData('lastname')) ? $order->getShippingAddress()->getData('lastname') : null;
$customerAddressStreet = ($order->getShippingAddress()->getData('street')) ? $order->getShippingAddress()->getData('street') : null;
$customerAddressCity = ($order->getShippingAddress()->getData('city')) ? $order->getShippingAddress()->getData('city') : null;
$customerAddressCountry = ($order->getShippingAddress()->getData('country_id')) ? Mage::app()->getLocale()->getCountryTranslation($order->getShippingAddress()->getData('country_id')) : null;
$data = array(
'merchant_code' => $spMerchantCode, // copied from SimplyPost Mymodule account
'reference_number' => ($order->getData('increment_id')) ? $order->getData('increment_id') : null, // order number
'order_source' => 'mage_test', //random string
'service_code' => $spServiceCode, //Delievery stype code
"pickup_details" => array( //Pickup details from admin cms
"contact_name" => "Kevin",
"phone_number" => '12344321',
"email" => 'kev@gmail.com',
"address" => 'Address goes here',
"postcode" => '123443',
),
'consignee_details' => array( //Customer details
"contact_name" => $customerFName." ".$customerLName,
"phone_number" => ($order->getShippingAddress()->getData('telephone')) ? $order->getShippingAddress()->getData('telephone') : null,
"email" => ($order->getShippingAddress()->getData('email')) ? $order->getShippingAddress()->getData('email') : null,
"address" => $customerAddressStreet." ".$customerAddressCity." ".$customerAddressCountry,
"postcode" => ($order->getShippingAddress()->getData('postcode')) ? $order->getShippingAddress()->getData('postcode') : null,
),
'item_details' => $arrItems,
);
//set the parameters
$client->setParameterPost($data);
// POST request
$client->setMethod(Zend_Http_Client::POST);
$response = $client->request();
if ($response->isSuccessful()) {
//decode the response
$responseBody = json_decode($response->getBody());
// update the tracking code into shipment in our system
$shipment = $observer->getEvent()->getShipment();
$track = Mage::getModel('sales/order_shipment_track')
->setNumber($responseBody->tracking_id) //tracking number / awb number
->setCarrierCode('simplypost') //carrier code
->setTitle('SimplyPost'); //carrier title
$shipment->addTrack($track);
Mage::getSingleton('core/session')->addSuccess('Order added to the SimplyPost.');
}
else{
//log error
Mage::log($response);
$responseBody = json_decode($response->getBody());
Mage::getSingleton('core/session')->addError('SimplyPost Failed: '.$responseBody->error->message);
//stop the process
Mage::app()->getResponse()->setRedirect($_SERVER['HTTP_REFERER']);
Mage::app()->getResponse()->sendResponse();
exit;
}
}
else{
//log error
Mage::log($responseLogin);
$responseLogin = json_decode($responseLogin->getBody());
Mage::getSingleton('core/session')->addError('SimplyPost Authentication Failed: '.$responseLogin->errors);
//stop the process
Mage::app()->getResponse()->setRedirect($_SERVER['HTTP_REFERER']);
Mage::app()->getResponse()->sendResponse();
exit;
}
}
}
}
// This function is called on core_block_abstract_to_html_after event
// We will append our block to the html in the adminhtml under order page
public function getSalesOrderViewInfo(Varien_Event_Observer $observer) {
$block = $observer->getBlock();
// layout name should be same as used in app/design/adminhtml/default/default/layout/mymodule.xml
if (($block->getNameInLayout() == 'order_info') && ($child = $block->getChild('simplypost.order.info.custom.block'))) {
$transport = $observer->getTransport();
if ($transport) {
$html = $transport->getHtml();
$html .= $child->toHtml();
$transport->setHtml($html);
}
}
}
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange