menu
Fórum Adianti
menu Menu
Consumindo serviço wsdl com autenticação Olá pessoal! Resolvi escrever esse artigo porque encontrei pouca coisa sobre o assunto voltado a php e em português. Existe muito material para .net, mas chega de papo e vamos ao que interessa: Depois de muita leitura (em inglês que não é meu forte) encontrei o artigo de Renan William Alves de Oliveira "Conectando o SAP com uma aplicação PHP usando Webservices (WSDL) e SOAP" no ...
ES
Consumindo serviço wsdl com autenticação  
Fechado
Olá pessoal!
Resolvi escrever esse artigo porque encontrei pouca coisa sobre o assunto voltado a php e em português. Existe muito material para .net, mas chega de papo e vamos ao que interessa:

Depois de muita leitura (em inglês que não é meu forte) encontrei o artigo de Renan William Alves de Oliveira "Conectando o SAP com uma aplicação PHP usando Webservices (WSDL) e SOAP" no endereço scn.sap.com/docs/DOC-51073, que clareou o meu caminho e daí em diante foi aplicar os conhecimentos do framework para ter êxito.

1- Classe de manipulação do SOAP e interação com os requisitos e métodos do WSDL do webservice. Deixo claro que cada webservice tem sua particularidades e métodos próprios e, portanto, necessário adequar essa classe conforme suas necessidades, por isso é de suma importância que se tenha o máximo de informações do webservice e dos parâmetros e tipos de objetos exigidos pelos XML's.
Classe: SAPWebServices.class.php
  1. <?php  
  2. /**
  3.  * SAPWebServices
  4.  * @author  Eliezer de Morais Silva
  5.  */
  6. /** 
  7. * Baseado na Class do autor
  8. * @author Renan William Alves de Oliveira 
  9. *       
  10. */  
  11. class SAPWebServices {  
  12.   const SERVER 'http://webservice.com.br/CatalogoWS.svc?wsdl';  
  13.   //WSDL paths  
  14.   const ZRW_WS_PRODUTO_SCHEMALOCATION  'http://webservice.com.br/CatalogoWS.svc?xsd=xsd2';  
  15.   const ZRW_WS_PRODUTO_NAMESPACE 'http://schemas.webservice.Integration.ServiceModel.Produto';
  16.   //default values  
  17.   const INITIAL_PASS 'xxxx';  
  18.   const ABAP_TRUE 'X';  
  19.   const ABAP_FALSE '';  
  20.   /** 
  21.   * 
  22.   * @var array SAP Logon Details 
  23.   */  
  24.   private $SOAP_OPTS;  
  25.   /** 
  26.   * 
  27.   * @var SoapClient Soap Object 
  28.   */  
  29.   private $client;  
  30.   
  31.   function __construct() {  
  32.       $this->SOAP_OPTS = array (  
  33.           'login' => 'xxxxxxx',  
  34.           'password' => '********',  
  35.           'features' => SOAP_SINGLE_ELEMENT_ARRAYS ,
  36.           'namespace' => SAPWebServices::ZRW_WS_PRODUTO_NAMESPACE,
  37.           'schemaLocation' => SAPWebServices::ZRW_WS_PRODUTO_SCHEMALOCATION 
  38.       );  
  39.   }  
  40.   
  41.   public function getFunctions() {
  42.       $this->client = new SoapClient SAPWebServices::SERVER $this->SOAP_OPTS );
  43.   
  44.   
  45.       try {
  46.           return $this->client->__getFunctions();
  47.       } catch ( SoapFault $e ) {
  48.           throw $e;
  49.       }
  50.   }
  51.   
  52.   
  53.   public function salvarPreco(stdClass $precos) {
  54.       $this->client = new SoapClient SAPWebServices::SERVER $this->SOAP_OPTS );
  55.       
  56.       //Depende da exigência do xml do webservice
  57.       $params = array (
  58.               'CodigoIntegracao' => $precos->CodigoIntegracao,
  59.               'PrecoProduto'     => $precos->PrecoProduto,
  60.               'Promocao'         => $precos->Promocao,
  61.               'PrecoPromocao'    => $precos->PrecoPromocao,
  62.               'PromocaoInicio'   => $precos->PromocaoInicio,
  63.               'PromocaoFim'      => $precos->PromocaoFim,
  64.               'CodigoIntegracaoSubVariacao'   => $precos->CodigoIntegracaoSubVariacao,
  65.               'CodigoIntegracaoVariacao'      => $precos->CodigoIntegracaoVariacao
  66.       );
  67.       
  68.       
  69.       try {
  70.           return $this->client->SalvarPreco( array('Preco' => $params) );
  71.       } catch ( SoapFault $e ) {
  72.           throw $e;
  73.       }
  74.   }
  75.   
  76.   
  77.   public function salvarPrecoLst$precosLst) {
  78.       $this->client = new SoapClient SAPWebServices::SERVER $this->SOAP_OPTS );
  79.   
  80.       
  81.       foreach ($precosLst as $prc) {
  82.           $params = array (
  83.                   'CodigoIntegracao' => $prc->CodigoIntegracao,
  84.                   'PrecoProduto'     => $prc->PrecoProduto,
  85.                   'Promocao'         => $prc->Promocao,
  86.                   'PrecoPromocao'    => $prc->PrecoPromocao,
  87.                   'PromocaoInicio'   => $prc->PromocaoInicio,
  88.                   'PromocaoFim'      => $prc->PromocaoFim,
  89.                   'CodigoIntegracaoSubVariacao'   => $prc->CodigoIntegracaoSubVariacao,
  90.                   'CodigoIntegracaoVariacao'      => $prc->CodigoIntegracaoVariacao
  91.           );
  92.           
  93.           $lst[] = $params;
  94.       }
  95.       
  96.         
  97.       try {     
  98.           return $this->client->SalvarPrecoLst( array('Preco' => $lst) );
  99.       } catch ( SoapFault $e ) {
  100.           throw $e;
  101.       }
  102.   }
  103. }
  104. ?>

