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
[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:
3 - Método para integrar uma lista de produtos:
Bom pessoal... é isso!
caso tenham sugestões de melhorias fiquem a vontade.
abs!
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
- <?php
- /**
- * SAPWebServices
- * @author Eliezer de Morais Silva
- */
- /**
- * Baseado na Class do autor
- * @author Renan William Alves de Oliveira
- *
- */
- class SAPWebServices {
- const SERVER = 'http://webservice.com.br/CatalogoWS.svc?wsdl';
- //WSDL paths
- const ZRW_WS_PRODUTO_SCHEMALOCATION = 'http://webservice.com.br/CatalogoWS.svc?xsd=xsd2';
- const ZRW_WS_PRODUTO_NAMESPACE = 'http://schemas.webservice.Integration.ServiceModel.Produto';
- //default values
- const INITIAL_PASS = 'xxxx';
- const ABAP_TRUE = 'X';
- const ABAP_FALSE = '';
- /**
- *
- * @var array SAP Logon Details
- */
- private $SOAP_OPTS;
- /**
- *
- * @var SoapClient Soap Object
- */
- private $client;
- function __construct() {
- $this->SOAP_OPTS = array (
- 'login' => 'xxxxxxx',
- 'password' => '********',
- 'features' => SOAP_SINGLE_ELEMENT_ARRAYS ,
- 'namespace' => SAPWebServices::ZRW_WS_PRODUTO_NAMESPACE,
- 'schemaLocation' => SAPWebServices::ZRW_WS_PRODUTO_SCHEMALOCATION
- );
- }
- public function getFunctions() {
- $this->client = new SoapClient ( SAPWebServices::SERVER , $this->SOAP_OPTS );
- try {
- return $this->client->__getFunctions();
- } catch ( SoapFault $e ) {
- throw $e;
- }
- }
- public function salvarPreco(stdClass $precos) {
- $this->client = new SoapClient ( SAPWebServices::SERVER , $this->SOAP_OPTS );
- //Depende da exigência do xml do webservice
- $params = array (
- 'CodigoIntegracao' => $precos->CodigoIntegracao,
- 'PrecoProduto' => $precos->PrecoProduto,
- 'Promocao' => $precos->Promocao,
- 'PrecoPromocao' => $precos->PrecoPromocao,
- 'PromocaoInicio' => $precos->PromocaoInicio,
- 'PromocaoFim' => $precos->PromocaoFim,
- 'CodigoIntegracaoSubVariacao' => $precos->CodigoIntegracaoSubVariacao,
- 'CodigoIntegracaoVariacao' => $precos->CodigoIntegracaoVariacao
- );
- try {
- return $this->client->SalvarPreco( array('Preco' => $params) );
- } catch ( SoapFault $e ) {
- throw $e;
- }
- }
- public function salvarPrecoLst( $precosLst) {
- $this->client = new SoapClient ( SAPWebServices::SERVER , $this->SOAP_OPTS );
- foreach ($precosLst as $prc) {
- $params = array (
- 'CodigoIntegracao' => $prc->CodigoIntegracao,
- 'PrecoProduto' => $prc->PrecoProduto,
- 'Promocao' => $prc->Promocao,
- 'PrecoPromocao' => $prc->PrecoPromocao,
- 'PromocaoInicio' => $prc->PromocaoInicio,
- 'PromocaoFim' => $prc->PromocaoFim,
- 'CodigoIntegracaoSubVariacao' => $prc->CodigoIntegracaoSubVariacao,
- 'CodigoIntegracaoVariacao' => $prc->CodigoIntegracaoVariacao
- );
- $lst[] = $params;
- }
- try {
- return $this->client->SalvarPrecoLst( array('Preco' => $lst) );
- } catch ( SoapFault $e ) {
- throw $e;
- }
- }
- }
- ?>
[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:
- <?php
- function onIntegra1()
- {
- try {
- //Pega listagens na sessão
- $lstProd = TSession::getValue('listaWsPrc');//Lista de Produtos
- $lstChk = TSession::getValue('listaWsChk');//Lista de Produtos checados no form para integrar
- $sap = new SAPWebServices();
- //Cria o objeto para enviar para o WS
- foreach ($lstChk as $chk) {
- $preco = new stdClass();
- $preco->CodigoIntegracao = trim($lstProd->{$chk}->id);
- $preco->CodigoIntegracaoSubVariacao = '';
- $preco->CodigoIntegracaoVariacao = '';
- $preco->PrecoProduto = general_functions::formata_money_US($lstProd->{$chk}->preco,2);
- //Verifica se o produto está em promoção
- if (doubleval(general_functions::formata_money_US($lstProd->{$chk}->preco,2)) > 0) {
- $preco->Promocao = true;
- } else {
- $preco->Promocao = false;
- }
- $preco->PrecoPromocao = general_functions::formata_money_US($lstProd->{$chk}->promocao,2);
- $preco->PromocaoInicio = TDate::date2us($lstProd->{$chk}->data_ini);
- $preco->PromocaoFim = TDate::date2us($lstProd->{$chk}->data_fim);
- }
- $result = $sap->salvarPreco($preco);
- if ($result) {
- //print_r($parser);
- foreach ($result as $post) { //Loop para mostrar os dados
- new TMessage('info',$post->Mensagem);
- }
- } else{
- echo 'Erro ao ler o Resultado';
- }
- }
- catch ( SoapFault $exception ) {
- print "***Caught Exception***<br />";
- echo '<pre>';
- print_r ( $exception );
- echo '</pre>';
- print "***END Exception***<br />";
- die ();
- }
- }
- ?>
3 - Método para integrar uma lista de produtos:
- <?php
- function onIntegraLst()
- {
- try {
- //Pega listagens na sessão
- $lstProd = TSession::getValue('listaWsPrc');//Lista de Produtos
- $lstChk = TSession::getValue('listaWsChk');//Lista de checados
- $sap = new SAPWebServices();
- //cria contadores
- $nMaxEnvio = 200;//Máximo de produtos por envio, depende de documentação
- $cont = 0;
- $msg = '';
- //Cria o objeto para enviar para o WS
- foreach ($lstChk as $chk) {
- $cont++;
- $preco = new stdClass();
- $preco->CodigoIntegracao = trim($lstProd->{$chk}->id);
- $preco->CodigoIntegracaoSubVariacao = '';
- $preco->CodigoIntegracaoVariacao = '';
- $preco->PrecoProduto = general_functions::formata_money_US($lstProd->{$chk}->preco,2);
- //Verifica se o produto está em promoção
- if (doubleval(general_functions::formata_money_US($lstProd->{$chk}->preco,2)) > 0) {
- $preco->Promocao = true;
- } else {
- $preco->Promocao = false;
- }
- $preco->PrecoPromocao = general_functions::formata_money_US($lstProd->{$chk}->promocao,2);
- $preco->PromocaoInicio = TDate::date2us($lstProd->{$chk}->data_ini);
- $preco->PromocaoFim = TDate::date2us($lstProd->{$chk}->data_fim);
- $listaDePrecosProduto[] = $preco;
- if ($cont == $nMaxEnvio){
- $result = $sap->SalvarPrecoLst($listaDePrecosProduto);
- //Guarda Mensagem retornada
- foreach ($result as $post => $resposta) { //Loop para mostrar os dados
- foreach ($resposta->RespostaProcessamentoLst as $rl=>$rp) {
- foreach ($rp as $r=>$resp) {
- $msg .= $resp->Mensagem.' - Produto: '.$resp->ObjectId.'<br>';
- }
- }
- }
- //Inicializa variáveis
- $cont = 0;
- unset($listaDePrecosProduto);
- }
- }
- //Verifica se existe resto
- if ($cont > 0){
- $result = $sap->SalvarPrecoLst($listaDePrecosProduto);
- //Guarda Mensagem retornada
- foreach ($result as $post => $resposta) { //Loop para mostrar os dados
- foreach ($resposta->RespostaProcessamentoLst as $rl=>$rp) {
- foreach ($rp as $r=>$resp) {
- $msg .= $resp->Mensagem.' - Produto: '.$resp->ObjectId.'<br>';
- }
- }
- }
- }
- if ($msg) {
- new TMessage('info',$msg);
- } else{
- echo 'Erro ao ler o Resultado';
- }
- }
- catch ( SoapFault $exception ) {
- print "***Caught Exception***<br />";
- echo '<pre>';
- print_r ( $exception );
- echo '</pre>';
- print "***END Exception***<br />";
- die ();
- }
- }
- ?>
Bom pessoal... é isso!
caso tenham sugestões de melhorias fiquem a vontade.
abs!
Você está de parabéns. Grande contribuição.
Obrigado pela contribuição!
Obrigada pela ajuda! Abraços!
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!