Guia de casos de uso da API de mensagens v1

Envie mensagens aos compradores sobre seus pedidos

O que é a API de mensagens?

The Selling Partner API for Messaging (Messaging API) allows you to create applications that enable sellers to send messages to buyers after they place an order. Sellers can send a variety of message types. These include asking order related questions, arranging a delivery, and more. The Messaging API can send messages to a buyer, even if the buyer has not contacted the seller first. However, you cannot use this API to respond to messages from buyers.

Refer to the Messaging API reference for a list of operations that correspond to the available message types.

Terminologia

URL pré-assinada do Amazon S3: Uma URL para um bucket do Amazon S3 para o qual você pode fazer upload de um objeto sem credenciais ou permissões de segurança da AWS. Você recebe uma URL pré-assinada do Amazon S3 em Etapa 7. Crie um destino de upload.

Disponibilidade de mensagens

Nem todos os tipos de mensagens estão disponíveis em todas as circunstâncias. Há vários fatores que podem afetar a disponibilidade da mensagem, incluindo se o pedido foi atendido, o tipo de vendedor ou o número de mensagens já enviadas para o pedido.

Fluxo de trabalho para enviar uma mensagem

O seguinte é para o usuário do aplicativo. O envio de uma mensagem é um processo de várias etapas que inclui chamadas para operações na API de mensagens e na API de uploads. Aqui está o fluxo de trabalho básico para enviar uma mensagem:

  1. Seu aplicativo exibe os pedidos recentes do vendedor, e o vendedor escolhe um pedido para o qual
    ele quer enviar uma mensagem ao comprador.

  2. Seu aplicativo exibe os tipos de mensagem que estão disponíveis para o pedido escolhido pelo vendedor. Obtenha os tipos de mensagens disponíveis ligando para o getMessagingActionsForOrder operação da API de mensagens.

  3. O vendedor escolhe um tipo de mensagem para o pedido.

  4. Se o tipo de mensagem permitir mensagens personalizadas, o vendedor insere uma mensagem personalizada.

  5. Se o tipo de mensagem permitir anexos, o vendedor envia um anexo para seu aplicativo. O vendedor também informa um nome de arquivo para o anexo.

  6. Se o vendedor fizer upload de um anexo em seu aplicativo, seu aplicativo enviará o anexo a um bucket do Amazon S3 executando as seguintes etapas:

    • Calcular um hash Content-MD5 para o anexo, o que é necessário para criar um destino de upload.

    • Criar um destino de upload chamando a operação createUploadDestination da API de Uploads.

    • Fazer o upload do anexo para o destino.

  7. Seu aplicativo solicita que uma mensagem seja enviada do vendedor para o comprador ligando para a operação que corresponde ao tipo de mensagem que o vendedor escolheu na etapa #3. Por exemplo, seu aplicativo chama o createConfirmOrderDetails operação se o vendedor escolher o tipo de mensagem “Confirmar detalhes do pedido”.

  8. A Amazon envia por e-mail uma mensagem do vendedor para o comprador.

    Veja o fluxo de trabalho detalhado no Tutorial: enviar uma mensagem.

Tutorial: enviar uma mensagem

Este tutorial ensina como criar um aplicativo que permite que um vendedor envie uma mensagem para um comprador.

Pré-requisitos

Para concluir este tutorial, você precisa:

Etapa 1. Obter o pedido para o qual o vendedor deseja enviar uma mensagem

  1. Exibe uma lista dos pedidos recentes do vendedor dentre os quais ele pode escolher.

  2. O vendedor escolhe um pedido do qual deseja enviar uma mensagem ao comprador.

  3. Associe um identificador de pedido da Amazon ao pedido escolhido pelo vendedor.

  4. Salve o identificador de pedido da Amazon para a Etapa 2. Obter uma lista dos tipos de mensagens disponíveis.

Etapa 2. Obter uma lista dos tipos de mensagens disponíveis

Chame a operação getMessagingActionsForOrder da API de mensagens, especificando o identificador de pedido da Amazon obtido na
Etapa 1. Obter o pedido para o qual o vendedor deseja enviar uma mensagem para obter uma lista dos tipos de mensagens que estão disponíveis para o pedido.

  1. Chame a operação getMessagingActionsForOrder da API de mensagens, passando os seguintes parâmetros:

