Lançado Adianti Framework 7.6!
Clique aqui para saber mais
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!

Curso completo Meu Negócio Pronto
Use para si, ou transforme em um negócio: Inclui aulas e códigos-fontes
Gestor de conteúdo (SITE) + Loja Virtual (E-Commerce) + Emissor de Notas para infoprodutos


Meu negócio pronto 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!