Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

cjulio

Utilizar Webservices da AT

Mensagens Recomendadas

padrinho

Boas pessoa...

Ando aqui numa luta no já tão famoso env:client internal error. Bem podiam dar um erro bem mais facilmente identificavel. Adiante... Ei-lo:


<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Body>
<env:Fault>
<faultcode>env:Client</faultcode>
<faultstring>Internal Error</faultstring>
</env:Fault>
</env:Body>
</env:Envelope>

O request é feito:


I, [2013-04-13T14:12:10.082087 #93707] INFO -- : SOAP request: https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte/
I, [2013-04-13T14:12:10.082192 #93707] INFO -- : SOAPAction: "https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte/", Content-Type: text/xml;charset=UTF-8, Content-Length: 2072

O XML que envio...


<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="https://servicos.portaldasfinancas.gov.pt/sgdtws/documentosTransporte/" xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<wss:Security xmlns:wss="http://schemas.xmlsoap.org/ws/2002/12/secext">
<wss:UsernameToken>
<wss:Username>505123257/2</wss:Username>
<wss:Password>z5OxlAprewzP7+sR7oiBA==
</wss:Password>
<wss:Nonce>OpRGRucjQuOPLUqGw3qGTGYt1iocBRHeUtYKWN6W9FeBK8j8Zql/VBlswYtv
cbTmFN/NCBgkDwPOZE7yVU+Vo8123iY9zFar1/oeuutnraj2vSzs0ubLhErk
AGCUDJTmQINaeib1FRstF5X12VyK/1mzMsdk5Lb4MB/1D90=</wss:Nonce>
<wss:Created>NNhFOTkNYCz8/RoiU123GPYLbI41eQiZPMDdUw8TVfWU=
</wss:Created>
</wss:UsernameToken>
</wss:Security>
</S:Header>
<S:Body>
<tns:envioDocumentoTransporteRequestElem>
<TaxRegistrationNumber>505068257</TaxRegistrationNumber>
<CompanyName>Blah</CompanyName>
<CompanyAddress>
<Addressdetail>Ble</Addressdetail>
<City>Braga</City>
<PostalCode>4000</PostalCode>
<Country>PT</Country>
</CompanyAddress>
<DocumentNumber>GT GT13/10</DocumentNumber>
<ATDocCodeID>10</ATDocCodeID>
<MovementStatus>N</MovementStatus>
<MovementDate>2013-04-11</MovementDate>
<MovementType>GR</MovementType>
<CustomerName>Manuel</CustomerName>
<CustomerTaxId>999999999</CustomerTaxId>
<CustomerAddress>
<Addressdetail>aaa</Addressdetail>
<City>Braga</City>
<PostalCode>4815-178</PostalCode>
<Country>PT</Country>
</CustomerAddress>
<AddressTo>
<Addressdetail>aaa</Addressdetail>
<City>Braga</City>
<PostalCode>4815-178</PostalCode>
<Country>PT</Country>
</AddressTo>
<AddressFrom>
<Addressdetail>aaa</Addressdetail>
<City>Braga</City>
<PostalCode>4815-178</PostalCode>
<Country>PT</Country>
</AddressFrom>
<MovementEndTime>2013-04-11T23:59:59</MovementEndTime>
<MovementStartTime>2013-04-11T23:59:59</MovementStartTime>
<VehicleID>84-cv-18</VehicleID>
<Line>
<ProductDescription>Cafe cm leit</ProductDescription>
<Quantity>1</Quantity>
<UnitOfMeasure>L</UnitOfMeasure>
<UnitPrice>10.5</UnitPrice>
</Line>
</tns:envioDocumentoTransporteRequestElem>
</S:Body>
</S:Envelope>

E pronto... Porquê dar o erro ? Alguém me pode ajudar? É bem estúpida a mensagem, podia ser mais explicita sobre o que está mal.

Obrigado desde já a todos,

Fabio

Não terás isto a mais: <ATDocCodeID>10</ATDocCodeID>?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
marcolopes

Não terás isto a mais: <ATDocCodeID>10</ATDocCodeID>?

Agora que referem, pergunto-me o que está este campo a fazer na estrutura dos documentos de transporte... :-\\

Este é um campo relativo ao RETORNO e não ao envio. Aliás, nem documentado está...


The simplest explanation is usually the correct one

JAVA Utilities: https://github.com/marcolopes/dma

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmmachado

Boas pessoa...

Ando aqui numa luta no já tão famoso env:client internal error. Bem podiam dar um erro bem mais facilmente identificavel. Adiante... Ei-lo:


<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Body>
<env:Fault>
<faultcode>env:Client</faultcode>
<faultstring>Internal Error</faultstring>
</env:Fault>
</env:Body>
</env:Envelope>

O request é feito:


I, [2013-04-13T14:12:10.082087 #93707] INFO -- : SOAP request: https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte/
I, [2013-04-13T14:12:10.082192 #93707] INFO -- : SOAPAction: "https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte/", Content-Type: text/xml;charset=UTF-8, Content-Length: 2072

O XML que envio...


<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="https://servicos.portaldasfinancas.gov.pt/sgdtws/documentosTransporte/" xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<wss:Security xmlns:wss="http://schemas.xmlsoap.org/ws/2002/12/secext">
<wss:UsernameToken>
<wss:Username>505123257/2</wss:Username>
<wss:Password>z5OxlAprewzP7+sR7oiBA==
</wss:Password>
<wss:Nonce>OpRGRucjQuOPLUqGw3qGTGYt1iocBRHeUtYKWN6W9FeBK8j8Zql/VBlswYtv
cbTmFN/NCBgkDwPOZE7yVU+Vo8123iY9zFar1/oeuutnraj2vSzs0ubLhErk
AGCUDJTmQINaeib1FRstF5X12VyK/1mzMsdk5Lb4MB/1D90=</wss:Nonce>
<wss:Created>NNhFOTkNYCz8/RoiU123GPYLbI41eQiZPMDdUw8TVfWU=
</wss:Created>
</wss:UsernameToken>
</wss:Security>
</S:Header>
<S:Body>
<tns:envioDocumentoTransporteRequestElem>
<TaxRegistrationNumber>505068257</TaxRegistrationNumber>
<CompanyName>Blah</CompanyName>
<CompanyAddress>
<Addressdetail>Ble</Addressdetail>
<City>Braga</City>
<PostalCode>4000</PostalCode>
<Country>PT</Country>
</CompanyAddress>
<DocumentNumber>GT GT13/10</DocumentNumber>
<ATDocCodeID>10</ATDocCodeID>
<MovementStatus>N</MovementStatus>
<MovementDate>2013-04-11</MovementDate>
<MovementType>GR</MovementType>
<CustomerName>Manuel</CustomerName>
<CustomerTaxId>999999999</CustomerTaxId>
<CustomerAddress>
<Addressdetail>aaa</Addressdetail>
<City>Braga</City>
<PostalCode>4815-178</PostalCode>
<Country>PT</Country>
</CustomerAddress>
<AddressTo>
<Addressdetail>aaa</Addressdetail>
<City>Braga</City>
<PostalCode>4815-178</PostalCode>
<Country>PT</Country>
</AddressTo>
<AddressFrom>
<Addressdetail>aaa</Addressdetail>
<City>Braga</City>
<PostalCode>4815-178</PostalCode>
<Country>PT</Country>
</AddressFrom>
<MovementEndTime>2013-04-11T23:59:59</MovementEndTime>
<MovementStartTime>2013-04-11T23:59:59</MovementStartTime>
<VehicleID>84-cv-18</VehicleID>
<Line>
<ProductDescription>Cafe cm leit</ProductDescription>
<Quantity>1</Quantity>
<UnitOfMeasure>L</UnitOfMeasure>
<UnitPrice>10.5</UnitPrice>
</Line>
</tns:envioDocumentoTransporteRequestElem>
</S:Body>
</S:Envelope>

E pronto... Porquê dar o erro ? Alguém me pode ajudar? É bem estúpida a mensagem, podia ser mais explicita sobre o que está mal.

Obrigado desde já a todos,

Fabio

Boas,

experimenta tirar a / no final do URI so serviço, mas deixa a / no final da SoapAction:

SOAP request: https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte

SOAP Action: "https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte/

vê se funciona assim.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PinheiroID

Continuo com o erro “O servidor remoto devolveu um erro: (500) Erro interno de servidor.”

Estou a utilizar um dos códigos já aqui deixados, alguém sabe como ultrapassar este erro?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FinancialTests.portaldasfinancas;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography;
using System.IO;
using System.Net;
using System.Xml;
using System.Xml.Linq;
using System.Web.Services.Protocols;
namespace FinancialTests
{
public class Program
{
	public static string CaminhoCertificado = @"C:\Users\PPASUS\Desktop\WebServices\Ficheiros AT\TestesWebservices.pfx";
	public static string CaminhoChavePublica = @"C:\Users\PPASUS\Desktop\WebServices\Ficheiros AT\ChavePublicaAT.cer";
	public static string ChaveSimetricaEncriptada = "";
	public static string PassFinancas = "M.........";
	public static string PassFinancasEncriptada = "";
	public static string DataCriacaoEncriptada = "";
	public static string SenhaCertificado = "TESTEwebservice";
	public static string oRequest = String.Empty;
	public static void Main(string[] args)
	{
		send();
	}
	public static void buildCredentials()
	{
		X509Certificate2 certCP = new X509Certificate2();
		certCP.Import(CaminhoChavePublica);
		String publicKey = certCP.PublicKey.Key.ToXmlString(false);
		String DataCriacao = DateTime.UtcNow.ToString("s") + "Z";
		RijndaelManaged rijndaelCipher = new RijndaelManaged();
		rijndaelCipher.GenerateKey();
		rijndaelCipher.Mode = CipherMode.ECB;
		rijndaelCipher.Padding = PaddingMode.PKCS7;
		string simetrickey = rijndaelCipher.Key.ToString();
		Byte[] chaveSimetrica = rijndaelCipher.Key;
		SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();
		rijn.Key = rijndaelCipher.IV;
		rijn.IV = rijndaelCipher.IV;
		rijn.Mode = CipherMode.ECB;
		MemoryStream msPassFinancas = new MemoryStream();
		CryptoStream csPassFinancas = new CryptoStream(msPassFinancas, rijn.CreateEncryptor(rijn.Key, rijn.IV), CryptoStreamMode.Write);
		using (StreamWriter swPassFinancas = new StreamWriter(csPassFinancas))
		{
			swPassFinancas.Write(PassFinancas);
		}
		MemoryStream msDataCriacao = new MemoryStream();
		CryptoStream csDataCriacao = new CryptoStream(msDataCriacao, rijn.CreateEncryptor(rijn.Key, rijn.IV), CryptoStreamMode.Write);
		using (StreamWriter swDataCriacao = new StreamWriter(csDataCriacao))
		{
			swDataCriacao.Write(DataCriacao);
		}
		PassFinancasEncriptada = Convert.ToBase64String(msPassFinancas.ToArray());
		DataCriacaoEncriptada = Convert.ToBase64String(msDataCriacao.ToArray());
		RSACryptoServiceProvider AlgRSA = new RSACryptoServiceProvider();
		AlgRSA.FromXmlString(publicKey);
		Byte[] Chave = AlgRSA.Encrypt(rijn.Key, false);
		ChaveSimetricaEncriptada = Convert.ToBase64String(Chave);
	}
	public static string send()
	{
		buildCredentials();
		GenerateXmlString();

		string EnderecoWebService = ("https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte/");
		string SoapAction = ("https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte");
		documentoTransporte a = new documentoTransporte();
		try
		{
			HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(EnderecoWebService);
			request.Headers.Add("SOAPAction", SoapAction);
			X509Certificate2 cert = new X509Certificate2();
			cert.Import(CaminhoCertificado, SenhaCertificado, X509KeyStorageFlags.DefaultKeySet);
			request.ClientCertificates.Add(cert);
			request.Method = "POST";
			request.ContentType = "text/xml; charset=utf-8";
			request.Accept = "text/xml";
			string postData = oRequest;
			byte[] byteArray = Encoding.UTF8.GetBytes(postData);
			request.ContentLength = byteArray.Length;
			Stream dataStream = request.GetRequestStream();
			dataStream.Write(byteArray, 0, byteArray.Length);
			dataStream.Close();
			HttpWebResponse response = (HttpWebResponse)request.GetResponse();
			dataStream = response.GetResponseStream();
			StreamReader reader = new StreamReader(dataStream, Encoding.GetEncoding("windows-1252"));
			string responseFromServer = reader.ReadToEnd();
			reader.Close();
			dataStream.Close();
			response.Close();
			return responseFromServer;
		}
		catch (WebException ex)
		{
			if (ex.Status == WebExceptionStatus.ProtocolError)
			{
				WebResponse resp = ex.Response;
				StreamReader sr = new StreamReader(resp.GetResponseStream());
				return sr.ReadToEnd();
			}
			else
			{
				return ex.Message;
			}
		}
	}
	public static void GenerateXmlString()
	{
		string oRequest = String.Empty;
		oRequest += ("<?xml version='1.0' encoding='UTF-8'  standalone='no'?>");
		oRequest += ("<S:Envelope xmlns:S=\"http://schemas.xmlsoap.org/soap/envelope/\">");
		oRequest += "<S:Header>";
		oRequest += "<wss:Security xmlns:wss=\"http://schemas.xmlsoap.org/ws/2002/12/secext\">";
		oRequest += "<wss:UsernameToken>";
		oRequest += "<wss:Username>" + "509000000/1" + "</wss:Username>";
		oRequest += "<wss:Password>" + PassFinancasEncriptada + "</wss:Password>";
		oRequest += "<wss:Nonce>" + ChaveSimetricaEncriptada + "</wss:Nonce>";
		oRequest += "<wss:Created>" + DataCriacaoEncriptada + "</wss:Created>";
		oRequest += "</wss:UsernameToken>";
		oRequest += "</wss:Security>";
		oRequest += "</S:Header>";
		oRequest += "<S:Body>";
		oRequest += ("<ns2:envioDocumentoTransporteRequestElem xmlns:ns2=\"https://servicos.portaldasfinancas.gov.pt/sgdtws/documentosTransporte/\">");
		oRequest += "<TaxRegistrationNumber>555555555</TaxRegistrationNumber>";
		oRequest += "<CompanyName>Informática</CompanyName>";
		oRequest += "<CompanyAddress>";
		oRequest += "<Addressdetail>Rua de testes, N.1</Addressdetail>";
		oRequest += "<City>VCD</City>";
		oRequest += "<PostalCode>9999-222</PostalCode>";
		oRequest += "<Country>PT</Country>";
		oRequest += "</CompanyAddress>";
		oRequest += "<DocumentNumber>GT GT13/10</DocumentNumber>";
		oRequest += "<MovementStatus>N</MovementStatus>";
		oRequest += "<MovementDate>2013-04-10</MovementDate>";
		oRequest += "<MovementType>GT</MovementType>";
		oRequest += "<CustomerTaxID>999999990</CustomerTaxID>";
		oRequest += "<AddressFrom>";
		oRequest += "<Addressdetail>Rua do Alto</Addressdetail>";
		oRequest += "<City>Lordelo</City>";
		oRequest += "<PostalCode>4815-178</PostalCode>";
		oRequest += "<Country>PT</Country>";
		oRequest += "</AddressFrom>";
		oRequest += "<MovementEndTime>2013-04-10T23:59:59</MovementEndTime>";
		oRequest += "<MovementStartTime>2013-04-10T18:02:56</MovementStartTime>";
		oRequest += "<Line>";
		oRequest += "<ProductDescription>Cha</ProductDescription>";
		oRequest += "<Quantity>1</Quantity>";
		oRequest += "<UnitOfMeasure>Uni</UnitOfMeasure>";
		oRequest += "<UnitPrice>2.43902</UnitPrice>";
		oRequest += "</Line>";
		oRequest += "</ns2:envioDocumentoTransporteRequestElem>";
		oRequest += "</S:Body>";
		oRequest += "</S:Envelope>";
		XmlDocument xc = new XmlDocument();
		TextReader textReader = new StringReader(oRequest);
		XDocument xmlDocument = Xdocument.Load(textReader);
		xmldocument.Save(@"C:\Users\PPASUS\Desktop\WebServices\FinancialTests - Cópia\XML\send.xml");
	 }

}
}

Editado por Rui Carlos
Formatação do código.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
SergioAreias

a minha duvida e no oQue dado que tem de ser uma key

alguem pode me ajudar

thanks

Tens que usar a chave simétrica que geraste previamente para esta ser utilizada para cifrar os bytes da password.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
americob

Agora que referem, pergunto-me o que está este campo a fazer na estrutura dos documentos de transporte... :-\\

Este é um campo relativo ao RETORNO e não ao envio. Aliás, nem documentado está...

não será necessário na anulação de uma já comunicada?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
FernandoPereira

Boas pessoa...

Ando aqui numa luta no já tão famoso env:client internal error. Bem podiam dar um erro bem mais facilmente identificavel. Adiante... Ei-lo:


<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Body>
<env:Fault>
<faultcode>env:Client</faultcode>
<faultstring>Internal Error</faultstring>
</env:Fault>
</env:Body>
</env:Envelope>

O request é feito:


I, [2013-04-13T14:12:10.082087 #93707] INFO -- : SOAP request: https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte/
I, [2013-04-13T14:12:10.082192 #93707] INFO -- : SOAPAction: "https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte/", Content-Type: text/xml;charset=UTF-8, Content-Length: 2072

O XML que envio...


<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="https://servicos.portaldasfinancas.gov.pt/sgdtws/documentosTransporte/" xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<wss:Security xmlns:wss="http://schemas.xmlsoap.org/ws/2002/12/secext">
<wss:UsernameToken>
<wss:Username>505123257/2</wss:Username>
<wss:Password>z5OxlAprewzP7+sR7oiBA==
</wss:Password>
<wss:Nonce>OpRGRucjQuOPLUqGw3qGTGYt1iocBRHeUtYKWN6W9FeBK8j8Zql/VBlswYtv
cbTmFN/NCBgkDwPOZE7yVU+Vo8123iY9zFar1/oeuutnraj2vSzs0ubLhErk
AGCUDJTmQINaeib1FRstF5X12VyK/1mzMsdk5Lb4MB/1D90=</wss:Nonce>
<wss:Created>NNhFOTkNYCz8/RoiU123GPYLbI41eQiZPMDdUw8TVfWU=
</wss:Created>
</wss:UsernameToken>
</wss:Security>
</S:Header>
<S:Body>
<tns:envioDocumentoTransporteRequestElem>
<TaxRegistrationNumber>505068257</TaxRegistrationNumber>
<CompanyName>Blah</CompanyName>
<CompanyAddress>
<Addressdetail>Ble</Addressdetail>
<City>Braga</City>
<PostalCode>4000</PostalCode>
<Country>PT</Country>
</CompanyAddress>
<DocumentNumber>GT GT13/10</DocumentNumber>
<ATDocCodeID>10</ATDocCodeID>
<MovementStatus>N</MovementStatus>
<MovementDate>2013-04-11</MovementDate>
<MovementType>GR</MovementType>
<CustomerName>Manuel</CustomerName>
<CustomerTaxId>999999999</CustomerTaxId>
<CustomerAddress>
<Addressdetail>aaa</Addressdetail>
<City>Braga</City>
<PostalCode>4815-178</PostalCode>
<Country>PT</Country>
</CustomerAddress>
<AddressTo>
<Addressdetail>aaa</Addressdetail>
<City>Braga</City>
<PostalCode>4815-178</PostalCode>
<Country>PT</Country>
</AddressTo>
<AddressFrom>
<Addressdetail>aaa</Addressdetail>
<City>Braga</City>
<PostalCode>4815-178</PostalCode>
<Country>PT</Country>
</AddressFrom>
<MovementEndTime>2013-04-11T23:59:59</MovementEndTime>
<MovementStartTime>2013-04-11T23:59:59</MovementStartTime>
<VehicleID>84-cv-18</VehicleID>
<Line>
<ProductDescription>Cafe cm leit</ProductDescription>
<Quantity>1</Quantity>
<UnitOfMeasure>L</UnitOfMeasure>
<UnitPrice>10.5</UnitPrice>
</Line>
</tns:envioDocumentoTransporteRequestElem>
</S:Body>
</S:Envelope>

E pronto... Porquê dar o erro ? Alguém me pode ajudar? É bem estúpida a mensagem, podia ser mais explicita sobre o que está mal.

Obrigado desde já a todos,

Fabio

Boas,

No soap request tira a "/" final, ficando: https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte

Em relação ao XML, deixo-te aqui algumas correcções:

1. O elemento <ATDocCodeID> está a mais;

2. Coloca o <CustomerName> depois da morada do cliente;

3. Eu não envio o <MovementEndTime>;

Tem em atenção a data de inicio do transporte, pois caso esta seja para o dia atual, e seja inferior ou igual a hora atual vai falhar, tem de ser sempre uma data/hora que ainda não tenha chegado, senão o envio falha.

Espero que isto te ajude...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fakada

Boas,

experimenta tirar a / no final do URI so serviço, mas deixa a / no final da SoapAction:

SOAP request: https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte

SOAP Action: "https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte/

vê se funciona assim.

PMMachado... Dasse... E não é que tens razão? Então os gajos têm o WSDL errado? Essas coisas são especificadas no WSDL!!!! E lá está com / nos 2 locais.

Obrigado Machado! ... vamos ao proximo erro :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fakada

Bem... grande Sábado este...

Mais uma. Reparem no meu XML:


<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="https://servicos.portaldasfinancas.gov.pt/sgdtws/documentosTransporte/" xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
 <S:Header>
   <wss:Security xmlns:wss="http://schemas.xmlsoap.org/ws/2002/12/secext">
     <wss:UsernameToken>
       <wss:Username>505068257/2</wss:Username>
       <wss:Password>063H8H63OGfNEBm9gFOttQ==
</wss:Password>
       <wss:Nonce>pBf+n+fD2qAnqW2EwA5RPkLyKeIofPuE52hxVRRZ/C2H6IXI/ohs8IZ4auwc
gw63wS6t4jNAXhdd65p+rHF2Ls17yLNUgi8Xh1gLwtSTg3DtEuqLA3yzx5xr
rOahqdiDJqsH5ZpLDofgO9dBvZ+lX6lME7l80RNIX9yPLn/jyJI=</wss:Nonce>
       <wss:Created>FYkfSU+k3VHtzBt03m5pyG6Sm9f9wxktxlqrrcpDDxU=
</wss:Created>
     </wss:UsernameToken>
   </wss:Security>
 </S:Header>
 <S:Body>
   <tns:envioDocumentoTransporteRequestElem>
     <TaxRegistrationNumber>505068257</TaxRegistrationNumber>
     <CompanyName>Blah</CompanyName>
     <CompanyAddress>
       <Addressdetail>Ble</Addressdetail>
       <City>Braga</City>
       <PostalCode>4000-000</PostalCode>
       <Country>PT</Country>
     </CompanyAddress>
     <DocumentNumber>GT GT13/10</DocumentNumber>
     <MovementStatus>N</MovementStatus>
     <MovementDate>2013-04-11</MovementDate>
     <MovementType>GR</MovementType>
     <CustomerTaxId>999999990</CustomerTaxId>
     <CustomerAddress>
       <Addressdetail>aaa</Addressdetail>
       <City>Braga</City>
       <PostalCode>4815-178</PostalCode>
       <Country>PT</Country>
     </CustomerAddress>
     <CustomerName>Manuel</CustomerName>
     <AddressTo>
       <Addressdetail>aaa</Addressdetail>
       <City>Braga</City>
       <PostalCode>4815-178</PostalCode>
       <Country>PT</Country>
     </AddressTo>
     <AddressFrom>
       <Addressdetail>aaa</Addressdetail>
       <City>Braga</City>
       <PostalCode>4815-178</PostalCode>
       <Country>PT</Country>
     </AddressFrom>
     <MovementEndTime>2013-04-11T23:59:59</MovementEndTime>
     <MovementStartTime>2013-04-11T23:59:59</MovementStartTime>
     <VehicleID>84-cv-18</VehicleID>
     <Line>
       <ProductDescription>Cafe cm leit</ProductDescription>
       <Quantity>1</Quantity>
       <UnitOfMeasure>L</UnitOfMeasure>
       <UnitPrice>10.5</UnitPrice>
     </Line>
   </tns:envioDocumentoTransporteRequestElem>
 </S:Body>
</S:Envelope>

Dá-me erro:

... found <CustomerTaxId> (in default namespace), but next item should be AddressFrom

Mas a questão é que a eu verifiquei no SOAPUI e a ordem definida no WSDL é a que coloquei. Mais, se eu mudar o AddressFrom para ser a seguir ao CustomerTaxId:


     <AddressTo>
       <Addressdetail>aaa</Addressdetail>
       <City>Braga</City>
       <PostalCode>4815-178</PostalCode>
       <Country>PT</Country>
     </AddressTo>
     <CustomerTaxId>999999990</CustomerTaxId>
     <AddressFrom>
       <Addressdetail>aaa</Addressdetail>
       <City>Braga</City>
       <PostalCode>4815-178</PostalCode>
       <Country>PT</Country>
     </AddressFrom>

Entao o erro:


found <CustomerTaxId> (in default namespace), but next item should be AddressFrom 

Já não entendo nada... Agradeço ajuda!

Cumprimentos,

Fábio

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmmachado

Bem... grande Sábado este...

Mais uma. Reparem no meu XML:


<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="https://servicos.portaldasfinancas.gov.pt/sgdtws/documentosTransporte/" xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<wss:Security xmlns:wss="http://schemas.xmlsoap.org/ws/2002/12/secext">
<wss:UsernameToken>
<wss:Username>505068257/2</wss:Username>
<wss:Password>063H8H63OGfNEBm9gFOttQ==
</wss:Password>
<wss:Nonce>pBf+n+fD2qAnqW2EwA5RPkLyKeIofPuE52hxVRRZ/C2H6IXI/ohs8IZ4auwc
gw63wS6t4jNAXhdd65p+rHF2Ls17yLNUgi8Xh1gLwtSTg3DtEuqLA3yzx5xr
rOahqdiDJqsH5ZpLDofgO9dBvZ+lX6lME7l80RNIX9yPLn/jyJI=</wss:Nonce>
<wss:Created>FYkfSU+k3VHtzBt03m5pyG6Sm9f9wxktxlqrrcpDDxU=
</wss:Created>
</wss:UsernameToken>
</wss:Security>
</S:Header>
<S:Body>
<tns:envioDocumentoTransporteRequestElem>
<TaxRegistrationNumber>505068257</TaxRegistrationNumber>
<CompanyName>Blah</CompanyName>
<CompanyAddress>
<Addressdetail>Ble</Addressdetail>
<City>Braga</City>
<PostalCode>4000-000</PostalCode>
<Country>PT</Country>
</CompanyAddress>
<DocumentNumber>GT GT13/10</DocumentNumber>
<MovementStatus>N</MovementStatus>
<MovementDate>2013-04-11</MovementDate>
<MovementType>GR</MovementType>
<CustomerTaxId>999999990</CustomerTaxId>
<CustomerAddress>
<Addressdetail>aaa</Addressdetail>
<City>Braga</City>
<PostalCode>4815-178</PostalCode>
<Country>PT</Country>
</CustomerAddress>
<CustomerName>Manuel</CustomerName>
<AddressTo>
<Addressdetail>aaa</Addressdetail>
<City>Braga</City>
<PostalCode>4815-178</PostalCode>
<Country>PT</Country>
</AddressTo>
<AddressFrom>
<Addressdetail>aaa</Addressdetail>
<City>Braga</City>
<PostalCode>4815-178</PostalCode>
<Country>PT</Country>
</AddressFrom>
<MovementEndTime>2013-04-11T23:59:59</MovementEndTime>
<MovementStartTime>2013-04-11T23:59:59</MovementStartTime>
<VehicleID>84-cv-18</VehicleID>
<Line>
<ProductDescription>Cafe cm leit</ProductDescription>
<Quantity>1</Quantity>
<UnitOfMeasure>L</UnitOfMeasure>
<UnitPrice>10.5</UnitPrice>
</Line>
</tns:envioDocumentoTransporteRequestElem>
</S:Body>
</S:Envelope>

Dá-me erro:

... found <CustomerTaxId> (in default namespace), but next item should be AddressFrom

Mas a questão é que a eu verifiquei no SOAPUI e a ordem definida no WSDL é a que coloquei. Mais, se eu mudar o AddressFrom para ser a seguir ao CustomerTaxId:


<AddressTo>
<Addressdetail>aaa</Addressdetail>
<City>Braga</City>
<PostalCode>4815-178</PostalCode>
<Country>PT</Country>
</AddressTo>
<CustomerTaxId>999999990</CustomerTaxId>
<AddressFrom>
<Addressdetail>aaa</Addressdetail>
<City>Braga</City>
<PostalCode>4815-178</PostalCode>
<Country>PT</Country>
</AddressFrom>

Entao o erro:


found <CustomerTaxId> (in default namespace), but next item should be AddressFrom

Já não entendo nada... Agradeço ajuda!

Cumprimentos,

Fábio

É CustomerTaxID e não CustomerTaxId

Espero que ajude.

cumps

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmmachado

Continuo com o erro “O servidor remoto devolveu um erro: (500) Erro interno de servidor.”

Estou a utilizar um dos códigos já aqui deixados, alguém sabe como ultrapassar este erro?

...
		buildCredentials();
		GenerateXmlString();

		string EnderecoWebService = ("https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte/");
		string SoapAction = ("https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte");
		documentoTransporte a = new documentoTransporte();
...  

PinheiroID,

Altera os endereços de:

string EnderecoWebService = ("https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte/");

string SoapAction = ("https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte");

Para

string EnderecoWebService = ("https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte");

string SoapAction = ("https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte/");

(as / no final dos endereços...)

Não vi o teu código todo, apenas reparei nos endereços...

Experimenta e dá noticias.

Cumps

Editado por pmmachado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PinheiroID

PinheiroID,

Altera os endereços de:

string EnderecoWebService = ("https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte/");

string SoapAction = ("https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte");

Para

string EnderecoWebService = ("https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte");

string SoapAction = ("https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte/");

(as / no final dos endereços...)

Não vi o teu código todo, apenas reparei nos endereços...

Experimenta e dá noticias.

Cumps

pmmachado, obrigado pela resposta.

Fiz essa alteração mas continuo com o mesmo erro.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmmachado

pmmachado, obrigado pela resposta.

Fiz essa alteração mas continuo com o mesmo erro.

Boas,

Estive a ver o teu código e tens um bug: no método Send() a var postData vai vazia porque tens definida a oRequest como estática ao nivel da classe mas no método GenerateXmlString() estás a declarar e a preencher oRequest localmente ... retira a string oRequest = String.Empty; do método GenerateXmlString().

Experimenta e diz qq coisa.

QQ coisas podes mandar msg ...

Cumps

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
hhccruz

Boa tarde a todos ,

Alguém sabe como soluccionar este problema:

Consigo enviar as guias.

Recebo o código da AT.

Escrevo o código na BD.

Numa guia ocorreu um erro a escrever o código da AT na BD. Está tudo numa transaction.O erro de escrita -> Rollback , logo o documento não é registado mas fica registado na AT.

E agora?

Cumps,

Nota: Usei um código daqui para a encriptação e envio e corre tudo bem. Obrigado.

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fakada

É CustomerTaxID e não CustomerTaxId

Espero que ajude.

cumps

Como sempre... CERTO pmmachado! Obrigado.

Estou com outro problema... ao enviar o xml recebe resposta com erro:


<faultcode>8 </faultcode>
<faultstring>Rejected: | Codigo: 8 | Erro: Created: Não foi possível decifrar o campo | Tentativas Restantes: -1</faultstring>
<detail>sgdtws.gdgt</detail></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>

O que pode ser isto? Problema da encriptação ? Ou dos dados em si ?

Vejam o header


<wss:Security xmlns:wss="http://schemas.xmlsoap.org/ws/2002/12/secext">
<wss:UsernameToken>
<wss:Username>505068257/2</wss:Username>
<wss:Password>BITdvwOvGtJO63ErPzNJ3w==
</wss:Password>
<wss:Nonce>fvft+NnM8U4wygN082yxzLv5SQKUs+7OA/RaMovoqHDKBqa0SZT9MUMyHx4K
5Zpj+lcLSWrGb7VrLN0n40f/zhnhsKb11233DrDH0BJ0hI/nrguDj1UvqEq7
1ABGq4po+koLXh1fiPX/lRVdgqKm129jlYyK/mSUsAkGeUteNRNSeuIOOYy
N80XjSowPD9UqKv//4z0mIUhyvYl44miK8HuXiccI8XBqtWopqKm1fchqhqw
RWi8suMBh1pxv7rPZDomwX6tIOEFmh2io6cMgjMP1g6mgmLKxON0u+iYul6z
x2qSgz3reZ51l06eJ3PLgOjgFVj32khazrY6XFEVSw==</wss:Nonce>
<wss:Created>h9P9aEi9X4123ITgajdPl9pZqdZZUW72nWNceIgSHs=
</wss:Created>
</wss:UsernameToken>
</wss:Security>

Obrigado desde já a todos. Este forum é uma ajuda imensa!

Fabio

Editado por fakada

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
marcolopes

PMMachado... Dasse... E não é que tens razão? Então os gajos têm o WSDL errado? Essas coisas são especificadas no WSDL!!!! E lá está com / nos 2 locais.

Obrigado Machado! ... vamos ao proximo erro :)

Resposta #532


The simplest explanation is usually the correct one

JAVA Utilities: https://github.com/marcolopes/dma

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
marcolopes

Boa tarde a todos ,

Alguém sabe como soluccionar este problema:

Consigo enviar as guias.

Recebo o código da AT.

Escrevo o código na BD.

Numa guia ocorreu um erro a escrever o código da AT na BD. Está tudo numa transaction.O erro de escrita -> Rollback , logo o documento não é registado mas fica registado na AT.

E agora?

Cumps,

Nota: Usei um código daqui para a encriptação e envio e corre tudo bem. Obrigado.

Agora começam os problemas que muitos programadores estão a deixar para o final... que são até mais complexos do que a própria implementação de envio.

EDIT: Estava a raciocinar de forma errada! Neste cenário não vejo qualquer solução viável, mesmo que o envio seja a última operação, é como dizes: há sempre que actualizar pelo menos UM campo (no meu caso actualizo diversos, DATA, HORA, Mensagem, etc).

Editado por marcolopes

The simplest explanation is usually the correct one

JAVA Utilities: https://github.com/marcolopes/dma

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Carlos Pais

Boas

Estive a ler alguns tópicos, e a pedido de algumas pessoas, aqui fica um código em VB.NET, que está a funcionar, código este que lê um xml com as variaveis <wss:Username>, <wss:Nonce>, <wss:Password> e o <wss:Created> não codificadas ( XML criado por outro programa ), e então depois este código codifica o XML e Envia, com este código dá para fazer um mini programa, que pode ser chamado por outro programa .



Imports System.Net
Imports System.Security.Cryptography.X509Certificates
Imports System.Text
Imports System.IO
Imports System.Security.Cryptography
Imports <xmlns:wss="http://schemas.xmlsoap.org/ws/2002/12/secext">


Public Class Webserver_GUIAS

   Private Sub Webserver_GUIAS_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    '####################################################################
    '################# APAGA O FICHEIRO DA RESPOSTA SE EXISTIR  #########
    '####################################################################

    Try
	    Kill("RespostaGT.xml")
    Catch ex As Exception
    End Try


    Dim NomedoFicheiroOriginal = "WebServerTRANSP.xml"

    '####################################################################
    '################# Abre o Ficheiro Sem Codificação  #################
    '####################################################################

    Dim xmlFile = Xdocument.Load(NomedoFicheiroOriginal)

    Dim FX As FileStream
    Dim ESCRstream As StreamWriter

    FX = New FileStream(NomedoFicheiroOriginal, FileMode.Append, FileAccess.Write)
    ESCRstream = New StreamWriter(FX)
    ESCRstream.BaseStream.Seek(0, SeekOrigin.End)

    Dim UserFinancas = xmlFile...<wss:Username>.Value '### USERNAME DO XML NÃO CODIFICADO ############
    Dim PassFinancas = xmlFile...<wss:Password>.Value '### PASSWORD DO XML NÃO CODIFICADO ############
    Dim PassFinancasEncriptada
    Dim DataCriacaoEncriptada
    Dim ChaveSimetricaEncriptada

    Dim CaminhoChavePublica = "ChavePublicaAT.cer"

    Dim certCP As New X509Certificate2()
    certCP.Import(CaminhoChavePublica)
    Dim publicKey As [string] = certCP.PublicKey.Key.ToXmlString(False)


    Dim DataCriacao As [string] = xmlFile...<wss:Created>.Value  '### DATA DO XML NÃO CODIFICADA #######
    'Dim DataCriacao As [string] = DateTime.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.ff") & "Z"
    'Dim DataCriacao As [string] = DateTime.Now().ToString("yyyy-MM-ddTHH:mm:ss.ff") & "Z"

    ESCRstream.Close()
    FX.Close()

    Dim rijndaelCipher As New RijndaelManaged()
    rijndaelCipher.GenerateKey()
    rijndaelCipher.Mode = CipherMode.ECB
    rijndaelCipher.Padding = PaddingMode.PKCS7
    Dim simetrickey As String = rijndaelCipher.Key.ToString()
    Dim chaveSimetrica As [byte]() = rijndaelCipher.Key
    Dim rijn As SymmetricAlgorithm = SymmetricAlgorithm.Create()
    rijn.Key = rijndaelCipher.IV
    rijn.IV = rijndaelCipher.IV
    rijn.Mode = CipherMode.ECB
    Dim msPassFinancas As New MemoryStream()
    Dim csPassFinancas As New CryptoStream(msPassFinancas, rijn.CreateEncryptor(rijn.Key, rijn.IV), CryptoStreamMode.Write)
    Using swPassFinancas As New StreamWriter(csPassFinancas)
	    swPassFinancas.Write(PassFinancas)
    End Using
    Dim msDataCriacao As New MemoryStream()
    Dim csDataCriacao As New CryptoStream(msDataCriacao, rijn.CreateEncryptor(rijn.Key, rijn.IV), CryptoStreamMode.Write)
    Using swDataCriacao As New StreamWriter(csDataCriacao)
	    swDataCriacao.Write(DataCriacao)
    End Using

    '####################################################################
    '################# Converter Password BASE64 ########################
    '####################################################################
    PassFinancasEncriptada = Convert.ToBase64String(msPassFinancas.ToArray())

    '####################################################################
    '################# Converter Data para BASE64 #######################
    '####################################################################
    DataCriacaoEncriptada = Convert.ToBase64String(msDataCriacao.ToArray())

    Dim AlgRSA As New RSACryptoServiceProvider()
    AlgRSA.FromXmlString(publicKey)
    Dim Chave As [byte]() = AlgRSA.Encrypt(rijn.Key, False)

    '####################################################################
    '################# Converter NOCE ###################################
    '####################################################################
    ChaveSimetricaEncriptada = Convert.ToBase64String(Chave)

    '####################################################################
    '#######	 ALTERA E GRAVA O NOVO XML JÁ CODIFICADO  ###############
    '####################################################################

    Dim xmlFile2 = Xdocument.Load(NomedoFicheiroOriginal)

    xmlFile2...<wss:Username>.Value = UserFinancas
    xmlFile2...<wss:Password>.Value = PassFinancasEncriptada
    xmlFile2...<wss:Created>.Value = DataCriacaoEncriptada
    xmlFile2...<wss:Nonce>.Value = ChaveSimetricaEncriptada

    xmlFile2.Save(NomedoFicheiroOriginal)


    '####################################################################
    '#######	 ENVIAR FICHEIRO			    #########################
    '####################################################################

    Dim EnderecoWebService As String = "https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte"
    Dim CaminhoCertificado As String = "TestesWebservices.pfx"
    Dim SenhaCertificado As String = "TESTEwebservice"

    Dim doc As New System.Xml.XmlDocument
    doc.Load(NomedoFicheiroOriginal) 'CAMINHO DO ARQUIVO A ENVIAR

    Dim oRequest = doc.OuterXml

    Try

	    Dim request As HttpWebRequest = HttpWebRequest.Create("https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte")
	    request.Headers.Add("SOAPAction", "https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte/")
	    Dim cert As New X509Certificate2
	    cert.Import(CaminhoCertificado, SenhaCertificado, X509KeyStorageFlags.DefaultKeySet)
	    request.ClientCertificates.Add(cert)
	    request.Method = "POST"
	    request.ContentType = "text/xml; charset=utf-8"
	    request.Accept = "text/xml"
	    Dim postData As String = oRequest
	    Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postData)
	    request.ContentLength = byteArray.Length
	    Dim dataStream As Stream = request.GetRequestStream()
	    dataStream.Write(byteArray, 0, byteArray.Length)
	    dataStream.Close()
	    Dim response As HttpWebResponse = request.GetResponse()
	    dataStream = response.GetResponseStream()
	    Dim reader As New StreamReader(dataStream)
	    Dim responseFromServer As String = reader.ReadToEnd()
	    reader.Close()
	    dataStream.Close()
	    response.Close()



	    '####################################################################
	    '################# CRIA O FICHEIRO PARA SE LA GRAVAR AS LINHAS  ######
	    '####################################################################

	    'Apaga o ficheiro velho
	    Try
		    Kill("RespostaGT.xml")
	    Catch ex As Exception

	    End Try

	    'Grava o da Resposta
	    Dim FX1 As FileStream
	    Dim ESCRstream1 As StreamWriter

	    FX1 = New FileStream("RespostaGT.xml", FileMode.Append, FileAccess.Write)
	    ESCRstream1 = New StreamWriter(FX1)
	    ESCRstream1.BaseStream.Seek(0, SeekOrigin.End)


	    ESCRstream1.WriteLine(responseFromServer)
	    ESCRstream1.Close()
	    FX1.Close()

	    xmlFile = Xdocument.Load("RespostaGT.xml")

	    If xmlFile...<ReturnCode>.Value = 0 Then
		    MsgBox("Codigo.:  " + xmlFile...<ReturnCode>.Value + vbCrLf + "Mensagem.:  " + xmlFile...<ReturnMessage>.Value, MsgBoxStyle.Information, "Envio Documento via WEBSERVER")
	    Else
		    MsgBox("Codigo.:  " + xmlFile...<ReturnCode>.Value + vbCrLf + "Mensagem.:  " + xmlFile...<ReturnMessage>.Value, MsgBoxStyle.Critical, "Envio Documento via WEBSERVER")
	    End If


	    Return

    Catch ex As WebException
	    If ex.Status = WebExceptionStatus.ProtocolError Then
		    Dim resp As WebResponse = ex.Response
		    Dim sr As StreamReader = New StreamReader(resp.GetResponseStream())

		    MsgBox(sr.ReadToEnd())
		    '  MsgBox("Codigo.:  " + xmlFile...<ReturnCode>.Value + vbCrLf + "Mensagem.:  " + xmlFile...<ReturnMessage>.Value, MsgBoxStyle.Critical, "Envio Documento via WEBSERVER")

	    Else

		    MsgBox(ex.Message)

	    End If

    End Try

   End Sub

Editado por Carlos Pais
  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
marcolopes

Boas

Estive a ler alguns tópicos, e a pedido de algumas pessoas, aqui fica um código em VB.NET, que está a funcionar, código este que lê um xml com as variaveis <wss:Username>, <wss:Nonce>, <wss:Password> e o <wss:Created> não codificadas ( XML criado por outro programa ), e então depois este código codifica o XML e Envia, com este código dá para fazer um mini programa, que pode ser chamado por outro programa .



Imports System.Net
Imports System.Security.Cryptography.X509Certificates
Imports System.Text
Imports System.IO
Imports System.Security.Cryptography
Imports <xmlns:wss="http://schemas.xmlsoap.org/ws/2002/12/secext">


Public Class Webserver_GUIAS

Private Sub Webserver_GUIAS_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

	'####################################################################
	'################# APAGA O FICHEIRO DA RESPOSTA SE EXISTIR  #########
	'####################################################################

	Try
		Kill("RespostaGT.xml")
	Catch ex As Exception
	End Try


	Dim NomedoFicheiroOriginal = "WebServerTRANSP.xml"

	'####################################################################
	'################# Abre o Ficheiro Sem Codificação  #################
	'####################################################################

	Dim xmlFile = Xdocument.Load(NomedoFicheiroOriginal)

	Dim FX As FileStream
	Dim ESCRstream As StreamWriter

	FX = New FileStream(NomedoFicheiroOriginal, FileMode.Append, FileAccess.Write)
	ESCRstream = New StreamWriter(FX)
	ESCRstream.BaseStream.Seek(0, SeekOrigin.End)

	Dim UserFinancas = xmlFile...<wss:Username>.Value '### USERNAME DO XML NÃO CODIFICADO ############
	Dim PassFinancas = xmlFile...<wss:Password>.Value '### PASSWORD DO XML NÃO CODIFICADO ############
	Dim PassFinancasEncriptada
	Dim DataCriacaoEncriptada
	Dim ChaveSimetricaEncriptada

	Dim CaminhoChavePublica = "ChavePublicaAT.cer"

	Dim certCP As New X509Certificate2()
	certCP.Import(CaminhoChavePublica)
	Dim publicKey As [string] = certCP.PublicKey.Key.ToXmlString(False)


	Dim DataCriacao As [string] = xmlFile...<wss:Created>.Value  '### DATA DO XML NÃO CODIFICADA #######
	'Dim DataCriacao As [string] = DateTime.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.ff") & "Z"
	'Dim DataCriacao As [string] = DateTime.Now().ToString("yyyy-MM-ddTHH:mm:ss.ff") & "Z"

	ESCRstream.Close()
	FX.Close()

	Dim rijndaelCipher As New RijndaelManaged()
	rijndaelCipher.GenerateKey()
	rijndaelCipher.Mode = CipherMode.ECB
	rijndaelCipher.Padding = PaddingMode.PKCS7
	Dim simetrickey As String = rijndaelCipher.Key.ToString()
	Dim chaveSimetrica As [byte]() = rijndaelCipher.Key
	Dim rijn As SymmetricAlgorithm = SymmetricAlgorithm.Create()
	rijn.Key = rijndaelCipher.IV
	rijn.IV = rijndaelCipher.IV
	rijn.Mode = CipherMode.ECB
	Dim msPassFinancas As New MemoryStream()
	Dim csPassFinancas As New CryptoStream(msPassFinancas, rijn.CreateEncryptor(rijn.Key, rijn.IV), CryptoStreamMode.Write)
	Using swPassFinancas As New StreamWriter(csPassFinancas)
		swPassFinancas.Write(PassFinancas)
	End Using
	Dim msDataCriacao As New MemoryStream()
	Dim csDataCriacao As New CryptoStream(msDataCriacao, rijn.CreateEncryptor(rijn.Key, rijn.IV), CryptoStreamMode.Write)
	Using swDataCriacao As New StreamWriter(csDataCriacao)
		swDataCriacao.Write(DataCriacao)
	End Using

	'####################################################################
	'################# Converter Password BASE64 ########################
	'####################################################################
	PassFinancasEncriptada = Convert.ToBase64String(msPassFinancas.ToArray())

	'####################################################################
	'################# Converter Data para BASE64 #######################
	'####################################################################
	DataCriacaoEncriptada = Convert.ToBase64String(msDataCriacao.ToArray())

	Dim AlgRSA As New RSACryptoServiceProvider()
	AlgRSA.FromXmlString(publicKey)
	Dim Chave As [byte]() = AlgRSA.Encrypt(rijn.Key, False)

	'####################################################################
	'################# Converter NOCE ###################################
	'####################################################################
	ChaveSimetricaEncriptada = Convert.ToBase64String(Chave)

	'####################################################################
	'#######	 ALTERA E GRAVA O NOVO XML JÁ CODIFICADO  ###############
	'####################################################################

	Dim xmlFile2 = Xdocument.Load(NomedoFicheiroOriginal)

	xmlFile2...<wss:Username>.Value = UserFinancas
	xmlFile2...<wss:Password>.Value = PassFinancasEncriptada
	xmlFile2...<wss:Created>.Value = DataCriacaoEncriptada
	xmlFile2...<wss:Nonce>.Value = ChaveSimetricaEncriptada

	xmlFile2.Save(NomedoFicheiroOriginal)


	'####################################################################
	'#######	 ENVIAR FICHEIRO				#########################
	'####################################################################

	Dim EnderecoWebService As String = "https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte"
	Dim CaminhoCertificado As String = "TestesWebservices.pfx"
	Dim SenhaCertificado As String = "TESTEwebservice"

	Dim doc As New System.Xml.XmlDocument
	doc.Load(NomedoFicheiroOriginal) 'CAMINHO DO ARQUIVO A ENVIAR

	Dim oRequest = doc.OuterXml

	Try

		Dim request As HttpWebRequest = HttpWebRequest.Create("https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte")
		request.Headers.Add("SOAPAction", "https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte/")
		Dim cert As New X509Certificate2
		cert.Import(CaminhoCertificado, SenhaCertificado, X509KeyStorageFlags.DefaultKeySet)
		request.ClientCertificates.Add(cert)
		request.Method = "POST"
		request.ContentType = "text/xml; charset=utf-8"
		request.Accept = "text/xml"
		Dim postData As String = oRequest
		Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postData)
		request.ContentLength = byteArray.Length
		Dim dataStream As Stream = request.GetRequestStream()
		dataStream.Write(byteArray, 0, byteArray.Length)
		dataStream.Close()
		Dim response As HttpWebResponse = request.GetResponse()
		dataStream = response.GetResponseStream()
		Dim reader As New StreamReader(dataStream)
		Dim responseFromServer As String = reader.ReadToEnd()
		reader.Close()
		dataStream.Close()
		response.Close()



		'####################################################################
		'################# CRIA O FICHEIRO PARA SE LA GRAVAR AS LINHAS  ######
		'####################################################################

		'Apaga o ficheiro velho
		Try
			Kill("RespostaGT.xml")
		Catch ex As Exception

		End Try

		'Grava o da Resposta
		Dim FX1 As FileStream
		Dim ESCRstream1 As StreamWriter

		FX1 = New FileStream("RespostaGT.xml", FileMode.Append, FileAccess.Write)
		ESCRstream1 = New StreamWriter(FX1)
		ESCRstream1.BaseStream.Seek(0, SeekOrigin.End)


		ESCRstream1.WriteLine(responseFromServer)
		ESCRstream1.Close()
		FX1.Close()

		xmlFile = Xdocument.Load("RespostaGT.xml")

		If xmlFile...<ReturnCode>.Value = 0 Then
			MsgBox("Codigo.:  " + xmlFile...<ReturnCode>.Value + vbCrLf + "Mensagem.:  " + xmlFile...<ReturnMessage>.Value, MsgBoxStyle.Information, "Envio Documento via WEBSERVER")
		Else
			MsgBox("Codigo.:  " + xmlFile...<ReturnCode>.Value + vbCrLf + "Mensagem.:  " + xmlFile...<ReturnMessage>.Value, MsgBoxStyle.Critical, "Envio Documento via WEBSERVER")
		End If


		Return

	Catch ex As WebException
		If ex.Status = WebExceptionStatus.ProtocolError Then
			Dim resp As WebResponse = ex.Response
			Dim sr As StreamReader = New StreamReader(resp.GetResponseStream())

			MsgBox(sr.ReadToEnd())
			'  MsgBox("Codigo.:  " + xmlFile...<ReturnCode>.Value + vbCrLf + "Mensagem.:  " + xmlFile...<ReturnMessage>.Value, MsgBoxStyle.Critical, "Envio Documento via WEBSERVER")

		Else

			MsgBox(ex.Message)

		End If

	End Try

End Sub

Ainda não percebi muito bem a razão de todos estes "estratagemas". Em VB não existe forma de "compilar" a especificação, criando classes nativas para a criação do objecto a enviar?


The simplest explanation is usually the correct one

JAVA Utilities: https://github.com/marcolopes/dma

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
eesteves

Agora que referem, pergunto-me o que está este campo a fazer na estrutura dos documentos de transporte... :-\\

Este é um campo relativo ao RETORNO e não ao envio. Aliás, nem documentado está...

Será usado na anulação de um Guia de Transporte que já foi submetida (e que, portanto, já tem o ATDocCodeID) ?
  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
marcolopes

Será usado na anulação de um Guia de Transporte que já foi submetida (e que, portanto, já tem o ATDocCodeID) ?

BINGO! Na mouche! Não está documentado, mas serve para isso mesmo.

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<work:WorkContext xmlns:work="http://oracle.com/weblogic/soap/workarea/">rO0ABXdZAB53ZWJsb2dpYy5hcHAuU0dEVFdTLTEuMS41LjAwOTMAAADWAAAAI3dlYmxvZ2ljLndvcmthcmVhLlN0cmluZ1dvcmtDb250ZXh0AAoxLjEuNS4wMDkzAAA=</work:WorkContext>
</S:Header>
<S:Body>
<ns0:envioDocumentoTransporteResponseElem xmlns:ns0="https://servicos.portaldasfinancas.gov.pt/sgdtws/documentosTransporte/">
<ResponseStatus>
<ReturnCode>13</ReturnCode>
<ReturnMessage>Não pode ser alterado um Documento de Transporte quando a Data de Início já decorreu.</ReturnMessage>
</ResponseStatus>
</ns0:envioDocumentoTransporteResponseElem>
</S:Body>
</S:Envelope>

Confirmado. Envio de documentos em estado ANULADO está a funcionar.

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<work:WorkContext xmlns:work="http://oracle.com/weblogic/soap/workarea/">rO0ABXdZAB53ZWJsb2dpYy5hcHAuU0dEVFdTLTEuMS41LjAwOTMAAADWAAAAI3dlYmxvZ2ljLndvcmthcmVhLlN0cmluZ1dvcmtDb250ZXh0AAoxLjEuNS4wMDkzAAA=</work:WorkContext>
</S:Header>
<S:Body>
<ns0:envioDocumentoTransporteResponseElem xmlns:ns0="https://servicos.portaldasfinancas.gov.pt/sgdtws/documentosTransporte/">
<ResponseStatus>
<ReturnCode>4</ReturnCode>
<ReturnMessage>Já foi anulado o Documento de Transporte com o número fornecido.</ReturnMessage>
</ResponseStatus>
</ns0:envioDocumentoTransporteResponseElem>
</S:Body>
</S:Envelope>

IMPORTANTE! É possível alterar o documento de transporte, desde que não sejam violadas as regras primárias! Portanto, podem preparar as aplicações para possibilitar a EDIÇÃO dos documentos de transporte, e comunicação subsequente, pois a mesma é aceite (até mesmo a alteração da própria DATA de CARGA e/ou DESCARGA é possível).

NOTA: O campo ATDocCodeID deve ser inicializado APENAS se o documento já tiver sido enviado.

Editado por marcolopes
  • Voto 1

The simplest explanation is usually the correct one

JAVA Utilities: https://github.com/marcolopes/dma

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
brunotoira

Aqui vai para quem precisa de código fonte de encryptação e envio do XML

Este zip leva source para: VB.net, C#, phyton, e Ruby, vfp9, VB6, Delphi 6, Delphi 7, Delphi 9, 10, XE, XE4, XBASE etc ****

Poderá ser necessário ajustar o source à sua necessidade.

O Anexo leva ZIP compilado e em source das várias linguagens anunciadas.

Download: https://www.dropbox.com/s/gqq228grvm7t7nb/Comunicacao_Guias_AT.zip

*** ATENÇÃO QUE É NECESSÁRIO RETIRAR O :701 DO ENDEREÇO POIS O ENDEREÇO DE TESTES ALTEROU**

Está disponível também um XML com a estrutura necessária, bem como um XML de resultado..

Passos iniciais obrigatórios:

1. Criar a pasta C:\EnvioGuias e gravar lá o ChavePublicaAT.cer e TestesWebServices.pfx

2. Criado no portal da finanças(link) o respectivo User com o acesso ao WDT.

3. Ter aderido ao serviço de envio via WebService aqui

4. Ter o .net Framework para correr o EXE (à partida o framework 2.0 chega)

Também há forma de implementar em softwares antigos. Passa por chamar o "encryptor.exe" pela linha de comandos com a password, por exemplo "c:\EnvioGuias\encryptor.exe minhapassword"

O resultado ficará gravado em C:\EnvioGuias\Guia2013.xml e a estrutura será:

1ª linha: PasswordEncryptada;

2ª linha: Created;

3ª linha: NONCE;

Após estas 3 linhas, na vossa aplicação podem gerar o XML com a vossa base de dados...

Quando precisarem da password Nonce ou Created basta abrir o C:\EnvioGuias\Guia2013.xml e ler o que lá está.

Após ter o XML gerado, gravem-no em "C:\EnvioGuias\GuiaFinal.xml" e executem o "APISender.exe" aguardem 2 segundos aprox e será criado o XML de resultado.

Após ter o C:\EnvioGuias\Result.xml é facil interpretar o xml

Está testado e pelo que sei, foi implementado em alguns programas, nomeadamente em aplicações feitas em MS-DOS etc.

As TAG's do xml tem obrigatóriamente de ter a estrutura exactamente igual, CaseSensitive etc.

Espero que seja util. :thumbsup:

Podem enviar dúvidas pelo facebook ou aqui via mensagem privada.

Editado por brunotoira
  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.