[Considerações]
a - as constantes ZRW_WS_PRODUTO_SCHEMALOCATION e ZRW_WS_PRODUTO_NAMESPACE podem não ser necessárias para o uso do seu webservice, por isso verifique documentação
b - o método getFunctions() é extremamente importante porque retorna todos os métodos do wsdl informado, portanto vai auxiliar na falta de documentação.
c - os métodos SalvarPreco() e SalvarPrecoLst serve para ilustrar como desenvolver todos os métodos ou funções que o webservice permite para manipular os dados, no primeiro envio apena um array e no segundo envio uma coleção de arrays, levando em consideração, nesse caso, o nome exigido pela tag do xml que nesse caso é Preco.

2 - Método para integrar somente um produto:
  1. <?php 
  2. function onIntegra1()
  3.     {
  4.         
  5.         try {
  6.             //Pega listagens na sessão
  7.             $lstProd TSession::getValue('listaWsPrc');//Lista de Produtos
  8.             $lstChk TSession::getValue('listaWsChk');//Lista de Produtos checados no form para integrar
  9.             
  10.             
  11.             $sap = new SAPWebServices();
  12.         
  13.             //Cria o objeto para enviar para o WS
  14.             foreach ($lstChk as $chk) {
  15.                 $preco = new stdClass();
  16.                 $preco->CodigoIntegracao trim($lstProd->{$chk}->id);
  17.                 $preco->CodigoIntegracaoSubVariacao '';
  18.                 $preco->CodigoIntegracaoVariacao '';
  19.                 $preco->PrecoProduto general_functions::formata_money_US($lstProd->{$chk}->preco,2);
  20.                 
  21.                  //Verifica se o produto está em promoção
  22.                 if (doubleval(general_functions::formata_money_US($lstProd->{$chk}->preco,2)) > 0) {
  23.                     $preco->Promocao true;                    
  24.                 } else {
  25.                     $preco->Promocao false;
  26.                 }
  27.         
  28.                 $preco->PrecoPromocao general_functions::formata_money_US($lstProd->{$chk}->promocao,2);
  29.                 $preco->PromocaoInicio TDate::date2us($lstProd->{$chk}->data_ini);
  30.                 $preco->PromocaoFim TDate::date2us($lstProd->{$chk}->data_fim);
  31.                 
  32.                 
  33.             }
  34.             
  35.         
  36.             $result $sap->salvarPreco($preco);
  37.         
  38.         
  39.             if ($result) {
  40.                 //print_r($parser);
  41.                 foreach ($result as $post) { //Loop para mostrar os dados
  42.                     new TMessage('info',$post->Mensagem);
  43.                 }
  44.             } else{
  45.                 echo 'Erro ao ler o Resultado';
  46.             }
  47.         }
  48.         catch ( SoapFault $exception ) {
  49.             print "***Caught Exception***<br />";
  50.             echo '<pre>';
  51.             print_r $exception );
  52.             echo '</pre>';
  53.             print "***END Exception***<br />";
  54.             die ();
  55.         }
  56.     
  57.     }
  58. ?>


