Serviços da Web de distribuição digital (DDWS) GetInvoice
Transcrição
Serviços da Web de distribuição digital (DDWS) GetInvoice
Serviços da Web de distribuição digital (DDWS) GetInvoice - Manual do serviço ÍNDICE 1 Introdução ...................................................................................................................................................... 3 1.1 Visão geral ............................................................................................................................................. 3 1.2 Documentos de suporte ........................................................................................................................ 3 2 Introdução ...................................................................................................................................................... 3 3 Visão geral do serviço Obter fatura ................................................................................................................ 3 4 3.1 GetInvoiceList ........................................................................................................................................ 5 3.2 GetInvoiceDetails .................................................................................................................................. 5 3.3 Vantagens do serviço GetInvoice .......................................................................................................... 5 Informações de referência do serviço GetInvoice .......................................................................................... 6 4.1 Nota sobre vários CSNs ........................................................................................................................ 6 4.2 Esquema de solicitação ......................................................................................................................... 7 4.3 Esquema de resposta ............................................................................................................................ 7 4.3.1 GetInvoiceList .................................................................................................................................... 7 4.3.2 GetInvoiceDetails............................................................................................................................... 8 4.4 Esquema de erro ................................................................................................................................. 10 4.5 Mensagem de solicitação .................................................................................................................... 10 4.5.1 Mensagem de solicitação - GetInvoiceList ...................................................................................... 10 4.5.2 Mensagem de solicitação - GetInvoiceDetails ................................................................................ 11 4.6 4.6.1 Mensagem de resposta - GetInvoiceList ......................................................................................... 12 4.6.2 Mensagem de resposta - GetInvoiceDetails ................................................................................... 12 4.7 4.7.1 5 Mensagem de resposta ....................................................................................................................... 12 Mensagens de erro .............................................................................................................................. 17 Amostra de resposta de erro ........................................................................................................... 18 Apêndice ...................................................................................................................................................... 18 5.1 Código C# para inserir vários CSNs ................................................................................................... 18 5.1.1 Programa principal........................................................................................................................... 18 5.1.2 Classe de Utilitários ......................................................................................................................... 19 5.1.3 POCOs ............................................................................................................................................ 23 Histórico de revisão Versão 2.1 Data 22/10/2015 Autor Aline Romero Comentários Seção Histórico de revisão adicionada 2 | Manual de referência do serviço da Web 1 Introdução 1.1 Visão geral A plataforma do Serviço da Web de distribuição digital (DDWS) é uma solução para realização de pedidos criada diretamente por nossos Parceiros para a Autodesk, com pouco toque dos Parceiros e nenhum toque da Autodesk.Este novo recurso de negócios permitirá as transações de serviço Web B2B verdadeiras entre os Parceiros e a Autodesk. Para os Parceiros têm a implementação efetiva da Plataforma de serviços digitais da Autodesk, as afiliadas precisarão ter familiaridade com os serviços da Web REST, o OAuth e o JSON. Uma amostra de um aplicativo de cliente é fornecida (gravado na linguagem Ruby) em um documento Guia de programação, que ajudarão os chamados desenvolvedores afiliados a consumirem a API do serviço digital. 1.2 Documentos de suporte 2 Guia do desenvolvedor para parceiros da Autodesk: este guia ajuda os Parceiros no processo de apresentação e no acesso aos serviços do DDWS. O guia também serve para apresentar aos Parceiros a Plataforma de serviços digitais da Autodesk, usando instruções passo a passo que os orientam nas atividades iniciais necessárias para integração. Documentação da API de autenticação: este documento orientará os Parceiros pelo processo de geração de credenciais, assinaturas e tokens de acesso necessários para usar as APIs do serviço. Ele também contém informações para o desenvolvimento de um aplicativo de integração de um Parceiro. Ele fornece a compreensão básica da integração do serviço da Web e demonstra o desenvolvimento de um aplicativo típico. Introdução Como parte do processo de apresentação, os Parceiros serão associados a um único Número específico do cliente (CSN) e terão seu aplicativo registrado com a Autodesk. Para obter mais detalhes sobre o processo de integração, consulte o Guia do desenvolvedor para parceiros da Autodesk. 3 Visão geral do serviço Obter fatura Pode haver situações em que o solicitante que faz a entrada tem um intervalo de datas (de data e para data). Nesse caso, o serviço não pode fornecer todos os detalhes da fatura para um determinado período, pois há uma chance de ter uma quantidade enorme de faturas durante um determinado período. Há duas operações definidas neste serviço para pesquisa de faturas: getInvoiceList getInvoiceDetails 3 | Manual de referência do serviço da Web O diagrama acima é uma indicação do serviço getInvoice. Ao implementar a plataforma de serviços digitais da Autodesk, você pode tornar seus processos mais eficientes. A próxima série de gráficos ilustra uma experiência do usuário com a loja da Web. Esta primeira captura de tela mostra como a operação getInvoiceList será chamada. Os clientes vão inserir um intervalo de datas para obter as faturas correspondentes a um determinado período. Com base nessa entrada, todas as faturas que estão nesse intervalo de datas serão exibidas para o cliente. Depois de obter a lista de faturas, os clientes podem obter os detalhes da fatura para um número de fatura, número de ordem de compra, número do pedido de vendas específico, como mostrado a seguir na captura de tela. 4 | Manual de referência do serviço da Web 3.1 GetInvoiceList A finalidade desta operação é obter a lista de faturas de um sistema de back-end se a entrada inclui somente um intervalo de datas. Depois que o solicitante receber a resposta, ele(a) chamará getInvoiceDetails usando Número da fatura / Número da ordem de compra / Número do pedido de vendas como entrada. As seguintes entradas são necessárias para executar o serviço: 1. customer_number 2. invoice_date_from 3. invoice_date_to 3.2 GetInvoiceDetails A finalidade desta operação é obter os detalhes da fatura de uma entrada especificada. Esta operação pode ser chamada usando os seguintes conjuntos de entradas: 1. customer_number e purchase_order_number/ invoice_number / sales_order_number Se todos os três parâmetros (po_number, invoice_number e order_number) estão presentes em uma solicitação de serviço, a prioridade dos critérios de pesquisa será definida da seguinte maneira: 1. invoice_number (baixo) 2. purchase_order_number 3. sales_order_number (baixo) Nota: apenas uma fatura válida será preenchida como parte da resposta da API GetInvoice. 3.3 Vantagens do serviço GetInvoice 1. Um serviço da Web REST leve que podem ser consumido facilmente em qualquer aplicativo por meio da conexão HTTP(s). 5 | Manual de referência do serviço da Web 2. A capacidade de recuperar as informações da fatura por Parceiros quando necessário, eliminando a necessidade de procurar as faturas em PDF em e-mails ou dados de EDI IDoc. 3. O serviço fornece flexibilidade para os Parceiros procurarem faturas dentro de intervalos de datas específicos ou fornecendo números de fatura, de ordem de compra ou de pedido 4. Os Parceiros podem personalizar a data da fatura e o plug-in do sistema interno conforme necessário. 4 Informações de referência do serviço GetInvoice 4.1 Nota sobre vários CSNs O serviço GetInvoice oferece suporte a apenas um único customer_number (CSN) por solicitação. Se um Parceiro tiver vários CSNs, esse Parceiro deverá poder chamar o serviço várias vezes para obter as informações correspondentes. Uma forma de fazer isso seriar programa um loop em sua conexão de aplicativo que executa o serviço GetInvoice uma vez para cada CSN disponível. É importante que um script assim também controle a geração de credenciais e os tokens de acesso de cada chamada. Um exemplo de um script assim pode ser encontrado na seção Apêndice deste Manual de referência do serviço. Abaixo, incluímos o segmento relevante do dito exemplo. // Looping through each CSN var container = new List<ResponseContainer>(); foreach (var csn in credentials.CSNs) { // Signing partner's credentials var firstSignature = Utils.GetFirstSignature(credentials); // Sending request to OAuth server to generate an Access Token var tokenDetails = Utils.CallOAuthEndPoint(firstSignature); // Signing Access Token var secondSignature = Utils.GetSecondSignature(tokenDetails, credentials); // Calling Get Invoice WebService var endPoint = string.Format("https://enterprise-apistg.autodesk.com/v1/invoices?customer_number={0}&invoice_date_from=2015-0801&invoice_date_to=2015-09-01", csn); var invoice = Utils.GetInvoices(endPoint, secondSignature, csn); // Storing WebService's response var invoiceContainer = JsonConvert.DeserializeObject<InvoiceContainer>(invoice); container.Add(new ResponseContainer { CSN = csn, Response = invoiceContainer }); } // Writing response to file var json = JsonConvert.SerializeObject(container, Formatting.Indented); Utils.WriteJsonToFile(json); 6 | Manual de referência do serviço da Web 4.2 Esquema de solicitação Os detalhes dos Parâmetros de mensagem de solicitação na tabela a seguir para getInvoiceList() e getInvoiceDetails(). Elementos de getIInvoiceDetails() Elementos de getInvoiceList() Elemento customer_number Invoice_date_from invoice_date_to customer_number invoice_number purchase_order_numb er sales_order_number Tipo de campo Comprimento/formato de entrada Sequência de caracteres Comprimento: máx. 10 caracteres Obrigatório Data Formato: ISO 8601 AAAA-MM-DD Obrigatório Data Formato: ISO 8601 AAAA-MM-DD Obrigatório Comprimento: máx. 10 caracteres Obrigatório Sequência de caracteres Sequência de caracteres Sequência de caracteres Sequência de caracteres Utilização Comprimento: máx. 10 caracteres Qualquer um ou todos podem ser passados com o customer_number Comprimento: máx. 10 caracteres 4.3 Esquema de resposta 4.3.1 GetInvoiceList Nome do campo invoice_number bill_to_customer purchase_order_number invoice_date Descrição Número da fatura Número do cliente 1 Número da ordem de compra do cliente Data de publicação no documento Formato: ISO 8601 AAAA-MM-DD transaction_type invoice_total_amount invoice_currency account_doc_description customer_po_number sales_order_number Descrição do tipo de documento Quantidade na moeda do documento Chave da moeda Texto do item Número da ordem de compra do cliente Número do documento de vendas e distribuição 7 | Manual de referência do serviço da Web 4.3.2 GetInvoiceDetails Nome do campo Descrição Dados de cabeçalho da fatura (invoice_header) invoice_date Data de cobrança para o índice de cobrança e a impressão Formato: ISO 8601 invoice_number po_date Número do documento de vendas e distribuição Data da ordem de compra do cliente Formato: ISO 8601 order_date Data do pedido de vendas Formato: ISO 8601 AAAA-MM-DD purchase_order_number customer_po_number transaction_type ship_date Número da ordem de compra do cliente Número da ordem de compra das informações de envio 20 caracteres Data Formato: ISO 8601 AAAA-MM-DD invoice_currency sales_order_number contract_number payment_term payment_due Moeda do documento SD Pedido Referência interna do cliente ou fornecedor Termos de pagamento Data de vencimento do pagamento Formato: ISO 8601 AAAA-MM-DD local_currency exchange_rate vat_number delivery_code delivery_description delivery_number numbers_of_items tax_amount tax_type tax_rate freight_charge tracking_number opportunity_id extra_po_identifier invoice_amount weight_total weight_uom reserve_header_field invoice_number line_number Sku Chave da moeda Taxa de troca para determinação de preços Número de registro IVA Incoterms (parte 1) Incoterms (parte 2) Entrega Número natural Valor de impostos na moeda do documento Tipo de taxa Taxa de impostos Custo de frete Número do Waybill ID da oportunidade Identificador de compra adicional Valor líquido na moeda do documento Peso total Unidade de peso Campo de cabeçalho de backup Dados de item da fatura (invoice_items) Documento de cobrança Item de cobrança Número do material 8 | Manual de referência do serviço da Web sku_description physical_media invoice_currency contract_start Texto curto para o item do pedido de vendas Valor de ELD do valor de caractere Moeda do documento SD Data de início do contrato Formato: ISO 8601 AAAA-MM-DD contract_end Data de término do contrato Formato: ISO 8601 AAAA-MM-DD Quantity quantity_uom Seats unit_price unit_discount net_value serial_number current_serial_number old_serial_number partner_subs_id vat_description reserve_item_field Quantidade cobrada realmente Unidade de medida base Número natural Preço unitário Desconto da unidade Valor líquido do item de cobrança na moeda do documento Número de série Número de série atual Número de série antigo N° de Subs do parceiro Texto de IVA Campo de item de backup Data de parceiro da fatura (invoice_partners) invoice_number Número do documento de vendas e distribuição line_number Item de cobrança partner_type Tipo de cliente partner_number Número do cliente 1 contact_number Número da pessoa de contato partner_name Nome Street Rua e número da residência po_box Caixa postal City Cidade postal_code CEP pobox_postal_code CEP da caixa postal Country Chave do país tel_number Primeiro número de telefone fax_number Número do fax District Distrito Region Região (Estado, Província e País) BankDetails (invoice_bankinfo) invoice_number Número do documento de vendas e distribuição name Nome do banco bank_keys Chaves do banco bank_number Número do banco bank_branchid Agência bancária bank_account_number Número da conta bancária currency Moeda do banco Número de conta bancária alternativa (para números de conta alternative_bank_account ambíguos) lockbox_number Número de LockBox 9 | Manual de referência do serviço da Web swiftcode iban bank_control_key country address city district region postalcode Código SWIFT para pagamentos internacionais IBAN (Número de conta bancária nternacional) Chave de controle do banco País tel_number Nº do telefone N° do fax Código info-ABI/código CAB/GIRO/código de classificação etc. adicional fax_number additional Endereço do banco Cidade Distrito Região (Estado, Província e País) CEP / Caixa postal 4.4 Esquema de erro Nome do campo status message transactionid Descrição Resposta de confirmação: "OK", "FALHA", "ERRO" Mensagem de falha ou erros ID exclusivo de transação (combinação de número da fatura e registro de data e hora) 4.5 Mensagem de solicitação Em função dos parâmetros de entrada, a operação getInvoiceList() ou getInvoiceDetails() será executada. Se a entrada tiver os parâmetros "de data" e "para data", getInvoiceList() será executado. Se a entrada tiver o Número da ordem de compra, o Número da fatura ou o Número do pedido de vendas, getInvoiceDetails() será executado. Abaixo estão as solicitações de amostra para as operações. 4.5.1 Mensagem de solicitação - GetInvoiceList http://enterprise-apistg.autodesk.com/v1/invoices?customer_number=5117338390&invoice_date_from=201406-01&invoice_date_to=2014-06-30 Message Headers Content-Type: application/json Authorization: Bearer <<Access Token>> CSN: <<CSN>> signature: <<Signed Access Token>> timestamp: <<Timestamp for the signed Access Token>> 10 | Manual de referência do serviço da Web 4.5.2 Mensagem de solicitação - GetInvoiceDetails http://enterprise-apistg.autodesk.com/v1/invoices?customer_number=5113338390&invoice_number=9052068717 Message Headers Content-Type: application/json Authorization: Bearer <<Access Token>> CSN: <<CSN>> signature: <<Signed Access Token>> timestamp: <<Timestamp for the signed Access Token>> OR http://enterprise-apistg.autodesk.com/v1/invoices?customer_number=5113338390&invoice_number=9052068717&sal es_order_number=7355393800 Message Headers Content-Type: application/json Authorization: Bearer <<Access Token>> CSN: <<CSN>> signature: <<Signed Access Token>> timestamp: <<Timestamp for the signed Access Token>> OR http://enterprise-apistg.autodesk.com/v1/invoices?customer_number=5113338390&invoice_number=905206871&pur chase_order_number=712100000424 Message Headers Content-Type: application/json Authorization: Bearer <<Access Token>> CSN: <<CSN>> signature: <<Signed Access Token>> timestamp: <<Timestamp for the signed Access Token>> OR http://enterprise-apistg.autodesk.com/v1/invoices?customer_number=5113338390&invoice_number=9052068717&sal es_order_number=7355393800&purchase_order_number=712100000424 Message Headers Content-Type: application/json Authorization: Bearer <<Access Token>> CSN: <<CSN>> signature: <<Signed Access Token>> timestamp: <<Timestamp for the signed Access Token>> 11 | Manual de referência do serviço da Web 4.6 Mensagem de resposta Nota: a Autodesk enviará uma resposta com a estrutura a seguir. Os Parceiros podem reformatar para diferentes estruturas de acordo com suas necessidades. 4.6.1 Mensagem de resposta - GetInvoiceList { "status": "OK", "transaction_id": "INV701765101433844843", "message": [ { "invoice_number": "9052238559", "purchase_order_number": "9833356789", "bill_to_customer": "5117444390", "invoice_date": "2014-06-11”, "customer_po_number": "", "transaction_type": "Invoice", "invoice_total_amount": 328.5, "invoice_currency": "USD", "account_doc_description": "", "sales_order_number": "7333403750" }, { "invoice_number": "9052158556", "purchase_order_number ": "7865345690", "bill_to_customer ": "5117338390", "invoice_date": "2014-06-24", "customer_po_number ": "", "transaction_type": "Invoice", "invoice_total_amount: 2161.53, "invoice_currency": "USD", "account_doc_description ": "", "sales_order_number ": "7052971819" } ] } 4.6.2 Mensagem de resposta - GetInvoiceDetails { "status": "OK", "transaction_id": "INV701765101433844843", "message": [ { "invoice_bankinfo": [ { 12 | Manual de referência do serviço da Web “invoice_number”:” 9044468717”, "name": "Merghle", "bank_keys": "", "bank_number": "", "bank_branchid": "", "bank_account_number": "", "currency": "", "alternative_bank_account": "", "lockbox_number": "", "swiftcode": "", “iban": "", "bank_control_key": "", "country": "", "address": "", "city": "Carol Stream, IL 60132-2188", “district”:””, "region": "", "postalcode": "", "tel_number":”", "fax_number ": "", "additional": "MAIL PAYMENTS TO: AUTODESK, INC. C/O MERGHLE" }, { “invoice_number”:” 9054468717”, "name": "Merghle", "bank_keys": "", "bank_number": "", "bank_branchid": "", "bank_account_number": "40574469", "currency": "", "alternative_bank_account": "", "lockbox_number": "", "swiftcode": "", "iban": "", "bank_control_key": "", "country": "", "address": "", "city": "", “district”:””, "region": "", "postalcode": "", "tel_number":”", "fax_number ": "", "additional": "ABA# 021000089/WIRE PAYMENTS TO:" } ], "invoice_header": [ { "invoice_date": "2014-10-24", "invoice_number": "9052333717", "po_date": "2014-07-09", "order_date": "2014-09-24", "purchase_order_number": "D20000036_R2D2", 13 | Manual de referência do serviço da Web "customer_po_number": "", "transaction_type": "Invoice", "ship_date": null, "invoice_currency": "USD", "sales_order_number": "7354493780", "contract_number": "D44000442", "payment_term": "30", "payment_due": "Up to 11/23/2014 without deduction", "local_currency": "USD", "exchange_rate": 1, "vat_number": "", "delivery_code": "CIF", "delivery_description": "FOB Origin", "delivery_number": "", "numbers_of_items": 1, "tax_amount": 0, "tax_type": "TPS;TVQ", "tax_rate": "7.975%;7%", "tracking_number": "1ZR43W412049469", "extra_po_identifier": "", "freight_charge": 0, "opportunity_id": "", " invoice_amount": 30, "weight_total": 0, "weight_uom": "", "reserve_header_field": "" } ], "invoice_items": [ { "invoice_number": "9033338717", "line_number": "000050", "sku": "961F1-WW6573-L994", "sku_description": "ADSKFD 2014 TL:MT SUB WW ELD", “physical_media”:””, "invoice_currency": "USD", "contract_start": "2014-09-24", "contract_end": "2015-12-31", "quantity": 1, "quantity_uom": "EA", "seats": 0, "unit_price": 30, "unit_discount": 0, "net_value": 30, "serial_number": "364-72262293", "current_serial_number": "", "old_serial_number": "", "partner_subs_id": "", “vat_description”:””, "reserve_item_field": "" } ], "invoice_partners": [ 14 | Manual de referência do serviço da Web { "invoice_number": "9052222717", "line_number": "000000", "partner_type": "", "partner_number": "", "contact_number": "0000000000", "partner_name": "Autochair Inc.", "street": "McInnis Parkway", "po_box": "", "city": "SAN ROFFEL", "postal_code": "94903", "pobox_postal_code": "", "country": "USA", "tel_number": "415-507-5000", "fax_number": "", "district": "MARIN", "region": "CA" }, { "invoice_number": "9033368717", "line_number": "000000", "partner_type": "Sold to", "partner_number": "5117344490", "contact_number": "0000000000", "partner_name": "Quechua Rentals", "street": "410 Terry Ave N", "po_box": "", "city": "Seattle", "postal_code": "98109-5210", "pobox_postal_code": "", "country": "USA", "tel_number": "", "fax_number": "", "district": "KING", "region": "WA" }, { "invoice_number": "9054558717", "line_number": "000000", "partner_type": "Bill to", "partner_number": "5117338390", "contact_number": "0000000000", "partner_name": "Quechua Rentals", "street": "410 Terry Ave N", "po_box": "", "city": "Seattle", "postal_code": "93109-5210", "pobox_postal_code": "", "country": "USA", "tel_number": "", "fax_number": "", "district": "KING", "region": "WA" 15 | Manual de referência do serviço da Web }, { "invoice_number": "9053338717", "line_number": "000000", "partner_type": "Ship to", "partner_number": "5166668390", "contact_number": "0000000000", "partner_name": "Quechua Rentals", "street": "410 Terry Ave N", "po_box": "", "city": "Seattle", "postal_code": "98209-5210", "pobox_postal_code": "", "country": "USA", "tel_number": "", "fax_number": "", "district": "KING", "region": "WA" }, { "invoice_number": "9053368717", "line_number": "000050", "partner_type": "Reseller", "partner_number": "5113333390", "contact_number": "0000000000", "partner_name": "Quechua Rentals", "street": "410 Terry Ave N", "po_box": "", "city": "Seattle", "postal_code": "98229-5210", "pobox_postal_code": "", "country": "USA", "tel_number": "", "fax_number": "", "district": "KING", "region": "WA" } ] } ] } Nota: no caso de vários tipos de impostos e taxas de impostos, o serviço retornará os dados como mostrado abaixo. Aqui os valores são separados por ';', e tax_type e tax_rate serão fornecidos na sequência (por exemplo, tax_rate de 7,975% corresponde ao tipo de impostos "TPS" e tax_rate de 7% corresponde ao tax_type "TVQ") 16 | Manual de referência do serviço da Web 4.7 Mensagens de erro A tabela a seguir mostra os códigos de erro e as respectivas mensagens de erro presentes na resposta mensagens caso um erro seja encontrado: Mensagem de erro Código de erro Descrição do erro Insira o Número do cliente UAN-GEN-00108 Número do cliente com valor em branco O campo não pode ser deixado em branco. Insira a data UAN-GEN-00108 De data da fatura / Para data da fatura com valor em branco O intervalo de datas não deve ter mais de 90 dias. Verifique sua entrada e tente novamente UAN-GEN-00141 Para verificar se um intervalo de datas tem mais de 90 dias O número do cliente não pode ter mais de 10 caracteres. Verifique sua entrada e tente novamente UAN-GEN-00123 Para verificar se o Número do cliente tem mais de 10 caracteres Insira a De data válida no formato AAAA-MM-DD UAN-GEN-00119 Para verificar o formato de data Insira a Para data válida no formato AAAA-MM-DD UAN-GEN-00119 Para verificar o formato de data Problema do sistema que impede o processamento. Tente novamente mais tarde UAN-GEN-00122 Exceção técnica Número da fatura deve ter exatos 10 caracteres. Verifique sua entrada e tente novamente UAN-GEN-00123 Para verificar se o número da fatura menos ou mais de 10 caracteres O Número do pedido de vendas deve ter exatos 10 caracteres. Verifique sua entrada e tente novamente UAN-GEN-00123 Para verificar se o número do pedido de vendas é menor ou mais de 10 caracteres De data da fatura deve ser anterior à Para data da fatura UAN-INV-00002 Para verificar se o valor De data da fatura é anterior à Para data da fatura O Número do cliente fornecido é inválido. APG-DWS-INV002 Se o CSN enviado pelo parceiro for inválido { - A camada do serviço para responder com a mensagem em branco se não houver nenhum registro encontrado para a pesquisa atual "status": "OK", "transaction_id": "INV701111351434507983", "message": [] } 17 | Manual de referência do serviço da Web 4.7.1 Amostra de resposta de erro { "status": "Error", "transactionid": "INV51046287871433503736", "message": [ { "error_code": "UAN-GEN-00108", "error_message": "Please enter Customer Number" } ] } 5 Apêndice 5.1 Código C# para inserir vários CSNs O seguinte é um exemplo de script que os Parceiros podem gravar para inserir vários CSNs no serviço GetInvoice. Já que o serviço GetInvoice só pode processar um único CSN por solicitação, é necessário programar seu aplicativo com isso em mente. Uma forma de fazer isso é programar um loop que faz uma solicitação para cada CSN fornecido, levando em consideração a geração de assinaturas e tokens de acesso. Um exemplo de código que faz isso é mostrado abaixo. 5.1.1 using using using using using using using Programa principal System; System.Collections.Generic; System.Text; MultipleInvoiceCallPoC.POCOs; Newtonsoft.Json; System.Diagnostics; System.Threading; namespace MultipleInvoiceCallPoC { class Program { static void Main(string[] args) { //"Acquiring credentials var credentials = new Credentials { BasePath = "https://www.example.com", ConsumerKey = "DcM03alqHyT3uv2P2cYQV0gq8K0qqKNf", ConsumerSecret = "VBqY7IKSoIW2ZbZ3", CSNs = new List<string>() { "70044566", "70044567", "70044568", 18 | Manual de referência do serviço da Web "70044569", "70044570" } }; // Looping through each CSN var container = new List<ResponseContainer>(); foreach (var csn in credentials.CSNs) { // Signing partner's credentials var firstSignature = Utils.GetFirstSignature(credentials); // Sending request to OAuth server to generate an Access Token var tokenDetails = Utils.CallOAuthEndPoint(firstSignature); // Signing Access Token var secondSignature = Utils.GetSecondSignature(tokenDetails, credentials); // Calling Get Invoice WebService var endPoint = string.Format("https://enterprise-apistg.autodesk.com/v1/invoices?customer_number={0}&invoice_date_from=2015-0801&invoice_date_to=2015-09-01", csn); var invoice = Utils.GetInvoices(endPoint, secondSignature, csn); // Storing WebService's response var invoiceContainer = JsonConvert.DeserializeObject<InvoiceContainer>(invoice); container.Add(new ResponseContainer { CSN = csn, Response = invoiceContainer }); } // Writing response to file var json = JsonConvert.SerializeObject(container, Formatting.Indented); Utils.WriteJsonToFile(json); } } } 5.1.2 Classe de Utilitários public class Utils { /// <summary> /// Sets up the OAuth URL end-point and headers to be send in the request in order to /// generate the Access Token /// </summary> /// <param name="url">String that contains the OAuth URL end-point</param> /// <param name="firstSignature">Class that contains Partner's signed credentials</param> /// <returns>String with a JSON object</returns> 19 | Manual de referência do serviço da Web public static string GetAccesToken(string url, FirstSignature firstSignature) { var request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.ContentType = "application/json"; request.Headers.Add("Authorization", string.Format("Basic {0}", firstSignature.Base64Credentials)); request.Headers.Add("signature", firstSignature.SignedSignature); request.Headers.Add("timestamp", string.Format("{0}", firstSignature.Timestamp)); return GetResponse(request); } /// <summary> /// Sets up the GetInvoice URL end-point, headers for the request and a particular CSN /// </summary> /// <param name="url">String that contains the GetInvoices end-point</param> /// <param name="secondSignature">Class that contains a signed Access Token</param> /// <param name="csn">String that contains CSN</param> /// <returns>String with a JSON object</returns> public static string GetInvoices(string url, SecondSignature secondSignature, string csn) { var request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; request.ContentType = "application/json"; request.Headers.Add("Authorization", secondSignature.Authorization); request.Headers.Add("CSN", csn); request.Headers.Add("signature", secondSignature.SignedSignature); request.Headers.Add("timestamp", string.Format("{0}", secondSignature.Timestamp)); return GetResponse(request); } /// <summary> /// Gets a response from an Internet resource /// </summary> /// <param name="request">Requet data </param> /// <returns>String with a JSON object</returns> public static string GetResponse(HttpWebRequest request) { try { var response = (HttpWebResponse)request.GetResponse(); var enc = System.Text.Encoding.GetEncoding("utf-8"); var responseStream = new StreamReader(response.GetResponseStream(), enc); var result = string.Empty; result = responseStream.ReadToEnd(); response.Close(); return result; } 20 | Manual de referência do serviço da Web catch (Exception e) { Trace.WriteLine(e.Message); return string.Empty; } } /// <summary> /// Calls Invoices Endpoint and retrieves a list of invoices /// </summary> /// <param name="firstSignature">Class that contains Partner's signed credentials</param> /// <returns>Class with access token data</returns> public static AccessToken CallOAuthEndPoint(FirstSignature firstSignature) { var url = "https://enterprise-apidev.autodesk.com/v2/oauth/generateaccesstoken?grant_type=client_credentials"; var details = Utils.GetAccesToken(url, firstSignature); var tokenDetails = JsonConvert.DeserializeObject<AccessToken>(details); return tokenDetails; } /// <summary> /// Takes Partner's credentials and signs them /// </summary> /// <param name="credentials">Class with partner's credentials data</param> /// <returns>class containing partner's signed credentials</returns> public static FirstSignature GetFirstSignature(Credentials credentials) { var credTemp = string.Format("{0}:{1}", credentials.ConsumerKey, credentials.ConsumerSecret); var firstSignature = new FirstSignature { Base64Credentials = Base64Encode(credTemp), Timestamp = GetEpochTimestamp() }; var message = string.Format("{0}{1}{2}", credentials.BasePath, credentials.ConsumerKey, firstSignature.Timestamp); firstSignature.SignedSignature = GenerateSignature(message, credentials.ConsumerSecret); return firstSignature; } /// <summary> /// Takes Access Token and signs it /// </summary> /// <param name="token">Class with access token data</param> /// <param name="credentials">Class with partner's credentials data</param> /// <returns>classs containing a signed access token</returns> public static SecondSignature GetSecondSignature(AccessToken token, Credentials credentials) { var secondSignature = new SecondSignature 21 | Manual de referência do serviço da Web { Timestamp = GetEpochTimestamp(), CSN = credentials.CSN, Authorization = string.Format("Bearer {0}", token.access_token) }; var message = string.Format("{0}{1}{2}", credentials.BasePath, token.access_token, secondSignature.Timestamp); secondSignature.SignedSignature = GenerateSignature(message, credentials.ConsumerSecret); return secondSignature; } /// <summary> /// Encode string to base64 /// </summary> /// <param name="plainText">String to be encoded</param> /// <returns>Enconded string</returns> public static string Base64Encode(string plainText) { var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); return System.Convert.ToBase64String(plainTextBytes); } /// <summary> /// Decodes base64 string /// </summary> /// <param name="base64EncodedData">String to be decoded</param> /// <returns>Decoded string</returns> public static string Base64Decode(string base64EncodedData) { var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData); return System.Text.Encoding.UTF8.GetString(base64EncodedBytes); } /// <summary> /// Gets Epoch Unix timestamp /// </summary> /// <returns>Epoch Unix timestamp</returns> public static int GetEpochTimestamp() { return (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; } /// <summary> /// Hashing of the signature using HMACSHA256 /// </summary> /// <param name="message">String with the message to be hashed</param> /// <param name="secret">String with the consumer secret</param> /// <returns>Hashed string</returns> public static string GenerateSignature(string message, string secret) { var encoding = new System.Text.ASCIIEncoding(); byte[] keyByte = encoding.GetBytes(secret); byte[] messageBytes = encoding.GetBytes(message); 22 | Manual de referência do serviço da Web using (var hmacsha256 = new HMACSHA256(keyByte)) { byte[] hashmessage = hmacsha256.ComputeHash(messageBytes); return Convert.ToBase64String(hashmessage); } } /// <summary> /// Prints a JSON object to a file /// </summary> /// <param name="json">String with a JSON Object</param> public static void WriteJsonToFile(string json) { using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\temp\json.txt")) { file.WriteLine(json); } } } 5.1.3 POCOs namespace MultipleInvoiceCallPoC { /// <summary> /// Class used to store Access /// </summary> public class AccessToken { public string access_token public string expires_in { public string token_type { } } Token data { get; set; } get; set; } get; set; } namespace MultipleInvoiceCallPoC.POCOs { /// <summary> /// Class used to encapsulate the Partner's credentials data /// </summary> public class Credentials { public string BasePath { get; set; } public string CSN { get; set; } public List<string> CSNs { get; set; } public string ConsumerKey { get; set; } public string ConsumerSecret { get; set; } } } namespace MultipleInvoiceCallPoC.POCOs { 23 | Manual de referência do serviço da Web /// <summary> /// Class used to encapsulate the Partner's signed credentials /// </summary> public class FirstSignature { public string Base64Credentials { get; set; } public int Timestamp { get; set; } public string SignedSignature { get; set; } } } namespace MultipleInvoiceCallPoC.POCOs { /// <summary> /// Class used to encapsulate a signed Access Token /// </summary> public class SecondSignature { public string SignedSignature { get; set; } public int Timestamp { get; set; } public string Authorization { get; set; } public string CSN { get; set; } } } namespace MultipleInvoiceCallPoC.POCOs { /// <summary> /// Class that represents an Invoice /// </summary> public class Invoice { public string invoice_number { get; set; } public string purchase_order_number { get; set; } public string sales_order_number { get; set; } public string bill_to_customer { get; set; } public string invoice_date { get; set; } public string transaction_type { get; set; } public string invoice_total_amount { get; set; } public string invoice_currency { get; set; } public string account_doc_description { get; set; } public string customer_po_number { get; set; } } /// <summary> /// Class used to contain Invoice data retreived from calling GetInvoices end-point /// </summary> public class InvoiceContainer { public string status { get; set; } public string transaction_id { get; set; } public Invoice[] message { get; set; } } /// <summary> 24 | Manual de referência do serviço da Web /// Auxiliary class for display purposes used to contain Invoice data for a particular CSN /// </summary> public class ResponseContainer { public string CSN { get; set; } public InvoiceContainer Response{get; set;} } } Nota: este Manual de referência do serviço é para uso exclusivo pelos destinatários pretendidos e pode conter informações proprietárias e/ou confidenciais que podem ser privilegiadas ou protegidas contra divulgação. Qualquer revisão, utilização, divulgação ou distribuição não autorizada é proibida. 25 | Manual de referência do serviço da Web