gbandoni

Members
  • Content Count

    152
  • Joined

  • Last visited

  • Days Won

    14

gbandoni last won the day on September 28

gbandoni had the most liked content!

1 Follower

About gbandoni

  • Rank
    Jedi Master

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. gbandoni

    Atributos value_name e value_id

    Você sempre precisa consultar a categoria porque elas mudam muito sem avisar Vou pegar um exemplo (Esculturas de bronze) que é uma categoria cheia de esquisitices https://api.mercadolibre.com/categories/MLB40186/attributes Veja esse atributo { "id": "CHARACTER", "name": "Personagem", "tags": { "catalog_required": true }, "hierarchy": "PARENT_PK", "relevance": 1, "value_type": "string", "value_max_length": 255, "values": [ { "id": "2489096", "name": "Mãe de Jesus" }, { "id": "2489097", "name": "Cavalo" }, { "id": "2489098", "name": "Dom Quixote" }, { "id": "2489099", "name": "Touro" }, { "id": "2489100", "name": "Buda" } ], "attribute_group_id": "OTHERS", "attribute_group_name": "Outros" } Veja que o value_type dele é "string" e mesmo assim ele tem opções nesse caso se tu anunciar uma estatua de touro tu deve informar value_id , se voce estiver vendendo uma sailor moon você vai usar value_name { "id": "ARTWORK_TYPE", "name": "Tipo de obra", "tags": { "catalog_required": true }, "hierarchy": "PARENT_PK", "relevance": 1, "value_type": "list", "values": [ { "id": "2489101", "name": "Original" }, { "id": "2489102", "name": "Réplica" } ], "attribute_group_id": "OTHERS", "attribute_group_name": "Outros" } Veja que esse atributo é do tipo "list" . Se tu informar value_name ele pode recusar ou vai ignorar (ja tive os dois casos) Aqui voce sempre informa value_id { "id": "MATERIAL_TYPE", "name": "Tipo de material", "tags": { "fixed": true }, "hierarchy": "FAMILY", "relevance": 1, "value_type": "string", "value_max_length": 255, "values": [ { "id": "2489113", "name": "Bronze" } ], "attribute_group_id": "OTHERS", "attribute_group_name": "Outros" } Por último olha esse atributo. Ele é do tipo string o que indicaria que você poderia colocar o que quisesse como value_name , certo ? Errado Veja que o produto tem em tags fixed = true . O que significa que o atributo é somente leitura (afinal essa é a categoria "estatua de bronze". Se tu informar um value_id aqui diferente de "2489113" ou um value_name diferente de Bronze ele vai retornar um erro. Dependendo da categoria não informar esse atributo , mesmo fixo , gera uma warning. Outros ele adiciona sozinho
  2. Se tu ficar dando downvote porque nao gostou da resposta ou porque não mastigaram a resposta para voce eu acho que cada vez menos pessoas vão te ajudar . Mesmo porque eu te respondi essa pergunta. Se não entendeu é porque falta conhecimento sobre a área fiscal .
  3. gbandoni

    Atributos value_name e value_id

    Resposta simples , se a atributo tem uma lista de opções tu usa value_id , se não tiver , value_name . As opções podem ser lidas fazendo um get em category
  4. Teu problema é conceito básico, não programação 1) O que seria o "sku"? O código interno do produto no ERP? O código do produto já anunciado no ML? Você informou (ou deve informar) o SKU nos atributos ele é a ligação do seu sistema com o mercado livre. Suponha que voce venda o mesmo produto num kit de uma peça ou 500 provavelmente os dados fiscais não se alteram por isso que tu associa os dados ao sku e não ao anúncio 2) Devo primeiro enviar um produto pela API e depois vincular os dados fiscais? Qual seria o sentido de enviar antes do anúncio ? 3) O id do anúncio já não é o produto/SKU? Não você emite nota fiscal usando o id do anúncio do Mercado Livre ? O mesmo conceito se aplica aqui 4) transaction_type (sale, inbound, devolution): o que exatamente devo enviar? Isso não é meio implícito ? SALE: Operação de venda de mercadoria INBOUND: Transferência de mercadoria para o centro de distribuição DEVOLUTION: Devolução de mercadoria 5) Como e onde faço o vínculo de PIS/COFINS? Tem o exemplo dos dois na documentação. Os termos são de conhecimento geral da esfera contábil. Se não é sua área de operação você deve usar uma consultoria ou no mínimo falar com seu contador 6) Campo "destinations": é enviado por produto? Por SKU? Por NCM? Por UF origem/destino. Se tu não entende esses conceitos é um erro tentar fazer isso sozinho. Tu pode levar multas pesadas no futuro 7) CFOP: deve ser informado por mim? Como? Onde? Isso está na documentação . Na minha operação varia pelo ncm do produto , estado de origem/destino e o regime tributario do comprador
  5. gbandoni

    Lista de Codigo de Erros

    Não tem que eu saiba
  6. Ou o vendedor fez alguma arte ou tem erro no cadastro dele . Em ambos os casos é melhor recorrer ao suporte do Mercado Livre https://developers.mercadolivre.com.br/support
  7. https://api.mercadolibre.com/items/MLB1129540610?include_attributes=all O atributo está lá , sinal que você fez tudo certo. Tentou preencher o atributo "seller_custom_field" ? Para alguns ele replica o conteudo de SELLER_SKU , para outros são entidades diferentes
  8. A mensagem é obvia você está informando um jsonobject no lugar de um array. Você sempre pode olhar um produto com variações e ver como é declarado nele https://api.mercadolibre.com/items/MLB833452456?include_attributes=all Compare os valores e veja o que esta fazendo de errado
  9. gbandoni

    Redirect URI para teste local

    Você permitiria que algo que envolva dinheiro seja feita sem no minimo ser uma página segura ? PS- Voce pode colocar um certificado auto assinado num servidor local para testar
  10. gbandoni

    Publicar anúncios no mercado livre

    Acesse aqui https://developers.mercadolibre.com/pt-br/api-docs-pt-br/produto-autenticacao-autorizacao depois aqui https://developers.mercadolibre.com/pt-br/api-docs-pt-br/publicacao-de-produtos
  11. gbandoni

    Problemas ao publicar envio personalizado

    Algumas categorias não aceitam custom , mesmo que sua conta aceite Olhando a categoria do seu anuncio https://api.mercadolibre.com/users/249633561/shipping_modes?category_id=MLB277346 Essa categoria não aceita custom
  12. gbandoni

    Problemas ao publicar envio personalizado

    ME2 é obrigatório Para usar ME1 você precisa de uma liberação direta do gerente comercial do mercado livre que te atende . Se está mudando , você não tem Depois eu vi que a sua pergunta era diferente . Se tu criar um anúncio pelo frontend e aparecer assim Não da para criar custom
  13. gbandoni

    Tracking Total Express ERRO/BUG

    Eu estou tendo esse problema também Passando x-format-new:true a consulta nao volta erro , mas nao volta a parte interessante
  14. gbandoni

    Erro 400 - Upload foto para servidor

    Só comentando JSONObject jsonFotos = new JSONObject(); File fileUpload = new File("C:/Users/Usuário/Documents/Fotos/123/foto1.jpg"; jsonFotos.put("file", fileUpload); Response r2 = m.post("/pictures?access_token=$ACCESS_TOKEN", params, jsonFotos.toString()); json gerado: {"file":"C:\\Users\\Usuário\\Documents\\Fotos\\123\\foto1.jpg"} Não sei bem o que é isso porque não sei o que é m. Mas te digo que jsonPhotos.tostring() esta totalmente errado você tem de subir um File ou um Iostreamer JSONObject jsonFotos = new JSONObject(); JSONArray arrayFoto = new JSONArray(); File fileUpload = new File("C:/Users/Usuário/Documents/Fotos/123/foto1.jpg"; arrayFoto.put(new JSONObject().put("source", fileUpload)); jsonFotos.put("pictures", arrayFoto); Response r2 = m.post("/pictures?access_token=$ACCESS_TOKEN", params, jsonFotos.toString()); json gerado: {"pictures":[{"source":"C:\\Users\\Usuário\\Documents\\Fotos\\123\\foto1.jpg"}]} Mesma coisa com mais comandos Já quando eu faço File fileUpload = new File("C:/Users/Usuário/Documents/Fotos/123/foto1.jpg"; jsonFotos.put("source", fileUpload); Response r2 = m.post("/pictures?access_token=$ACCESS_TOKEN", params, jsonFotos.toString()); Até vai, dá código 200, porém quando vínculo a foto ao item, nunca parece a foto real, também não aparece imagem processando, mas aparece uma foto com exclamação. Ainda é jsonFotos.toString() o problema. O problema aqui é que você não está entendendo como um serviço RESTFUL funciona. O problema principal é que tu ta pensando isso E acha que o arquivo vai como um dado convertido em texto (assim como nome vai aqui) . Não é assim que funciona . Por causa de um detalhe enctype="multipart/form-data" Isso significa para a requisição que cada parte é compartimentada (separada em compartimentos) . Quando o servidor le nome ele interpreta como um campo de texto (afinal foi dito que o type é "text") quando voce faz como você está tentando fazer isso é como se você tentasse enviar a imagem como se fosse um text e ou o servidor não vai entender ou vai corrompe-la . Afinal a imagem é um dado binário e não textual. Para o servidor entender tu deve enviar uma requisição do tipo Mime que é um jeito , a grosso modo , do servidor entender um arquivo binario. E todo o objeto MIME vai ser transmitido via o corpo da requisição e não nos dados do form. Lembra que eu te disse quando voce perguntou naquele topico e eu te falei do postman HttpResponse<String> response = Unirest.post("https://api.mercadolibre.com/pictures?access_token=XXXXX") .header("content-type", "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW") .header("Content-Type", "application/x-www-form-urlencoded") .header("cache-control", "no-cache") .header("Postman-Token", "108d9878-863b-410c-92cc-3cd902f42f43") .body("------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--") .asString(); repare nesses dois detalhes .header("content-type", "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW") veja o enctype que eu falei la atras. Ele fala que os dados da requisição estão em associação com um ponto do corpo chamado "----webkit..." .body("------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--") veja que não é put , é body pois a acoplagem é feita no corpo da requisição . Esse código é conceitualmente certo mas isso é uma droga de dar manutenção e ele ainda assume que você reparou o file ali no meio e voce vai converte-lo via mime e adicionar ao corpo. Se tu manda sempre o mesmo arquivo pode ser até "prático". Mas não funciona para imagens dinâmicas. Eu acho que unirest é uma boa library pois ela faz essas coisas para voce automaticamente (quase tudo ) No stackoverflow eu achei como fazer via jersey import java.io.File; import java.io.IOException; import java.nio.file.Files; import javax.ws.rs.core.MediaType; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.WebResource; import com.sun.jersey.api.client.config.ClientConfig; import com.sun.jersey.api.client.config.DefaultClientConfig; import com.sun.jersey.api.client.filter.LoggingFilter; import com.sun.jersey.core.util.Base64; import com.sun.jersey.multipart.FormDataMultiPart; import com.sun.jersey.multipart.file.FileDataBodyPart; import com.sun.jersey.multipart.impl.MultiPartWriter; public class MyClient { public static void main(String[] args) throws JSONException, IOException { MyClient my_client = new MyClient(); File file_upload = new File("local_file/file_name.pdf"); my_client.sendFileJSON(file_upload); } private void sendFileJSON(File file_upload) throws JSONException, IOException{ ClientConfig config = new DefaultClientConfig(); Client client = Client.create(config); client.addFilter(new LoggingFilter()); WebResource service = client.resource("my_rest_address_path"); JSONObject data_file = new JSONObject(); data_file.put("file_name", file_upload.getName()); data_file.put("description", "Something about my file...."); data_file.put("file", convertFileToString(file_upload)); ClientResponse client_response = service.accept(MediaType.APPLICATION_JSON).post(ClientResponse.class, data_file); System.out.println("Status: "+client_response.getStatus()); client.destroy(); } //Convert my file to a Base64 String private String convertFileToString(File file) throws IOException{ byte[] bytes = Files.readAllBytes(file.toPath()); return new String(Base64.encode(bytes)); } }
  15. gbandoni

    Recuperar código de rastreio

    https://api.mercadolibre.com/shipments/Seu_shipment/tracking?access_token={{token}} Plus , essa requisição contém o link de rastreamento