mendoca

Members
  • Content Count

    17
  • Joined

  • Last visited

Posts posted by mendoca


  1. tenho um anúncio que esta com a opção de shipping como not_especified e quero alterar para me2 mas ele não esta alterando o json que estou enviando esta abaixo eu fiz a verificação se o usuario e a categoria podem trabalhar com o me2 e esta tudo habilitado.

    {  
       "title":"CASINHA DE ATIVIDADES ACTIVITY HOUSE 714 - CALESITA",
       "video_id":"",
       "price":"67.00",
       "category_id":"MLB53540",
       "pictures":[  
          {  
             "id":"917503-MLB29982926271_042019"
          },
          {  
             "id":"943121-MLB29982930107_042019"
          }
       ],
       "attributes":[  
          {  
             "id":"MANUFACTURER",
             "value_id":"",
             "value_name":"Calesita "
          },
          {  
             "id":"LINE",
             "value_id":"",
             "value_name":"ACTIVITY HOUSE "
          },
          {  
             "id":"MODEL",
             "value_id":"",
             "value_name":"714 "
          },
          {  
             "id":"ALPHANUMERIC_MODEL",
             "value_id":"-1",
             "value_name":null
          },
          {  
             "id":"INCLUDES_FURNITURE",
             "value_id":"242084",
             "value_name":"N\u00e3o "
          },
          {  
             "id":"IS_FLAMMABLE",
             "value_id":"242084",
             "value_name":"N\u00e3o "
          },
          {  
             "id":"IS_KIT",
             "value_id":"242084",
             "value_name":"N\u00e3o "
          },
          {  
             "id":"BRAND",
             "value_id":"",
             "value_name":"CALESITA"
          }
       ],
       "shipping":{  
          "mode":"me2",
          "local_pick_up":false,
          "free_shipping":false,
          "free_methods":[  

          ]
       }
    }


  2. eu envio as informação via curl então para mandar um arquivo estou criando um curlfile usando essa função:

        public function makeCurlFile($file){
            $mime = mime_content_type($file);
            $info = pathinfo($file);
            $name = $info['basename'];
            $output = new CURLFile($file, $mime, $name);
            return $output;
        }

     

    o retorno dela eu passo para a função de upload

     

        public function uploadPictures($file){

            $this->getAccess();

            $url = parent::$API_DOMAIN.'/pictures?access_token='.$this->accessToken;
            $param = array(
                'source' => $file
            );

            $data = $this->callAPI($url,'POST', json_encode($param), false, true);
            return $data;
        }

     

    a função do curl é esta abaixo:

     

     public function callAPI($url, $method='GET', $data = false, $header=array(), $file=false){

             $curl = curl_init();
             $body = $data;
             switch ($method){
                  case "POST":
                     if (is_array($data)) {
                                curl_setopt($curl, CURLOPT_POST, 1);
                                if($file){
                                    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
                                }else{
                                    curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
                                }              
                         }else{
                                curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
                                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
                         }
                    break;
                  case "PUT":
                        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
                        if (is_array($data)) {
                curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
                        }else{
                          curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
                        }
                    break;
                  case "DELETE":
                        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE');
                        break;
                  default:
                        if ($data)
                             $url = sprintf("%s?%s", $url, http_build_query($data));
             }

             curl_setopt($curl, CURLOPT_URL, $url);
             curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
         curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
         curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
         curl_setopt($curl, CURLOPT_SSLVERSION, 4);

             if(is_array($header) && !empty($header)){
               curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
             }
           $this->error='';
             $content= curl_exec($curl);
             $information = curl_getinfo($curl);

         $data = json_decode($content);
             curl_setopt($curl, CURLOPT_HEADER, true);
             $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
             if($httpcode == 0){
           $this->setErrorML($this->error, $url, $method, $data, $body);
               $this->error=' Connection Error: - '.curl_error($curl);
             }elseif($httpcode == 400 || $httpcode == 401 || $httpcode == 403  || $httpcode == 404 || $httpcode == 405 || $httpcode == 406 || $httpcode == 407 || $httpcode == 409 || $httpcode == 410 || $httpcode == 500 || $httpcode == 501 || $httpcode == 502){
          
                $this->error=(property_exists($data,'error'))?$data->error:'';

                if(property_exists($data,'cause') && isset($data->cause[0]) && property_exists($data->cause[0],'code')) {
                   $this->error=$data->cause[0]->code.' - '.$data->cause[0]->message;
                }elseif(property_exists($data,'cause') && isset($data->cause[0])){
                   $this->error.=' - '.$data->cause[0];
                }elseif(property_exists($data,'message')){
                   $this->error.=' - '.$data->message;
                }else{
                   if(strpos($url,'items/validate')!==false){
                     $this->error.=' - Validation failed.';
                   }
                 }

           $this->setErrorML($this->error, $url, $method, $data, $body);

                 return false;
             }else{
                 return $data;
             }

        } 

    é assim que estou subindo as imagens mas erro ele esta trocando o surce da imagem pelo name isso que esta me deixando confuso e ate onde vi os parametros para criar o curlfile estão corretos


  3. Bom dia estou tentando enviar um xml de uma nfe para o mercado livre

    utilizando a função:

    $param = array(
          'data' => $data['pathnfe']
    );
        
    $url = parent::$API_DOMAIN.'/shipments/'.$data['shipment_id'].'/invoices?access_token='.$this->accessToken;
    $nfe = $this->callAPI($url,'PUT', json_encode($param));   

    mas o que me retorna é o seguinte erro:

    object(stdClass)#58 (4) { ["message"]=> string(21) "Invalid invoices type" ["error"]=> string(21) "invalid_invoices_type" ["status"]=> int(400) ["cause"]=> object(stdClass)#1524 (8) { ["cause"]=> NULL ["error"]=> string(21) "invalid_invoices_type" ["internal_cause"]=> array(0) { } ["localized_message"]=> string(21) "Invalid invoices type" ["message"]=> string(21) "Invalid invoices type" ["stack_trace"]=> array(12) { [0]=> object(stdClass)#70 (5) { ["className"]=> string(37) "com.mercadolibre.fbm.utils.CheckUtils" ["fileName"]=> string(17) "CheckUtils.groovy" ["lineNumber"]=> int(44) ["methodName"]=> string(14) "checkParameter" ["nativeMethod"]=> bool(false) } [1]=> object(stdClass)#1397 (5) { ["className"]=> string(36) "com.mercadolibre.fbm.utils.BodyUtils" ["fileName"]=> string(16) "BodyUtils.groovy" ["lineNumber"]=> int(26) ["methodName"]=> string(8) "readBody" ["nativeMethod"]=> bool(false) } [2]=> object(stdClass)#1396 (5) { ["className"]=> string(36) "com.mercadolibre.fbm.utils.BodyUtils" ["fileName"]=> string(16) "BodyUtils.groovy" ["lineNumber"]=> int(19) ["methodName"]=> string(8) "readBody" ["nativeMethod"]=> bool(false) } [3]=> object(stdClass)#1409 (5) { ["className"]=> string(55) "com.mercadolibre.fbm.invoices.ShipmentInvoiceController" ["fileName"]=> string(32) "ShipmentInvoiceController.groovy" ["lineNumber"]=> int(34) ["methodName"]=> string(11) "putInvoices" ["nativeMethod"]=> bool(false) } [4]=> object(stdClass)#1408 (5) { ["className"]=> string(56) "grails.plugin.cache.web.filter.PageFragmentCachingFilter" ["fileName"]=> string(30) "PageFragmentCachingFilter.java" ["lineNumber"]=> int(198) ["methodName"]=> string(8) "doFilter" ["nativeMethod"]=> bool(false) } [5]=> object(stdClass)#1410 (5) { ["className"]=> string(45) "grails.plugin.cache.web.filter.AbstractFilter" ["fileName"]=> string(19) "AbstractFilter.java" ["lineNumber"]=> int(63) ["methodName"]=> string(8) "doFilter" ["nativeMethod"]=> bool(false) } [6]=> object(stdClass)#1411 (5) { ["className"]=> string(50) "com.ml.public2private.filters.Public2PrivateFilter" ["fileName"]=> string(25) "Public2PrivateFilter.java" ["lineNumber"]=> int(65) ["methodName"]=> string(8) "doFilter" ["nativeMethod"]=> bool(false) } [7]=> object(stdClass)#1412 (5) { ["className"]=> string(29) "com.jsonp.filters.JsonpFilter" ["fileName"]=> string(16) "JsonpFilter.java" ["lineNumber"]=> int(58) ["methodName"]=> string(8) "doFilter" ["nativeMethod"]=> bool(false) } [8]=> object(stdClass)#1413 (5) { ["className"]=> string(29) "com.brandseye.cors.CorsFilter" ["fileName"]=> string(15) "CorsFilter.java" ["lineNumber"]=> int(82) ["methodName"]=> string(8) "doFilter" ["nativeMethod"]=> bool(false) } [9]=> object(stdClass)#1415 (5) { ["className"]=> string(39) "java.util.concurrent.ThreadPoolExecutor" ["fileName"]=> string(23) "ThreadPoolExecutor.java" ["lineNumber"]=> int(1142) ["methodName"]=> string(9) "runWorker" ["nativeMethod"]=> bool(false) } [10]=> object(stdClass)#1414 (5) { ["className"]=> string(46) "java.util.concurrent.ThreadPoolExecutor$Worker" ["fileName"]=> string(23) "ThreadPoolExecutor.java" ["lineNumber"]=> int(617) ["methodName"]=> string(3) "run" ["nativeMethod"]=> bool(false) } [11]=> object(stdClass)#1416 (5) { ["className"]=> string(16) "java.lang.Thread" ["fileName"]=> string(11) "Thread.java" ["lineNumber"]=> int(748) ["methodName"]=> string(3) "run" ["nativeMethod"]=> bool(false) } } ["status"]=> int(400) ["suppressed"]=> array(0) { } } }

     

    lembrando que estou enviando o conteúdo da nfe e não o arquivo em si, seguindo os passos dessa explicação que encontrei na documentação no seguinte link:https://developers.mercadolibre.com/pt_br/fulfillment-como-gerar-nota-fiscal-de-venda#Enviar-nota-fiscal-eletrônica

    Enviar nota fiscal eletrônica

    Com todas informações disponíveis, você deverá gerar a NFe (Nota Fiscal eletrônica). Depois de gerada, você deverá enviá-las para o Mercado Livre realizando um PUT conforme o exemplo a seguir:

    curl -X PUT -H "Content-Type: application/json" -H "Accept: application/json" -d
    
    '[{"data":"(inserte aquí el XML de la NFE)"}]'
    
    https://api.mercadolibre.com/shipments/{shipment_id}/invoices?access_token=YOUR_ACCESS_TOKEN

    No caso que o PUT seja correto você obterá 201 OK. Possiveis erros: XML sin cuerpo Result: {"message":"No invoices present","error":"no_invoices_present","status":400,"cause":null} XML mal formado Result: {"message":"Malformed XML","error":"malformed_xml","status":400,"cause":null} Con errores en los campos del XML: Result: {"message":"Invalid Invoice File","error":"invalid_invoice","status":400,"cause":null}

     


  4. Ao tentar enviar uma resposta de uma question pela função abaixo:

     

      public function answerQuestion($data = array()){
     
    $param = array(
          'access_token' => $this->accessToken,
          'question_id' => $data['question_id'],
          'text'         => $data['text'
    );
        
        $header = array(
          'Content-Type: application/json',
          'Content-Length: ' . strlen($param)
       );  
     
    $url = parent::$API_DOMAIN.'/answers';
    $answer = $this->callAPI($url,'POST', json_encode($param), $header);    
      
        return $answer;
     
      }   

    esta gerando o seguinte erro:

    2018-09-10 14:03:04 - Error =>forbidden - The caller is not authorizer to access the resource
    Url => https://api.mercadolibre.com/answers
    Metodo => POST
    Data => stdClass Object
    (
        [message] => The caller is not authorizer to access the resource
        [error] => forbidden
        [status] => 403
        [cause] => Array
            (
            )

    )

    Body => {"access_token":"blablablabla","question_id":"5778088684","text":"teste resposta"}

     

    ja verifiquei se poderia ser algo relacionado com o token mais usando o mesmo token eu consigo pesquisar itens pela api e também verifiquei se ao criar a api foi dada a permissão e estava tudo ok.

     

    Alguem pode me ajudar?


  5. 1 minute ago, mldev said:

    leia a documentação, não existe um pedido unico, cada item do carrinho é um pedido, com um unico shippment (pesquise sobre o assunto no fórum pois já foi discutido muito sobre isso aqui)

    eu pesquisei mais como n achei nd referente ao que esta com duvida resolvi postar aqui, porque so no mercado livre existe essa logica porca de não exibir as coisas tudo em um lugar obrigando fica fazendo N requisições para conseguir obter ver uma informação. O recurso de order/search para trabalhar com pedidos que forem carrinho de compra fica simplesmente ridículo de se trabalhar. mas mercado livre sendo mercado livre


  6. não amigo eu quero algo como o recurso orders/search onde ele me lista todos os pedidos, mas quando se usa carrinho ele n faz um unico pedido para o carrinho ele cria pedidos de acordo com a quantidade de itens que eu adicionei no carrinho ai quando eu uso o recurso orders/search ele me lista todos os id dos pedidos mas n tem como eu saber se algum deles é do mesmo carrinho.


  7. não esse recurso que você me mostrou eu ja utilizo para outras coisas mais no ml ao fazer um pedido de carrinho ele n me gera um único pedido com todos os itens, ele gera um pedido para cada item e junta tudo isso em um pacote, mas ao fazer a busca dos pedidos que foram feitos esses itens que estão no pacote aparecem separados ai tenho que fazer uma gambiarra surreal para saber se os itens são do mesmo pacote para descer eles como um único pedido.

    Seria isso que estou procurando algo onde eu conseguisse buscar os pacotes e listar os itens desses pacote


  8. Atualmente temos na api o recurso /orders/search onde ele me retorna uma lista com os pedidos, mas com a implementação do carrinho de compra existe algum lugar que eu consiga consultar todos os pedidos que foram feitos como carrinho de compra?


  9. 18 hours ago, mldev said:

    esqueça essa validação deles, é problemática

    estou percebendo isso mesmo porque estava utilizando da forma que descrevi acima já faz algum tempo passando pela função de validar e depois enviando e não estava dando nenhum problema e ontem começou isso do nada. Agradeço a ajuda.

    Você saberia informar se eles fazem alterações nessa parte da validação? Por que seria uma forma bacana de validar as informações antes de subir mas parece que funciona diferente. 


  10. 8 minutes ago, rodrigojob said:

    O ML colocará o free_shipping pelas políticas. Todo produto com valor acima de 120,00 tem frete grátis incluso automático

    Estou ciente disso mas porque ele esta pedindo para eu passar o mandatory_free_shipping dentro do meu post? ate onde eu entendo isso deveria ser adicionado automaticamente.

    E somente da o problema caso eu passe ele pela função de validação do mercado livre se eu enviar sem validar o anuncio sobre normalmente.


  11. ao enviar o produto e passar pela função de validate item da api do mercado livre ele me retorna o seguinte erro:

    item.shipping.mandatory_free_shipping - Mandatory free shipping added

    quando o preço do produto é maior que 120 reais.

    Se eu remover a opção da validateitem do mercado livre e enviar a informações é criado o anuncio sem nenhum problema alguém pode me ajudar com essa questão? 

     

    Segue abaixo as informações que estão sendo enviadas:

     

    Array ( 
    [title] => ARVORE NATAL BRANCA 2,10 mts 
    [pictures] => Array ( 
                [0] => Array ( [source] => http://programacao06/Trunk/eCommerceGenerico/image/data/eftr/Img_ftr_rp_25401.JPG?versao=0133d2eb4d54683f9239f1eb18cb9035 ) 
                [1] => Array ( [source] => http://programacao06/Trunk/eCommerceGenerico/image/data/eftr/Img_ftr_rp_113501.PNG?versao= ) 
                [2] => Array ( [source] => http://programacao06/Trunk/eCommerceGenerico/image/data/eftr/Img_ftr_rp_113601.JPG?versao= ) 
                [3] => Array ( [source] => http://programacao06/Trunk/eCommerceGenerico/image/data/eftr/Img_ftr_rp_113701.JPG?versao= ) 
                ) 
    [category_id] => MLB263781 
    [price] => 165.00 
    [currency_id] => BRL 
    [available_quantity] => 100 
    [buying_mode] => buy_it_now 
    [listing_type_id] => gold_special 
    [condition] => new 
    [description] => Array ( [plain_text] => ARVORE NATAL BRANCA Medida: 2,10 mts de altura com 450 galhos Imagem Ilustrativa ) 
    [shipping] => Array ( 
                    [mode] => me2 
                    [local_pick_up] => 1 
                    [methods] => Array ( ) 
                    [costs] => Array ( ) 
                    [free_methods] => Array ( ) 
                    ) 
    )