terça-feira, 4 de agosto de 2015

Codificando XML para importação WSDL na criação de webservice pelo Enterprise service (SE80)

  Tive muito problema para fazer funcionar o webservice de uma SEFAZ, o wsdl fornecido na importação no SAP ficava muito vago, para isso eu tive q trabalhar o arquivo manualmente para criação das estruturas.
 Vou deixar descrito algumas linhas de código essenciais para criação da estrutura.

Dentro do WSDL deve ser considerado algumas variáveis internas utilizado ao longo da construção da estrutura.

São alias para o endereço de chamda principal. como abaixo
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:tns="http://www.sefaz.es.gov.br/duae"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
targetNamespace="http://www.sefaz.es.gov.br/duae"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">


ao longo da estrutura são utilizados algo como "S:", "TNS:"... que são referências a declaração acima. 

-Criação de elemento simples.
<s:element name="raiz">





   <s:complexType>
       <s:sequence>
         
<s:element name="campo1" maxOccurs="0" minOccurs="1" type="s:string"/> 
       </s:sequence>           
   </s:complexType>           

</s:element>

Na importação do WSDL no SAP seria criado uma estrutura na SE11
nome Raiz com um campo chamado CAMPO1

=====================================================

-Criação de elemento com estrutura.

<s:complextype name="estrutura1">
  <s:sequence>
          <s:element name="campo2" minOccurs="1" type="s:string"/>
      <s:element name="campo3" minOccurs="1" type="s:string"/>
      <s:element name="campo4" minOccurs="1" type="s:string"/>  
  </s:sequence>
</s:complextype>






<s:element name="raiz">

   <s:complexType>
       <s:sequence>
         
<s:element name="campo1" maxOccurs="0" minOccurs="1" type="tns:estrutura1"/> 
       </s:sequence>           
   </s:complexType>           

</s:element>


Nesse caso na importação do wsdl no sap ficaria com uma estrutura chamada RAIZ com um campo CAMPO1 do tipo da estrutura ESTRUTURA1 que seria criado com os campos, CAMPO2, CAMPO3, CAMPO4 todas do tipo string.

=====================================================
-Criação de elemento tipo tabela.

<s:complextype name="tab1">
  <s:sequence>
          <s:element name="campo2" minOccurs="1" type="s:string"/>
      <s:element name="campo3" minOccurs="1" type="s:string"/>
      <s:element name="campo4" minOccurs="1" type="s:string"/>  
  </s:sequence>
</s:complextype>



<s:element name="raiz">

   <s:complexType>
       <s:sequence>
         
<s:element name="campo1" maxOccurs="unbounded" minOccurs="1" type="tns:tab1"/> 
       </s:sequence>           
   </s:complexType>           

</s:element>


Nesse caso na importação do wsdl no sap ficaria com uma estrutura chamada RAIZ com um campo CAMPO1 do tipo tabela TAB1 que seria criado com os campos, CAMPO2, CAMPO3, CAMPO4 todas do tipo string.

============================================================
-Criação de elemento com atributo.


<s:complextype name="estrutura1">
  <s:sequence>
          <s:element name="campo2" minOccurs="1" type="s:string"/>
      <s:element name="campo3" minOccurs="1" type="s:string"/>
      <s:element name="campo4" minOccurs="1" type="s:string"/>  
  </s:sequence>
  <s:attribute name="versao" type="string" use="required"/>
</s:complextype>



<s:element name="raiz">

   <s:complexType>
       <s:sequence>
         
<s:element name="campo1" maxOccurs="0" minOccurs="1" type="tns:estrutura1"/> 
       </s:sequence>           
   </s:complexType>           

</s:element>

Utilizei o caso de um campo do tipo estrutura. No caso acima seria como se dentro do XML ficasse dessa forma.

<raiz>
  <campo1 versao="xxxx">
    <campo2> </campo2>
    <campo3> </campo3>
    <campo4> </campo4>

  </campo1>
</raiz>


No caso do atributo no parâmetro de entrada do proxy deve ser declarado com o uso obrigatório, senão não aparece no XML.

=================================================

No caso do XML tive o comando CHOICE muito solicitado no caso de enviar ou CPF ou CNPJ.

Declarar os 2 campos como elemento, somente o preenchido irá para o XML, a tag do outro  nem aparece.

===================================================

Eu tive um caso da tag do retorno ser diferente no caso de um retorno com sucesso ou de erro, funciona da mesma forma acima, deve-se declarar as 2 tags cada um com sua estrutura, no momento do retorno o SAP verifica em qual das tags irá ser preenchido as informações

=====================================================

Transação útil para verificação do Webservice.  SRT_UTIL, faz o rastreamento da saída e retorno do SAP bem como o xml enviado e o de retorno.



Certificado digital STRUST - Importando certificado digital

Adicionando certificado digital no STRUST para validação de arquivos digitais. No meu caso Webservice.

Passo 1.
Importar certificado digital da empresa no browser de internet. Se já tiver registrado não há necessidade.

Passo 2. - internet explorer
- Ir em ferramentas->opção de internet->conteúdo->certificados
- Selecionar o certificado
- Exportar -
- Marcar exportar chave privada - avançar
- Marcar troca de informações pessoais.... (PFX)
- Marcar Incluir todos os certificados ..... - avançar
- Entrar com uma senha - avançar
- Salvar o arquivo como *.pfx

Passo 3
converter arquivo PFX para PSE
- Copiar arquivo pfx para diretório do SAP onde se encontra o programa executável SAPGENPSE
geralmente localizado no diretório  \usr\sap\<ambiente>\<servidor>\exe

- Executar o comando SAPGENPSE


sapgenpse import_p12 –p <nome_arq>.pse <nome_arq>.pfx 

vai ser solicitado a senha do arquivo PFX que foi digitado na exportação do arquivo.
e depois vai ser solicitado para entrar uma nova senha para o arquivo PSE, essa solicitação da senha PSE pode ser removido incluindo o parâmetro -z  a linha do comando SAPGENPSE




sapgenpse import_p12 –p -z <nome_arq>.pse <nome_arq>.pfx 



Pode ser que dê um erro na conversão do arquivo, nesse caso verifique se existe no servidor o diretório /sec em
\usr\sap\<ambiente>\<servidor>

Passo 4.
Importe o arquivo PSE criado na sua máquina local.

Passo 5.
Transação STRUST
ir no menu  PSE->IMPORTAR
selecionar o arquivo PSE - ENTER
entrar com a senha se existir

Passo 6
Ainda dentro da transação STRUST
ir no menu PSE->GRAVAR COMO
marcar em que tipo de aplicação vai ser gerado o certificado digital.

No meu caso como foi para o webservice, eu selecionei MANDANTE SSL e escolhi um identificador q eu tinha criado.

FINALIZADO

NOTA === IMPORTANTE - Ler nota 510007
Em alguns cliente verificar a configuração do CIPHER - conforme a nota acima. Para webservice PE não tive problemas, mas para o o ES se não for feito a configuração, a conexão não funciona.

Só essa linha já resolve =

ssl/client_ciphersuites                     150:PFS:HIGH:MEDIUM:+e3DES::EC_P256:EC_HIGH

Incluir como parâmetro na RZ10.