3 - Método para integrar uma lista de produtos:
  1. <?php 
  2. function onIntegraLst()
  3.     {
  4.         
  5.         try {
  6.             //Pega listagens na sessão
  7.             $lstProd TSession::getValue('listaWsPrc');//Lista de Produtos
  8.             $lstChk TSession::getValue('listaWsChk');//Lista de checados
  9.         
  10.         
  11.             $sap = new SAPWebServices();
  12.             
  13.             //cria contadores
  14.             $nMaxEnvio 200;//Máximo de produtos por envio, depende de documentação
  15.             $cont 0;
  16.             $msg '';
  17.         
  18.             //Cria o objeto para enviar para o WS
  19.             foreach ($lstChk as $chk) {
  20.                 $cont++;
  21.                 
  22.                 $preco = new stdClass();
  23.                 $preco->CodigoIntegracao trim($lstProd->{$chk}->id);
  24.                 $preco->CodigoIntegracaoSubVariacao '';
  25.                 $preco->CodigoIntegracaoVariacao '';
  26.                 $preco->PrecoProduto general_functions::formata_money_US($lstProd->{$chk}->preco,2);
  27.         
  28.                 //Verifica se o produto está em promoção
  29.                 if (doubleval(general_functions::formata_money_US($lstProd->{$chk}->preco,2)) > 0) {
  30.                     $preco->Promocao true;
  31.                 } else {
  32.                     $preco->Promocao false;
  33.                 }
  34.         
  35.                 $preco->PrecoPromocao general_functions::formata_money_US($lstProd->{$chk}->promocao,2);
  36.                 $preco->PromocaoInicio TDate::date2us($lstProd->{$chk}->data_ini);
  37.                 $preco->PromocaoFim TDate::date2us($lstProd->{$chk}->data_fim);
  38.                 
  39.                 $listaDePrecosProduto[] = $preco;
  40.                 
  41.                 if ($cont == $nMaxEnvio){                    
  42.                     $result $sap->SalvarPrecoLst($listaDePrecosProduto);
  43.                     
  44.                     //Guarda Mensagem retornada
  45.                     foreach ($result as $post => $resposta) { //Loop para mostrar os dados
  46.                         foreach ($resposta->RespostaProcessamentoLst as $rl=>$rp) {
  47.                             foreach ($rp as $r=>$resp) {
  48.                                 $msg .= $resp->Mensagem.' - Produto: '.$resp->ObjectId.'<br>';
  49.                             }
  50.                         }
  51.                         
  52.                     }
  53.                     
  54.                     //Inicializa variáveis
  55.                     $cont 0;
  56.                     unset($listaDePrecosProduto);
  57.                     
  58.                 }
  59.             }
  60.             
  61.             //Verifica se existe resto
  62.             if ($cont 0){
  63.                 $result $sap->SalvarPrecoLst($listaDePrecosProduto);
  64.             
  65.                 //Guarda Mensagem retornada
  66.                 foreach ($result as $post => $resposta) { //Loop para mostrar os dados
  67.                     foreach ($resposta->RespostaProcessamentoLst as $rl=>$rp) {
  68.                         foreach ($rp as $r=>$resp) {
  69.                             $msg .= $resp->Mensagem.' - Produto: '.$resp->ObjectId.'<br>';
  70.                         }
  71.                     }
  72.             
  73.                 }
  74.             
  75.             
  76.             }
  77.         
  78.         
  79.             if ($msg) {
  80.                 new TMessage('info',$msg);
  81.                 
  82.             } else{
  83.                 echo 'Erro ao ler o Resultado';
  84.             }
  85.         }
  86.         catch ( SoapFault $exception ) {
  87.             print "***Caught Exception***<br />";
  88.             echo '<pre>';
  89.             print_r $exception );
  90.             echo '</pre>';
  91.             print "***END Exception***<br />";
  92.             die ();
  93.         }
  94.     }
  95. ?>


Bom pessoal... é isso!
caso tenham sugestões de melhorias fiquem a vontade.

abs!

Pacotão Dominando o Adianti Framework 7
O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado! Versão 7.4


Dominando o Adianti 7 Quero me inscrever agora!

Comentários (4)


RC

Você está de parabéns. Grande contribuição.
PD

Obrigado pela contribuição!
GZ

Obrigada pela ajuda! Abraços!
GZ

Olá, tudo bem?

Desculpe a pergunta de leigo , mas como você faz para buscar o nome da tag?

Porque eu verifiquei o manual dessa empresa e ele não bate em alguns casos, ou pelo menos não funcionou comigo.

Por exemplo: No manual, para integrar marca, ele diz que o objeto é Marca. Porém, só funciona se enviar marca (tudo minúsculo). A tag SiteCategoria também não é assim, é categoria. Mas não sei exatamente onde buscar essas informações.

Obrigada pela atenção!