Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
olá pessoal,
ao começa a desenvolver o sistema de pagamento webservice redecard em minha loja me deparei com Soap. Até então não conhecia, mas procurei sobre o assunto.
Devo enviar e receber parametros por 3 vezes usando Soap.
Na primeira etapa (operação GetAuthorized) os parametros são enviados para a URL https://ecommerce.redecard.com.br/pos_virtual/wskomerci/cap.asmx.
Enviei os parametros por form para url porém com o final /GetAuthorized, assim me retorna o XML com outros parametros, eu tenho que pegar esses dados e enviar outros para confirmar a transação. Agora eles chamam de Operação ConfirmTxn e envio para a mesma URL. De novo me retorna um XML e preciso pegar os dados e enviar para https://ecommerce.redecard.com.br/pos_virtual/cupom.asp para emitir o comprovante.
A minha dúvida é como eu capturo esse XML que me é retornado para depois enviar novamente?
Como faço isso por soap? Imagino que por Soap seja melhor pq posso fazer todo o processo de uma só vez sem ficar redirecinando a pagina.
Agradeço desde já
Obrigado por resposnder Léo!
Não consigo usar a função simplexml_load_string, pois ao enviar o form já é carregado o XML.
Aqui você pode ver como acontece: http://174.122.1.105/teste/komerci_teste.php
O form é enviado e logo depois aparece o XML.
Acredito que deve ter alguma função Soap que pegue isso. Estava vendo a __doRequest.
Penso também que talvez não tenho que enviar por form, mas tudo soap. Talvez com a função __soapCall.
Está muito dificil de entender o manual php pra classe Soap.
O manual está aqui para você entender minha dúvida. Por favor, não quero que façam para mim, além disso quero aprender!!!
https://services.redecard.com.br/NovoPortal/Portals/_PierNet/documents/Komerci_Manual_Webservice.pdf
Tenho apenas 3 meses que comecei a estudar programação, e to com muita vontade de aprender!
Obrigado novamente.
Tentei adaptar um script para minha necessidade:
<?php
/**
* Troque pelo caminho do WSDL do seu webservice
*/
$wsdl = 'https://ecommerce.redecard.com.br/pos_virtual/wskomerci/cap.asmx?WSDL';
/**
* Se seu webservice não for SOAP 1.1 document literal com codificação UTF-8,
* faça os ajustes para o seu caso
*/
$client = new SoapClient($wsdl,array('exceptions' => 1,
'style' => SOAP_DOCUMENT,
'use' => SOAP_LITERAL,
'soap_version' => SOAP_1_1,
'encoding' => 'UTF-8',
'TOTAL' => '0.01',
'TRANSACAO' => 08,
'FILIACAO' => 123456,
'NUMPEDIDO' => 578,
'NRCARTAO'=> 1234123412341234,
'CVC2' => 123,
'MES' => 11,
'ANO' => 14,
'PORTADOR'=> 'Frederic Chopin',
'IATA' => NULL,
'DISTRIBUIDOR' => NULL,
'CONCENTRADOR' => NULL,
'TAXAEMBARQUE' => NULL,
'ENTRADA' => NULL,
'NUMDOC1' => NULL,
'NUMDOC2' => NULL,
'NUMDOC3' => NULL,
'NUMDOC4' => NULL,
'PAX1' => NULL,
'PAX2' => NULL,
'PAX3' => NULL,
'PAX4' => NULL,
'CONFTXN' => NULL,
'ADD_DATA' => NULL
)
);
try {
$response = $client->GetAuthorized(); //chamando o método ListaProfissoes
var_dump ($response ); //vai exibir a resposta
} catch ( SoapFault $f ){
echo 'Opz, ' , $f->getMessage();
}
?>
O que me retorna é
object(stdClass)#2 (1) { ["GetAuthorizedResult"]=> object(stdClass)#3 (1) { ["any"]=> string(247) "76Refa%E7a+a+transa%E7%E3o.+Sua+transa%E7%E3o+n%E3o+pode+ser+conclu%EDda.+Por+favor,+tente+novamente." } }
Isso que dizer que estou enviado os parametros coretamente? Estranho pq quando envio do mesmo jeito por form o codigo é 23 e não 76, e a mensagem é outra.
Olá André,
Estou usando HTTPS sim.
Consultei o link q indicou e pelo que percebi eles desistiram do soap e estão usando curl? Eu também não conhecia curl.
Esta tudo bem obscuro pra mim, não consigo encontrar nenhum exemplo para o meu caso, nem no google.
Pelo que vi conectar com o webservice é facil (isso pq eu acho q consegui conecta) mas depois disso não tenhop nem ideia de que fazer. Precisaria apenas saber como enviar os parametros e como pego as informação que recebo.
Pessoal, neste tópico aquiusei como exemplo para mim, pois é exatamente o modo que preciso enviar.
Adaptei para minha necessidade mas está dando erro "Catchable fatal error: Object of class stdClass could not be converted to string"
Objeto da classe std não pode ser convertido para string
<?php
/**
* Preparando requisição
*/
$parameters = new stdClass();
$parameters->Total = '0.01'; //aqui você vai colocar seu merchantId
$parameters->Transacao = '04';
$parameters->Parcelas = '00';
$parameters->Filiacao = '123123';
$parameters->NumPedido = '123';
$parameters->Nrcartao = '1234123412341234';
$parameters->CVC2 = '123';
$parameters->Mes = '11';
$parameters->Ano = '11';
$parameters->Portador = 'Frederic Chopin';
$parameters->IATA = NULL;
$parameters->Distribuidor = NULL;
$parameters->Concentrador = NULL;
$parameters->TaxaEmbarque = NULL;
$parameters->Entrada = NULL;
$parameters->Pax1 = NULL;
$parameters->Pax2 = NULL;
$parameters->Pax3 = NULL;
$parameters->Pax4 = NULL;
$parameters->Numdoc1 = NULL;
$parameters->Numdoc2 = NULL;
$parameters->Numdoc3 = NULL;
$parameters->Numdoc4 = NULL;
$parameters->ConfTxn = NULL;
$parameters->Add_Data = NULL;
/**
* Aqui enviamos a requisição
*/
try {
$komerci = new SoapClient( 'https://ecommerce.redecard.com.br/pos_virtual/wskomerci/cap.asmx?WSDL',
array(
'trace' => 1,
'exceptions' => 1,
'style' => SOAP_DOCUMENT,
'use' => SOAP_LITERAL,
'soap_version' => SOAP_1_1,
'encoding' => 'UTF-8'
)
);
/**
* A variável $EncryptRequestResult abaixo conterá o conteúdo criptografado se tudo ocorrer bem
*/
$GetAuthorizedResponse = $komerci->GetAuthorized( $parameters );
echo $GetAuthorizedResponse->GetAuthorizedResult; //Exibindo o conteúdo criptografado
} catch( SoapFault $fault ){
echo 'Ocorreu um erro: ' , $fault->getMessage();
}
?>
De onde será que vem essa stdClass()?
Olá Pessoal,
Consegui resolver metade do problema, o código funciona muito bem para mim. O que estava dando erro era dar um echo em $GetAuthorizedResponse->GetAuthorizedResult;
Com um print_r me aparece o retorno.
Ou também echo $komerci->__getLastResponse(); me aparece a resposta limpa.
Agora o meu problema é tratar o XML retornado.
Ele me retorna assim
stdClass Object ( [any] => 26Transa%E7%E3o+n%E3o+autorizada123 )
Mas o código fonte retorna assim:
stdClass Object
(
[any] =>
<AUTHORIZATION xmlns="">
<CODRET>26</CODRET>
<MSGRET>Transa%E7%E3o+n%E3o+autorizada</MSGRET>
<NUMPEDIDO>123</NUMPEDIDO>
<DATA/>
<NUMAUTOR/>
<NUMCV/>
<NUMAUTENT/>
<NUMSQN/>
<ORIGEM_BIN/>
</AUTHORIZATION>
)
Como faço para tratar isso, já que ele exclui as tags do xml?
No máximo com um
echo $komerci->__getLastResponse();
ele me retorna
26Transa%E7%E3o+n%E3o+autorizada123
E o código fonte
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<GetAuthorizedResponse xmlns="http://ecommerce.redecard.com.br">
<GetAuthorizedResult>
<AUTHORIZATION xmlns="">
<CODRET>26</CODRET>
<MSGRET>Transa%E7%E3o+n%E3o+autorizada</MSGRET>
<NUMPEDIDO>123</NUMPEDIDO>
<DATA></DATA>
<NUMAUTOR></NUMAUTOR>
<NUMCV></NUMCV>
<NUMAUTENT></NUMAUTENT>
<NUMSQN></NUMSQN>
<ORIGEM_BIN></ORIGEM_BIN>
</AUTHORIZATION>
</GetAuthorizedResult>
</GetAuthorizedResponse>
</soap:Body>
</soap:Envelope>
Agradeço mais uma vez pela grande força que o forum esá dando!
Realmente o fórum é de alto nível, não estava conseguindo encontrar isso nem gringo. Ainda mais para quem está iniciando.
Abraço
LlHardRex confesso que você fez o mais dificil e esbarrou na parte mais simples. De qualquer forma estamos ai pra ajudar
$GetAuthorizedResponse = $komerci -> GetAuthorizedTst($parameters);
$resposta = $GetAuthorizedResponse -> GetAuthorizedTstResult; //Exibindo o conteúdo criptografado
echo $resposta -> any;
Você já finalizou este código?
Abs
Desculpe, li novamente e sua pergunta era sobre tratar o XML.
Segue código:
$GetAuthorized = $komerci -> GetAuthorizedTst($parms);
$resposta = $GetAuthorized -> GetAuthorizedTstResult; //Exibindo o conteúdo criptografado
$xml = simplexml_load_string($resposta -> any);
echo $xml -> CODRET;
Nos meus testes sempre dá retorno 76, e em produção retorno 24.
Sabe me dizer se precisa configurar alguma coisa dentro do painel do komerci?
Etapombas, terminei o código sim. Depois de muito quebrar a cabeça, simplismente tratei o xml que é retornado até deixar ele puro. Usei str_replace e preg_match_all para deixar-lo assim:
<AUTHORIZATION>
<CODRET>26</CODRET>
<MSGRET>Transa%E7%E3o+n%E3o+autorizada</MSGRET>
<NUMPEDIDO>123</NUMPEDIDO>
<DATA></DATA>
<NUMAUTOR></NUMAUTOR>
<NUMCV></NUMCV>
<NUMAUTENT></NUMAUTENT>
<NUMSQN></NUMSQN>
<ORIGEM_BIN></ORIGEM_BIN>
</AUTHORIZATION>
Desculpe não ter postado antes, vou colocar como resolvido.
Abraço e muito obrigado pela ajuda.
Legal, mas você viu que eu postei uma forma de tratar o xml mais fácil do que o preg_match?
Amigo também fiquei preso no erro 76 refaça a transação, estou usando Https e SoapClient .
O que fez para resolver?
Obrigado
Para trabalhar com Soap no PHP você pode utilizar a classe SoapClient e para ler o XML recebido a função simplexml_load_string, que irá ler o conteúdo do XML e retornar um objeto com os dados.
Não sei se é essa exatamente a sua dúvida, mas qualquer coisa posta aí.