Olá, gostaria de uma ajuda se possível, estou tentando criar um módulo para calcular o preço do frete, mas não tem nenhum tutorial na internet que ensine fazer requisições com api, olhei o módulo da ups e dhl, porém não consegui definir a lógica.
<?php
namespace Kauan\Shipping\Model\Carrier;
use Magento\Quote\Model\Quote\Address\RateRequest;
use Magento\Shipping\Model\Rate\Result;
use Magento\Quote\Model\Quote\Address\RateResult\Error;
use Magento\Shipping\Model\Carrier\AbstractCarrierOnline;
use Magento\Shipping\Model\Carrier\CarrierInterface;
use Magento\Shipping\Model\Simplexml\Element;
use Magento\Ups\Helper\Config;
use Magento\Framework\Xml\Security;
class Datafrete extends \Magento\Shipping\Model\Carrier\AbstractCarrier implements
\Magento\Shipping\Model\Carrier\CarrierInterface
{
/**
* @var string
*/
protected $_code = 'shipping';
/**
* @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,
Security $xmlSecurity,
\Magento\Shipping\Model\Simplexml\ElementFactory $xmlElFactory,
\Magento\Shipping\Model\Rate\ResultFactory $rateFactory,
\Magento\Quote\Model\Quote\Address\RateResult\MethodFactory $rateMethodFactory,
\Magento\Shipping\Model\Tracking\ResultFactory $trackFactory,
\Magento\Shipping\Model\Tracking\Result\ErrorFactory $trackErrorFactory,
\Magento\Shipping\Model\Tracking\Result\StatusFactory $trackStatusFactory,
\Magento\Directory\Model\RegionFactory $regionFactory,
\Magento\Directory\Model\CountryFactory $countryFactory,
\Magento\Directory\Model\CurrencyFactory $currencyFactory,
\Magento\Directory\Helper\Data $directoryData,
\Magento\CatalogInventory\Api\StockRegistryInterface $stockRegistry,
\Magento\Framework\Locale\FormatInterface $localeFormat,
Config $configHelper,
array $data = []
) {
$this->_rateResultFactory = $rateResultFactory;
$this->_rateMethodFactory = $rateMethodFactory;
parent::__construct($scopeConfig, $rateErrorFactory, $logger, $data);
}
/**
* @return array
*/
public function getAllowedMethods()
{
return ['datafrete' => $this->getConfigData('name')];
}
/**
* @param RateRequest $request
* @return bool|Result
*/
public function collectRates(RateRequest $request)
{
if (!$this->getConfigFlag('active')) {
return false;
}
//API CONNECTION
$options = array('location' => $this->getConfigData('api'),
'uri' => $this->getConfigData('api').'?wsdl');
$client = new SoapClient($this->url_integracao."?wsdl",$options);
//ITS OK TO GET INFOS PRODUCTS LIKE THIS?
$itemsShipment = $request->getPackageItems();
foreach ($itemsShipment as $itemShipment) {
$item = new \Magento\Framework\DataObject();
$item->setData($itemShipment);
$nome = $item->getName();
$preco = $item->getPrice();
}
//FUNCTION TO GET INFO/VALUES FROM API - RETURN A JSON
$consulta_frete = $client->getValorFrete(
//NEED KNOW IF THIS LIST CONTAINS RIGHT INFOS TO POST ON API $this->getConfigData('usuario'),
$this->getConfigData('senha'),
$this->getConfigData('codigo'),
$request->getOrigPostcode(),
$request->getDestPostcode(),
$json_produto,
$json_inf_comp);
$consulta_frete = json_decode($consulta_frete);
//HOW I USE FOREACH TO DECLARE VALUES AND DESCRIPTIONS ON METHOD->SETPRICE
/** @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('datafrete');
$method->setCarrierTitle($this->getConfigData('title'));
$method->setMethod('datafrete');
$method->setMethodTitle($this->getConfigData('name'));
/*you can fetch shipping price from different 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);
return $result;
}
}
Não sei como pegar as informações do carrinho, enviar para api e retornar os valores para o carrinho.
Abraço.