Parâmetro do caminho:

Parâmetro Descrição Obrigatório
amazonOrderId Um identificador de pedido da Amazon. Isso especifica o pedido do qual uma mensagem será enviada. Obtenha esse valor na Etapa 1. Obter o pedido para o qual o vendedor deseja enviar uma mensagem.

Tipo: string

Sim

Parâmetro de consulta:

Parâmetro Descrição Obrigatório
marketplaceIds Um identificador de marketplace. Isso especifica o marketplace no qual o pedido foi feito. Você pode especificar somente um marketplace.

Tipo: matriz [string]

Sim

Exemplo de solicitação

GET https://sellingpartnerapi-na.amazon.com/messaging/v1/orders/902-6786204-8179805?marketplaceIds=ATVPDKIKX0DER

Resposta

O esquema de resposta da operação getMessagingActionsForOrder.

NomeDescriçãoSchema
_links
optional
Um objeto cujos nomes de propriedade são tipos de relação de link e os valores são um objeto de link ou uma matriz de objetos de link. O recurso de assunto desses links é o Objeto de recurso, do qual o objeto “_links” que o contém é uma propriedade._links
_embedded
optional
Um objeto cujos nomes de propriedades são tipos e valores de relação de link e são um Objeto de recurso ou uma matriz de Objetos de recurso. Os recursos incorporados podem ser uma versão completa, parcial ou inconsistente da representação fornecida pelo URI de destino._embedded
errors
optional
Uma lista de respostas de erro retornadas quando uma solicitação não é bem-sucedida.ErrorList

_links

NomeDescriçãoSchema
self
required
Corresponde à relação “própria” registrada pela IANA, cujo alvo é o URI do recurso.LinkObject
actions
required
Ações elegíveis para o AmazonOrderID especificado.< LinkObject > array


_embedded

NomeSchema
actions
required
Matriz < GetMessagingActionResponse >

Exemplo de resposta

