Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Alguem sabe como enviar esse xml via POST
<purchaseService xmlns="http://br.com.getnet.ecommerce.ws.service/"> <!--Optional:--> <arg0 xmlns=""> <authentication> <username>string</username> <password>string</password> <merchantID>string</merchantID> </authentication> <purchases> <!--Zero or more repetitions:--> <purchase> <terminalID>string</terminalID> <merchantTrackID>string</merchantTrackID> <amount>string</amount> <currencycode>string</currencycode> <instType>string</instType> <!--Optional:--> <instNum>string</instNum> <card> <number>string</number> <!--Optional:--> <cvv2>string</cvv2> <expiryMonth>string</expiryMonth> <expiryYear>string</expiryYear> <holderName>string</holderName> </card> <!--Optional:--> <userDefinedField> <!--Optional:--> <udf1>string</udf1> <!--Optional:--> <udf2>string</udf2> <!--Optional:--> <udf3>string</udf3> <!--Optional:--> <udf4>string</udf4> <!--Optional:--> <udf5>string</udf5> </userDefinedField> <!--Optional:--> <tranMCC>string</tranMCC> <!--Optional:--> <softDescriptor>string</softDescriptor> </purchase> </purchases> </arg0> </purchaseService>
O envio é via POST.
Eu tenho que passar esse xml pelo metodo POST, na URL, veja a url abaixo.
$info_conecta = array( "trace" => 1,
"location" => "https://cgws-hti.getnet.com.br:4443/eCommerceWS/1.0/AdministrationService",
"uri" => "https://cgws-hti.getnet.com.br:4443/eCommerceWS/1.0/AdministrationService");
$client = new SoapClient("./wsdl/AdministrationService.wsdl",$info_conecta);
$compra = $client->changeAuthenticationService($request);Ainda assim está um pouco confuso, pois em um momento você fala POST mas no exemplo usa SOAP.
Você deve verificar o arquivo WSDL, pois ele descreve tudo que é necessário passar. Se o XML acima passado é a descrição de um método, indentando-o você encontrará tudo que é necessário:
<purchaseService xmlns="http://br.com.getnet.ecommerce.ws.service/">
<!--Optional:-->
<arg0 xmlns="">
<authentication>
<username>string</username>
<password>string</password>
<merchantID>string</merchantID>
</authentication>
<purchases>
<!--Zero or more repetitions:-->
<purchase>
<terminalID>string</terminalID>
<merchantTrackID>string</merchantTrackID>
<amount>string</amount>
<currencycode>string</currencycode>
<instType>string</instType>
<!--Optional:-->
<instNum>string</instNum>
<card>
<number>string</number>
<!--Optional:-->
<cvv2>string</cvv2>
<expiryMonth>string</expiryMonth>
<expiryYear>string</expiryYear>
<holderName>string</holderName>
</card>
<!--Optional:-->
<userDefinedField>
<!--Optional:-->
<udf1>string</udf1>
<!--Optional:-->
<udf2>string</udf2>
<!--Optional:-->
<udf3>string</udf3>
<!--Optional:-->
<udf4>string</udf4>
<!--Optional:-->
<udf5>string</udf5>
</userDefinedField>
<!--Optional:-->
<tranMCC>string</tranMCC>
<!--Optional:-->
<softDescriptor>string</softDescriptor>
</purchase>
</purchases>
</arg0>
</purchaseService>
Para passar os dados, você possui algumas formas, como arrays associativos, standard class ou mapeamento de classes.
Como exemplo vou usar uma standard class, supondo que o nome do método é purchaseService:
$purchaseService = new stdClass();
$authentication = new stdClass();
$authentication->username = "usuario";
$authentication->password = "senha";
$authentication->merchantID = "id";
$purchaseService->arg0->authentication = $authentication;
/ exemplo compacto de várias compras /
/ é preferível utilizar \ArrayObject ao invés de array() /
$purchases = new \ArrayObject();
$purchase = new stdClass();
$purchase->terminalID = "string";
$purchase->merchantTrackID = "string";
$purchase->amount = "string";
$purchase->currencycode = "string";
$purchase->instType = "string";
/**
demais configurações
**/
/ adiciona-se o tipo especificado como SoapVar /
$purchases->append(new \SoapVar($purchase , SOAP_ENC_OBJECT , null , null , 'purchase'));
/ suponha-se que existe $purchase1 e $purchase2 /
$purchases->append(new \SoapVar($purchase1 , SOAP_ENC_OBJECT , null , null , 'purchase'));
$purchases->append(new \SoapVar($purchase2 , SOAP_ENC_OBJECT , null , null , 'purchase'));
$purchaseService->arg0->purchases = new \SoapVar($purchases , SOAP_ENC_OBJECT , null , null , 'purchases');
/ varíavel criada no seu exemplo /
$return = $client->purchaseService($purchaseService);
Perceba que somente no momento em que eu criei uma lista de compras, eu fiz uso de SoapVar, e na hora da autenticação não. Isso se faz necessário para uma melhor interpretação da lista no XML, uma vez que em nenhum momento é definido que é uma lista do objeto "purchase", apenas "purchases".É interessante ler sobre o erro da tag BOGUS
Gabriel, valew pela explicação consegui entender o funcionamento do SOAP,
A questão acima é que na documentação diz via POST e no exemplo esta em SOAP, e como eu não conhecia SOAP fiquei perdido, mas agora eu vi que da pra fazer das duas formas.
consegui fazer em SOAP mas agora não estou conseguindo pegar a informação descriptionResponse do array, em uma tela de consulta da transação.
Com o var_dump($result) ele imprime todo o resultado mas eu preciso apenas do descriptionResponse e o transactionID
<?php
ini_set('soap.wsdl_cache_enabled',0);
ini_set('soap.wsdl_cache_ttl',0);
class JaxWsSoapClient extends SoapClient
{
public function __call($method, $arguments){
$response = parent::__call($method, $arguments);
return $response;
}
}
try {
$client = new JaxWsSoapClient("./wsdl/CommerceService.wsdl",
array("trace" => 1,
"location" => "https://cgws-hti.getnet.com.br:4443/eCommerceWS/1.0/CommerceService",
"uri" => "https://cgws-hti.getnet.com.br:4443/eCommerceWS/1.0/CommerceService",
));
$request = array(
'arg0' => array(
'authentication' => array(
'username' => 'user',
'password' => 'pass',
'merchantID' => '54345',
),
'query' => array(
'query' => array(
'terminalID' => 'D055362101',
'merchantTrackID' => '0008',
),
),
),
);
$result = $client->__call('queryDataService', array($request));
echo("<br/>Dumping request:<br/>".$client->__getLastRequest());
echo("<br/>Returning value of __soapCall() call:<br/> ");
var_dump($result);
}catch(SoapFault $exception)
{
print_r("Got issue:<br/>") ;
print_r($exception->getMessage());
}
?>
Resultado
object(stdClass)#2 (1) { ["queryResponse"]=> object(stdClass)#3 (1) { ["result"]=> object(stdClass)#4 (1) { ["result"]=> object(stdClass)#5 (7) { ["transactionID"]=> string(16) "65364455766456471" ["originalTransactionID"]=> string(2) "-1" ["merchantTrackID"]=> string(4) "0008" ["descriptionResponse"]=> string(8) "APPROVED" ["responseCode"]=> string(2) "00" ["auth"]=> string(6) "026155" ["postdate"]=> string(4) "0407" } } } }
O restorno é um stdClass, que você armazena em $result.
O método __getLastRequest apenas mostra o XML da última requisição, ele é para debug de código e não para uso em produção, você deve utilizar a variável $result.
var_dump($result);
A partir desse resultado, você pode consultar as variáveis mais abaixo:
$queryResponse = $result->result->result;
echo $queryResponse->transactionID;
echo $queryResponse->originalTransactionID;
/ assim por diante /Não entendi, pois aqui não funcionou o código ficou assim
<?php
ini_set('soap.wsdl_cache_enabled',0);
ini_set('soap.wsdl_cache_ttl',0);
class JaxWsSoapClient extends SoapClient
{
public function __call($method, $arguments){
$response = parent::__call($method, $arguments);
return $response;
}
}
try {
$client = new JaxWsSoapClient("./wsdl/CommerceService.wsdl",
array("trace" => 1,
"location" => "https://cgws-hti.getnet.com.br:4443/eCommerceWS/1.0/CommerceService",
"uri" => "https://cgws-hti.getnet.com.br:4443/eCommerceWS/1.0/CommerceService",
));
$request = array(
'arg0' => array(
'authentication' => array(
'username' => 'user',
'password' => 'pass',
'merchantID' => '54345',
),
'query' => array(
'query' => array(
'terminalID' => 'D055362101',
'merchantTrackID' => '0008',
),
),
),
);
$result = $client->__call('queryDataService', array($request));
echo("<br/>Dumping request:<br/>".$client->__getLastRequest());
echo("<br/>Returning value of __soapCall() call:<br/> ");
var_dump($result);
$queryResponse = $result->result->result;
echo $queryResponse->transactionID;
echo $queryResponse->originalTransactionID;
}catch(SoapFault $exception)
{
print_r("Got issue:<br/>") ;
print_r($exception->getMessage());
}
?>O código que eu te passei, é para você verificar o retorno, e não para usar em produção.
var_dump exibe o conteúdo da variável, avalie o que ela recebe e, então, utilize e ajuste o exemplo que eu passei por segundo.
resultado do var_dump
object(stdClass)#2 (1) { ["queryResponse"]=> object(stdClass)#3 (1) { ["result"]=> object(stdClass)#4 (1) { ["result"]=> object(stdClass)#5 (7) { ["transactionID"]=> string(16) "6536445561450971" ["originalTransactionID"]=> string(2) "-1" ["merchantTrackID"]=> string(4) "0008" ["descriptionResponse"]=> string(8) "APPROVED" ["responseCode"]=> string(2) "00" ["auth"]=> string(6) "026155" ["postdate"]=> string(4) "0407" } } } }
Agora esse final eu não entendi ainda.
$result = $client->__call('QueryDataService', array($request));
$queryResponse = $result->result->result;
echo $queryResponse->descriptionResponse;
echo $queryResponse->originalTransactionID;
}catch(SoapFault $exception)
{
print_r("Got issue:<br/>") ;
print_r($exception->getMessage());
}Veja bem, o var_dump resultou isso (obs: idente seus códigos, inclusive os retornos, facilitam a compreensão):
object(stdClass)#2 (1) {
["queryResponse"]=> object(stdClass)#3 (1) {
["result"]=> object(stdClass)#4 (1) {
["result"]=> object(stdClass)#5 (7) {
["transactionID"]=> string(16) "6536445561450971"
["originalTransactionID"]=> string(2) "-1"
["merchantTrackID"]=> string(4) "0008"
["descriptionResponse"]=> string(8) "APPROVED"
["responseCode"]=> string(2) "00"
["auth"]=> string(6) "026155"
["postdate"]=> string(4) "0407"
}
}
}
}
Veja que o objeto é uma stdClass, logo, você deve acessar ela como uma classe. Lhe darei um exemplo aonde eu crio uma stdClass:
$class = new stdClass();
$class->variavel = "um resultado qualquer";
$class->result = new stdClass();
$class->result->result = new stdClass();
$class->result->result->result = "mais um valor qualquer";
var_dump($class);
Saída:
object(stdClass)[1]
public 'variavel' => string 'um resultado qualquer' (length=21)
public 'result' =>
object(stdClass)[2]
public 'result' =>
object(stdClass)[3]
public 'result' => string 'mais um valor qualquer' (length=22)
Apesar da saída ser um pouco diferente (provavelmente seja pelo xdebug instalado na minha máquin) o exemplo continua sendo válido
Gabriel Heming Muito obrigado!
Agora consegui resolver!
É POST ou SOAP?