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. function __construct() {
  31. $this->SOAP_OPTS = array (
  32. 'login' => 'xxxxxxx',
  33. 'password' => '********',
  34. 'features' => SOAP_SINGLE_ELEMENT_ARRAYS ,
  35. 'namespace' => SAPWebServices::ZRW_WS_PRODUTO_NAMESPACE,
  36. 'schemaLocation' => SAPWebServices::ZRW_WS_PRODUTO_SCHEMALOCATION
  37. );
  38. }
  39. public function getFunctions() {
  40. $this->client = new SoapClient ( SAPWebServices::SERVER , $this->SOAP_OPTS );
  41. try {
  42. return $this->client->__getFunctions();
  43. } catch ( SoapFault $e ) {
  44. throw $e;
  45. }
  46. }
  47. public function salvarPreco(stdClass $precos) {
  48. $this->client = new SoapClient ( SAPWebServices::SERVER , $this->SOAP_OPTS );
  49. //Depende da exigência do xml do webservice
  50. $params = array (
  51. 'CodigoIntegracao' => $precos->CodigoIntegracao,
  52. 'PrecoProduto' => $precos->PrecoProduto,
  53. 'Promocao' => $precos->Promocao,
  54. 'PrecoPromocao' => $precos->PrecoPromocao,
  55. 'PromocaoInicio' => $precos->PromocaoInicio,
  56. 'PromocaoFim' => $precos->PromocaoFim,
  57. 'CodigoIntegracaoSubVariacao' => $precos->CodigoIntegracaoSubVariacao,
  58. 'CodigoIntegracaoVariacao' => $precos->CodigoIntegracaoVariacao
  59. );
  60. try {
  61. return $this->client->SalvarPreco( array('Preco' => $params) );
  62. } catch ( SoapFault $e ) {
  63. throw $e;
  64. }
  65. }
  66. public function salvarPrecoLst( $precosLst) {
  67. $this->client = new SoapClient ( SAPWebServices::SERVER , $this->SOAP_OPTS );
  68. foreach ($precosLst as $prc) {
  69. $params = array (
  70. 'CodigoIntegracao' => $prc->CodigoIntegracao,
  71. 'PrecoProduto' => $prc->PrecoProduto,
  72. 'Promocao' => $prc->Promocao,
  73. 'PrecoPromocao' => $prc->PrecoPromocao,
  74. 'PromocaoInicio' => $prc->PromocaoInicio,
  75. 'PromocaoFim' => $prc->PromocaoFim,
  76. 'CodigoIntegracaoSubVariacao' => $prc->CodigoIntegracaoSubVariacao,
  77. 'CodigoIntegracaoVariacao' => $prc->CodigoIntegracaoVariacao
  78. );
  79. $lst[] = $params;
  80. }
  81. try {
  82. return $this->client->SalvarPrecoLst( array('Preco' => $lst) );
  83. } catch ( SoapFault $e ) {
  84. throw $e;
  85. }
  86. }
  87. }
  88. ?>

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


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


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

abs!

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework 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!