{ "_links": { "actions": [ { "href": "/messaging/v1/orders/902-6786204- 8179805/messages/confirmCustomizationDetails?marketplaceIds=ATVPDKIKX0 DER", "name": "confirmCustomizationDetails" }, { "href": "/messaging/v1/orders/902-6786204- 8179805/messages/negativeFeedbackRemoval?marketplaceIds=ATVPDKIKX0DER" , "name": "negativeFeedbackRemoval" }, { "href": "/messaging/v1/orders/902-6786204- 8179805/messages/confirmOrderDetails?marketplaceIds=ATVPDKIKX0DER", "name": "confirmOrderDetails" }, ], "self": { "href": "/messaging/v1/orders/902-6786204- 8179805?marketplaceIds=ATVPDKIKX0DER" } }, "_embedded": { "actions": [ { "_links": { "schema": { "href": "/messaging/v1/orders/902-6786204-8179805/messages/confirmCustomizationDetails/schema", "name": "confirmCustomizationDetails" }, "self": { "href": "/messaging/v1/orders/902-6786204-8179805/messages/confirmCustomizationDetails?marketplaceIds=ATVPDKIKX0DER", "name": "confirmCustomizationDetails" } }, "_embedded": { "schema": { "_links": { "self": { "href": "/messaging/v1/orders/902-6786204-8179805/messages/confirmCustomizationDetails/schema", "name": "confirmCustomizationDetails" } }, "type": "object", "name": "confirmCustomizationDetails", "title": "Confirm customization details", "description": "Ask your customer to provide details or verify the customization input provided (name spelling, imagery, initials).", "properties": { "attachments": { "type": "array", "items": { "type": "object", "required": [], "properties": { "fileName": { "type": "string" }, "id": { "type": "string" } } }, "title": "Add attachment", "description": "You can upload text files, PDFs, Word documents, and these image file types: .jpg, .gif, and .png. The total size of attachments must be less than 10 MB.", "x-ui-field-type": "attachments", "maxItems": 5 }, "rawMessageBody": { "type": "string", "title": "Explain why you are contacting and any action you need your customer to take. ", "description": "800 character limit. Only links related to order completion are allowed, no HTML or email addresses.", "x-ui-field-type": "text", "minLength": 1, "maxLength": 800 } }, "required": [ "attachments", "rawMessageBody" ], "$schema": "http://json-schema.org/draft-04/schema#", "x-ui-hidden": null } }, "name": "confirmCustomizationDetails", "title": "Confirm customization details" }, { "_links": { "schema": { "href": "/messaging/v1/orders/902-6786204-8179805/messages/negativeFeedbackRemoval/schema", "name": "negativeFeedbackRemoval" }, "self": { "href": "/messaging/v1/orders/902-6786204-8179805/messages/negativeFeedbackRemoval?marketplaceIds=ATVPDKIKX0DER", "name": "negativeFeedbackRemoval" } }, "_embedded": { "schema": { "_links": { "self": { "href": "/messaging/v1/orders/902-6786204-8179805/messages/negativeFeedbackRemoval/schema", "name": "negativeFeedbackRemoval" } }, "type": "object", "name": "negativeFeedbackRemoval", "title": "Request to update negative feedback", "description": "Ask your customer to consider updating their seller feedback rating. You may only send this once per order.", "properties": {}, "required": [], "$schema": "http://json-schema.org/draft-04/schema#", "x-ui-hidden": true } }, "name": "negativeFeedbackRemoval", "title": "Request to update negative feedback" }, { "_links": { "schema": { "href": "/messaging/v1/orders/902-6786204-8179805/messages/confirmOrderDetails/schema", "name": "confirmOrderDetails" }, "self": { "href": "/messaging/v1/orders/902-6786204-8179805/messages/confirmOrderDetails?marketplaceIds=ATVPDKIKX0DER", "name": "confirmOrderDetails" } }, "_embedded": { "schema": { "_links": { "self": { "href": "/messaging/v1/orders/902-6786204-8179805/messages/confirmOrderDetails/schema", "name": "confirmOrderDetails" } }, "type": "object", "name": "confirmOrderDetails", "title": "Confirm order details", "description": "Ask your customer a specific order-related question prior to shipping their order.", "properties": { "rawMessageBody": { "type": "string", "title": "Explain why you are contacting and any action you need your customer to take. ", "description": "2000 character limit. Only links related to order completion are allowed, no HTML or email addresses.", "x-ui-field-type": "text", "minLength": 1, "maxLength": 2000 } }, "required": [ "rawMessageBody" ], "$schema": "http://json-schema.org/draft-04/schema#", "x-ui-hidden": null } }, "name": "confirmOrderDetails", "title": "Confirm order details" }, ] } }
  1. Salve a lista de esquemas na matriz de _embedded.actions da resposta. Na seção _embedded.schema de cada elemento da matriz, você pode encontrar um esquema para cada tipo de mensagem disponível. Use o valor de title em cada esquema para criar uma lista de tipos de mensagens disponíveis para o vendedor escolher na Etapa 3. Obter a escolha do tipo de mensagem do vendedor. Use os esquemas para entender como exibir e aplicar as restrições para mensagens e anexos personalizados que se aplicam a cada tipo de mensagem. Para obter mais informações, consulte Etapa 4. Receber uma mensagem de texto personalizada do vendedor (se houver suporte) e Etapa 5. Obter um anexo do vendedor (se houver suporte).

  2. Salve a lista de caminhos na matriz de _links.actions da resposta. O valor de href em cada elemento da matriz contém um caminho para cada tipo de mensagem disponível. Você pode usar um desses caminhos em uma chamada para a operação apropriada na Etapa 9. Enviar uma mensagem ao comprador.

Etapa 3. Obter a escolha do tipo de mensagem do vendedor

  1. Exiba uma lista dos tipos de mensagens disponíveis para o vendedor escolher. Obtenha-os dos valores de title que você salvou na Etapa 2. Obter uma lista dos tipos de mensagens disponíveis.

  2. Deixe que o vendedor escolha o tipo de mensagem que deseja enviar e salve-o. Essa escolha afetará várias etapas subsequentes, incluindo:

Etapa 4. Receber uma mensagem de texto personalizada do vendedor (se for suportada)

