How to Create a new shipping method in Magento 2

In this guide, I will show you how to create Magento 2 module with a shipping method.

The following examples show how to create a shipping method:

  • Shipping method must be describe in file xml.The main node in xml is “default” and have the same name as property $_code in shipping class through file:
app/code/local/Name space]/[YourModule]/Model/Carrier/NewShipping“.
<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd">
<default>
<carriers>
 <newshipping>
  <active>1</active>
<sallowspecific>0</sallowspecific>
 <model>[Name space]\[Your Module]\Model\Carrier\NewShipping</model>
 <name>Example New Shipping</name>
<price>10.00</price>

<title>Example New Shipping</title>

 <type>I</type>          
</newshipping>
</carriers>
</default>
</config>
  • Every shipping method should have config options in admin that can add shipping method options through file:
app/code/local/Name space]/[Your Module]/etc/adminhtml/system.xml
<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Config:etc/system_file.xsd">

<system>

     <section id="carriers" translate="label" type="text" sortOrder="320" showInDefault="1" showInWebsite="1" showInStore="1">

         <group id="newshipping" translate="label" type="text" sortOrder="0" showInDefault="1" showInWebsite="1" showInStore="1">

             <label>Example New Shipping</label>

             <field id="active" translate="label" type="select" sortOrder="1" showInDefault="1" showInWebsite="1" showInStore="0">

                 <label>Enabled</label>

                 <source_model>Magento\Config\Model\Config\Source\Yesno</source_model>

             </field>

             <field id="name" translate="label" type="text" sortOrder="3" showInDefault="1" showInWebsite="1" showInStore="1">

                 <label>Method Name</label>

             </field>

             <field id="price" translate="label" type="text" sortOrder="5" showInDefault="1" showInWebsite="1" showInStore="0">

                 <label>Price</label>

                 <validate>validate-number validate-zero-or-greater</validate>

             </field>

             <field id="handling_type" translate="label" type="select" sortOrder="7" showInDefault="1" showInWebsite="1" showInStore="0">

                 <label>Calculate Handling Fee</label>

                 <source_model>Magento\Shipping\Model\Source\HandlingType</source_model>

             </field>

             <field id="handling_fee" translate="label" type="text" sortOrder="8" showInDefault="1" showInWebsite="1" showInStore="0">

                 <label>Handling Fee</label>

                 <validate>validate-number validate-zero-or-greater</validate>

             </field>

             <field id="sort_order" translate="label" type="text" sortOrder="100" showInDefault="1" showInWebsite="1" showInStore="0">

                 <label>Sort Order</label>

             </field>

             <field id="title" translate="label" type="text" sortOrder="2" showInDefault="1" showInWebsite="1" showInStore="1">

                 <label>Title</label>

             </field>

             <field id="sallowspecific" translate="label" type="select" sortOrder="90" showInDefault="1" showInWebsite="1" showInStore="0">

                 <label>Ship to Applicable Countries</label>

                 <frontend_class>shipping-applicable-country</frontend_class>

                 <source_model>Magento\Shipping\Model\Config\Source\Allspecificcountries</source_model>

             </field>

             <field id="specificcountry" translate="label" type="multiselect" sortOrder="91" showInDefault="1" showInWebsite="1" showInStore="0">

                 <label>Ship to Specific Countries</label>

                 <source_model>Magento\Directory\Model\Config\Source\Country</source_model>

                 <can_be_empty>1</can_be_empty>

             </field>

             <field id="showmethod" translate="label" type="select" sortOrder="92" showInDefault="1" showInWebsite="1" showInStore="0">

                 <label>Show Method if Not Applicable</label>

                 <source_model>Magento\Config\Model\Config\Source\Yesno</source_model>

             </field>

             <field id="specificerrmsg" translate="label" type="textarea" sortOrder="80" showInDefault="1" showInWebsite="1" showInStore="1">

                 <label>Displayed Error Message</label>

             </field>

         </group>

     </section>

</system>

</config>
  • Create class
app/code/local/Name space]/[YourModule]/Model/Carrier/NewShipping
<?php

namespace Name space]\[Your Module]\Model\Carrier;

use Magento\Quote\Model\Quote\Address\RateRequest;

use Magento\Shipping\Model\Rate\Result;

class NewShipping extends \Magento\Shipping\Model\Carrier\AbstractCarrier implements

\Magento\Shipping\Model\Carrier\CarrierInterface

{

/**

* @var string

*/

protected $_code = 'newshipping';

/**

* @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig

* @param \Magento\Quote\Model\Quote\Address\RateResult\ErrorFactory $rateErrorFactory

* @param \Psr\Log\LoggerInterface $logger

* @param \Magento\Shipping\Model\Rate\ResultFactory $rateResultFactory

* @param \Magento\Quote\Model\Quote\Address\RateResult\MethodFactory $rateMethodFactory

* @param array $data

*/

public function __construct(

     \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,

     \Magento\Quote\Model\Quote\Address\RateResult\ErrorFactory $rateErrorFactory,

     \Psr\Log\LoggerInterface $logger,

     \Magento\Shipping\Model\Rate\ResultFactory $rateResultFactory,

     \Magento\Quote\Model\Quote\Address\RateResult\MethodFactory $rateMethodFactory,

     array $data = []

) {

     $this->_rateResultFactory = $rateResultFactory;

     $this->_rateMethodFactory = $rateMethodFactory;

     parent::__construct($scopeConfig, $rateErrorFactory, $logger, $data);

}

/**

* @return array

*/

public function getAllowedMethods()

{

     return ['newshipping' => $this->getConfigData('name')];

}

/**

* @param RateRequest $request

* @return bool|Result

*/

public function collectRates(RateRequest $request)

{

     if (!$this->getConfigFlag('active')) {

         return false;

     }

     /** @var \Magento\Shipping\Model\Rate\Result $result */

     $result = $this->_rateResultFactory->create();

     /** @var \Magento\Quote\Model\Quote\Address\RateResult\Method $method */

     $method = $this->_rateMethodFactory->create();

     $method->setCarrier('newshipping');

     $method->setCarrierTitle($this->getConfigData('title'));

     $method->setMethod('newshipping');

     $method->setMethodTitle($this->getConfigData('name'));

     /*you can get shipping price from similar sources over some APIs, we used price from config.xml - xml node price*/

     $amount = $this->getConfigData('price');

     $method->setPrice($amount);

     $method->setCost($amount);

     $result->append($method);

These are the following examples which is used to Create a new shipping method in magento 2

Last Update: April 9, 2018  

February 8, 2018   114   Nandini R    Shipping    
Total 1 Votes:
0

Tell us how can we improve this post?

+ = Verify Human or Spambot ?

Leave a Reply

Your email address will not be published. Required fields are marked *

Facebook
Google+
http://www.webnexs.com/blog/kb/create-new-shipping-method-magento-2
Twitter
LinkedIn