Alguns tipos de mensagem permitem que o vendedor inclua uma mensagem personalizada no e-mail para o comprador. Para descobrir se um tipo de mensagem permite mensagens personalizadas, consulte a referência de API de mensagens para encontrar a operação que corresponde ao tipo de mensagem. Por exemplo, a operação createConfirmServiceDetails corresponde ao tipo de mensagem “Contatar o cliente do Home Service”. Se a operação incluir um parâmetro de corpo de texto, o tipo de mensagem permitirá mensagens personalizadas.

  1. Determine se o tipo de mensagem que o vendedor escolheu na Etapa 3. Obter a escolha do tipo de mensagem do vendedor permite mensagens personalizadas. Se as mensagens personalizadas não forem suportadas, vá diretamente para Etapa 5. Obter um anexo do vendedor (se for suportado). Se mensagens personalizadas forem permitidas, continue com esse procedimento.

  2. Permita que o vendedor insira o texto bruto que deseja para a mensagem personalizada.

  3. Exiba e aplique quaisquer restrições ao texto da mensagem inserida pelo vendedor. Você pode encontrar as restrições de texto na seção _embedded.schema.properties.rawMessageBody do elemento de matriz de _embedded.actions que corresponde ao tipo de mensagem do vendedor. Encontre isso na resposta da operação getMessagingActionsForOrder na Etapa 2. Obter uma lista dos tipos de mensagens disponíveis.

  4. Salve o texto da mensagem e use-o como entrada para Etapa 9. Enviar uma mensagem para o comprador.

Etapa 5. Obter um anexo do vendedor (se for suportado)

Alguns tipos de mensagem permitem que o vendedor inclua um link para um anexo no e-mail para o comprador. Para descobrir se um tipo de mensagem permite anexos, consulte a referência de API de mensagens para encontrar a operação que corresponde ao tipo de mensagem. Por exemplo, a operação createWarranty corresponde ao tipo de mensagem “Enviar informações de garantia”. Se a operação incluir um parâmetro de corpo de anexos, o tipo de mensagem permitirá anexos.

  1. Determine se o tipo de mensagem que o vendedor escolheu na Etapa 3. Obter a escolha do tipo de mensagem do vendedor permite anexos. Se os anexos não forem suportados, vá diretamente para Etapa 9. Enviar uma mensagem para o comprador. Se forem permitidos anexos, continue com esse procedimento.

  2. Permita que o vendedor envie um anexo para seu aplicativo.

  3. Exiba e aplique quaisquer restrições ao anexo enviado pelo vendedor. Você pode encontrar as restrições de anexo na seção _embedded.schema.properties.attachments do elemento de matriz de _embedded.actions que corresponde ao tipo de mensagem do vendedor. Encontre isso na resposta da operação getMessagingActionsForOrder na Etapa 2. Obter uma lista dos tipos de mensagens disponíveis.

  4. Converta o anexo em um fluxo de entrada e salve-o para a Etapa 8. Fazer upload do anexo.

  5. Permita que o vendedor insira um nome de arquivo para o anexo, incluindo a extensão do arquivo.

  6. Salve o nome do arquivo e use-o como entrada para Etapa 9. Enviar uma mensagem para o comprador.

Etapa 6. Calcular um hash Content-MD5

Calcule um hash Content-MD5 para o anexo a partir de Etapa 5. Obter um anexo do vendedor (se for suportado). Você precisará dele para criar um destino de upload na Etapa 7. Criar um destino de upload.

O código de amostra Java nesta etapa contém a lógica para calcular um hash Content-MD5. Esse código de exemplo usa o cliente HTTP Apache.

  1. Use o seguinte como entrada para o código de amostra:

• O fluxo de entrada de anexo da Etapa 5. Obter um anexo do vendedor (se for suportado) é o argumento para o parâmetro fis do método computeContentMD5Value da classe CreateMD5.

  1. Salve o valor md5Content a ser passado com o parâmetro Content-MD5 na Etapa 7. Criar um destino de upload.

Exemplo de código Java

package io.swagger.client.util; import java.io.FileInputStream; import java.io.IOException; import java.security.DigestInputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class CreateMD5 { public static String computeContentMD5Value(FileInputStream fis) throws IOException, NoSuchAlgorithmException { DigestInputStream dis = new DigestInputStream(fis, MessageDigest.getInstance("MD5")); byte[]buffer = new byte[8192]; while (dis.read(buffer) > 0); String md5Content = new String(org.apache.commons.codec.binary.Base64 .encodeBase64(dis.getMessageDigest().digest())); // Effectively resets the stream to be beginning of the file // via a FileChannel. fis.getChannel().position(0); return md5Content; } }

Etapa 7. Criar um destino de upload

Chame a operação createUploadDestination da API de Uploads para criar um destino de upload para seu anexo, na forma de um URL pré-assinado do Amazon S3. Para obter definições, consulte Terminologia.

  1. Chame a operação createUploadDestination da API de Uploads, passando os seguintes parâmetros:

Parâmetros de consulta:

TypeNomeDescriçãoSchema
QuerymarketplaceIds
required
Uma lista de identificadores de mercado. Isso especifica os mercados em que o upload estará disponível. Somente um mercado pode ser especificado.
Contagem máxima : 1
< fio > matriz
QueryConteúdo MD5
required
O hash Content-MD5 que você calculou em Etapa 6. Calcular um hash de conteúdo MD5.string
Pathrecurso
required
O recurso para o destino de upload que você está criando. Por exemplo, se você estiver criando um destino de upload para a operação CreateLegalDisclosure da API Messaging, o {resource} seria /messaging/v1/orders/{amazonOrderId}/messages/legalDisclosure, e todo o caminho seria /uploads/2020-11-01/uploadDestinations/messaging/v1/orders/{amazonOrderId}/messages/legalDisclosure. Se você estiver criando um destino de upload para um documento de conteúdo do Aplus, o {resource} seria aplus/2020-11-01/contentDocuments e o caminho seria /uploads/v1/uploadDestinations/aplus/2020-11-01/contentDocuments.string
QuerycontentType
optional
O tipo de conteúdo do arquivo a ser carregado.string

Exemplo de solicitação

POST https://sellingpartnerapi-na.amazon.com/uploads/2020-11-01/uploadDestinations/messaging/v1/orders/7XX-5XXXXX-8XXXXXX/messages/invoice?marketplaceIds=A2Q3Y263D00KWC&contentMD5=qCcR3o%2BU0FUR1%2BgXhApNfQ%3D%3D

Resposta

O esquema de resposta da operação createUploadDestination.

NomeDescriçãoSchema
payload
optional
Informações sobre um destino de upload.UploadDestination
errors
optional
Uma lista de respostas de erro retornadas quando uma solicitação não é bem-sucedida.ErrorList

Exemplo de resposta

{ "payload": { "uploadDestinationId": "sc/7ae2d3b1-fdd3-42c4-98c4-9cc509fb95d8.png", "url": "https://aplus-media.s3.amazonaws.com/?x-amz-date=20201116T184623Z&x-amz-signature=c5c8efd95d883b6787a2b1a93c7c066f01cb4e8d7be3ece4360aa800332e0cf9&x-amz-meta-owner=A2CZ04NGKYDXDV&acl=private&key=sc/7ae2d3b1-fdd3-42c4-98c4-9cc509fb95d8.png&x-amz-algorithm=AWS4-HMAC-SHA256&policy=eyJjb25kaXRpb25zIjpbeyJidWNrZXQiOiJhcGx1cy1tZWRpYS1iZXRhIn0seyJrZXkiOiJzb3RhLzdhZTJkM2IxLWZkZDMtNDJjNC05OGM0LTljYzUwOWZiOTVkOC5wbmcifSx7ImFjbCI6InByaXZhdGUifSx7IngtYW16LW1ldGEtb3duZXIiOiJBMkNaMDROR0tZRFhEViJ9LHsieC1hbXotYWxnb3JpdGhtIjoiQVdTNC1ITUFDLVNIQTI1NiJ9LHsieC1hbXotY3JlZGVudGlhbCI6IkFLSUE2TDZSN1FFNTZGNkdNRzVFLzIwMjAxMTE2L3VzLWVhc3QtMS9zMy9hd3M0X3JlcXVlc3QifSx7IngtYW16LWRhdGUiOiIyMDIwMTExNlQxODQ2MjNaIn0sWyJjb250ZW50LWxlbmd0aC1yYW5nZSIsMSwzMTQ1NzI4XV0sImV4cGlyYXRpb24iOiIyMDIwLTExLTE2VDIxOjQ2OjIzLjg2OFoifQ==&x-amz-credential=AKIA6L6R7QE56F6GMG5E/20201116/us-east-1/s3/aws4_request", "headers": { "Content-MD5": "1jnGuPv7xwPiat6NesKL/w==" } } }
  1. Salve os seguintes valores:

Etapa 8. Fazer upload do anexo

Faça o upload para um bucket do Amazon S3 do anexo que o vendedor enviou para seu aplicativo na Etapa 5. Obter um anexo do vendedor (se for suportado).

O código de amostra Java nesta etapa contém a lógica para fazer o upload de um anexo. Esse código de exemplo usa o cliente HTTP Apache.

Use o seguinte como entrada para o código de amostra:

Exemplo de código Java

package io.swagger.client.util; import java.io.IOException; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; import java.util.Map; import io.swagger.client.model.CreateUploadDestinationResponse; public class UploadFileToDestination { private static String requestMethod = "PUT"; private static String contentType = "Content-Type"; private static String contentValue = "application/text"; private static URL url; private static Map < String, String > headers; /* Upload file to destination using the response returned in CreateUploadDestination. Reference https://docs.aws.amazon.com/AmazonS3/latest/dev/PresignedUrlUploadObjectJavaSDK.html) */ public static void uploadFileInDestination( CreateUploadDestinationResponse uploadDestinationPayload) throws IOException { url = new URL(uploadDestinationPayload.getPayload().getUrl()); headers = (Map < String, String > )uploadDestinationPayload.getPayload() .getHeaders(); // Create the connection and use it to upload the new object using the // pre-signed URL. HttpURLConnection connection = (HttpURLConnection)url.openConnection(); connection.setDoOutput(true); connection.setRequestMethod(requestMethod); connection.setRequestProperty(contentType, contentValue); // headers that are returned in createDestination call for (Map.Entry < String, String > headersEntry: headers.entrySet()) { connection.setRequestProperty(headersEntry.getKey(), headersEntry.getValue()); } OutputStreamWriter out = new OutputStreamWriter( connection.getOutputStream()); out.write("Text of the file"); out.close(); // Check the HTTP response code. To complete the upload and make the // object available, // you must interact with the connection object in some way. connection.getResponseCode(); System.out.println("HTTP response code: " + connection.getResponseCode() + connection.getResponseMessage()); connection.disconnect(); } }

O anexo é enviado para o bucket do Amazon S3.

Etapa 9. Enviar uma mensagem para o comprador

To send a message from the seller to the buyer you need to call the operation that corresponds to the message type that the seller chose in Step 2. Get a list of available message types. For example, if the seller chose the "Confirm customization details" message type, you would call the confirmCustomizationDetails operation. Refer to the Messaging API reference for the list of operations that are available. In this example, we will call the confirmCustomizationDetails operation.

  1. Chame a operação confirmCustomizationDetails da API de mensagens, passando os seguintes parâmetros:

Parâmetro de caminho:

Parâmetro Descrição Obrigatório
amazonOrderId Um identificador de pedido da Amazon. Isso especifica a ordem para a qual uma mensagem deve ser enviada. Use o identificador de pedido da Amazon que você salvou na Etapa 1. Obter o pedido para o qual o vendedor deseja enviar uma mensagem.

Tipo: string

Sim

Parâmetro de consulta:

Parâmetro Descrição Obrigatório
marketplaceIds Um identificador de marketplace. Isso especifica o marketplace no qual o pedido foi feito. Você pode especificar somente um marketplace.

Tipo: matriz [string]

Sim

Parâmetro do corpo:

Parâmetro Descrição Obrigatório
text A mensagem personalizada a ser incluída no e-mail para o comprador. Use o texto da mensagem de Etapa 4. Receber uma mensagem de texto personalizada do vendedor (se for suportada).

Tipo: string

Sim
attachments Anexos a serem incluídos na mensagem para o comprador Sim

Exemplo de solicitação

POST https://sellingpartnerapi-na.amazon.com/messaging/v1/orders/902-6786204-8179805/messages/confirmCustomizationDetails?marketplaceIds=ATVPDKIKX0DER { "text": "This is the message from the seller to the buyer that will appear in the email to the buyer.", "attachments": [ { "uploadDestinationId": "4370d51b-2954-445c-9f30-EXAMPLE6b9de", "fileName": "example.txt" } ] }

Resposta

Não há resposta. Em vez disso, a Amazon envia por e-mail a mensagem do vendedor para o comprador.


Esta página ajudou você?