Criando uma requisição de pagamento do PagSeguro via XML usando PHP – Sem utilizar a biblioteca oficial

Um dos maiores pontos fortes da API de pagamento é a possibilidade de enviar os dados, sem que o internauta consiga interceptar e alterar esses dados usando apenas a interface apresentada na tela, sem contar a possibilidade de mudar a URL de redirecionamento (não confunda com a URL de notificação).

O que iremos utilizar para a comunicação irá ser a biblioteca do cURL, e para manipular os dados recebidos vamos usar função simplexml_load_string  para transformar o XML em objeto, igual utilizamos para receber as notificações em “

Recebendo notificações do PagSeguro usando PHP”. Enfim, vamos ao que interessa… Código…

Por questões de segurança o PagSeguro precisa do e-mail e token, então iremos gravar cada um em uma variável

1
2
$email = [email protected]';
$token = '95112EE828D94278BD394E91C4388F20';

O e-mail e token serão enviados via GET como na URL mostrada abaixo.

1
https:[email protected].br&token=95112EE828D94278BD394E91C4388F20

Vamos montar nossa URL juntando a variável $email e a $token, mais a parte fixa da URL ficará algo assim.

1
$url = 'https://ws.pagseguro.uol.com.br/v2/checkout/?email=' . $email . '&token=' . $token;

O XML a ser enviado vou colocar na variável  $XML, para efeito de testes iremos utilizar dados fixos, a forma que você irá montar o XML irá depender da sua criatividade, sugestão, pegar do banco de dados, percorrer o Array (ou objeto) de dados montando o nó item. Se tiver muita demanda posso até escrever sobre isso mais tarde, porem eu acredito que é algo simples de vocês fazerem. Caso alguma alma bondosa quiser montar o tutorial e disponibilizar poderei publicar aqui…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
$xml = '<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
    <checkout>
        <currency>BRL</currency>
        <redirectURL>http://www.minhaloja.com.br/paginaDeRedirecionamento</redirectURL>
        <items>
            <item>
                <id>0001</id>
                <description>Notebook Prata</description>
                <amount>1.00</amount>
                <quantity>1</quantity>
                <weight>1000</weight>
            </item>
            <item>
                <id>0002</id>
                <description>Notebook Rosa</description>
                <amount>2.00</amount>
                <quantity>2</quantity>
                <weight>750</weight>
            </item>
        </items>
        <reference>REF1234</reference>
        <sender>
            <name>José Comprador</name>
            <email>[email protected]</email>
            <phone>
                <areaCode>11</areaCode>
                <number>55663377</number>
            </phone>
        </sender>
        <shipping>
            <type>1</type>
            <address>
                <street>Rua sem nome</street>
                <number>1384</number>
                <complement>5o andar</complement>
                <district>Jardim Paulistano</district>
                <postalCode>01452002</postalCode>
                <city>Sao Paulo</city>
                <state>SP</state>
                <country>BRA</country>
            </address>
        </shipping>
    </checkout>';

Um campo que merece destaque é o redirectURL, onde o mesmo SÓ IRÁ FUNCIONAR SE NA SUA CONTA CONTA ESTIVER MARCADO “

Agora vamos chamar o cURL e passar como endereço, a URL que acabamos de montar.

1
$curl = curl_init($url);

Possivelmente pode ocorrer o seguinte erro: Fatal error: Call to undefined function curl_init(); Isso ocorre quando a biblioteca do cURL não está presente no seu servidor, ou está desativada.

Vamos configurar o cURL para não verificar os certificados SSL do PagSeguro.

1
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

Como precisamos da resposta do servidor do PagSeguro então vamos marcar no cURL que é para ele trazer uma resposta.

1
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

O cURL precisa saber que tipo de dados ele está transportando, para isso teremos que alterar o cabeçalho.

1
curl_setopt($curl, CURLOPT_HTTPHEADER, Array('Content-Type: application/xml; charset=ISO-8859-1'));

E por fim, o mais importante, o XML com os dados que o cURL irá transportar.

1
curl_setopt($curl, CURLOPT_POSTFIELDS, $xml);

Hora de executar o cURL, ele deverá retornar a resposta do servidor do PagSeguro, que deverá ser um XML, iremos gravar essa informação na variável $xml

1
$xml= curl_exec($curl);

Se por algum acaso seu token ou e-mail estiver errado dentro de $xml irá ter o texto: Unauthorized. Nesse caso sugiro redirecionar o comprador para uma pagina mostrando uma tela de erro qualquer, e tentar tratar o erro de alguma forma.

1
2
3
4
5
6
if($xml == 'Unauthorized'){
    //Insira seu código avisando que o sistema está com problemas, sugiro enviar um e-mail avisando para alguém fazer a manutenção 

    header('Location: paginaDeErro.php');
    exit;//Mantenha essa linha
}

Não iremos precisar mais do cURL, então vamos fechar

1
curl_close($curl);

Caso os dados informados estejam tudo certinho e você tiver passado os parâmetros para o PagSeguro como descrito na documentação oficial, dentro de $xml deverá ter algo similar ao abaixo:

1
2
3
4
5
<?xml version="1.0" encoding="ISO-8859-1"?>
<checkout>
    <code>8CF4BE7DCECEF0F004A6DFA0A8243412</code>
    <date>2010-12-02T10:11:28.000-02:00</date>
</checkout>

Caso você tenha passado algum parâmetro inválido você irá receber um XML igual ao abaixo:

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="UTF-8"?>  
<errors>  
    <error>
        <code>11004</code>
        <message>Currency is required.</message>  
    </error>
    <error>
        <code>11005</code>
        <message>Currency invalid value: 100</message>  
    </error>  
</errors>

Para conseguirmos manipular o XML facilmente, vamos transforma-lo em um objeto.

1
$xml= simplexml_load_string($xml);

O próximo passo é verificar em qual cenários acima estamos, se é o xml do erro ou se é o xml com o código identificador do pagamento, então chamaremos a função count para verificar se ocorreu algum erro.

1
2
3
4
5
6
if(count($xml -> error) > 0){
    //Insira seu código avisando que o sistema está com problemas, sugiro enviar um e-mail avisando para alguém fazer a manutenção, talvez seja útil enviar os códigos de erros.

    header('Location: paginaDeErro.php');
    exit;
}

Se passou do código acima só nos resta pegar o código e redirecionar o comprador para o PagSeguro.

1
header('Location: https://pagseguro.uol.com.br/v2/checkout/payment.html?code=' . $xml -> code);

Um ponto que vale a pena lembrar, o código gerado na requisição de pagamento, só irá servir para a requisição de pagamento, ele é diferente do código de transação e do código de notificação.

Como sempre, segue abaixo o código na integra:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<?php
$email = [email protected]';
$token = 'EEA7A261333147B3AF644102BF7EED07';
$url = 'https://ws.pagseguro.uol.com.br/v2/checkout/?email=' . $email . '&token=' . $token;
$xml = '<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
    <checkout>
        <currency>BRL</currency>
        <redirectURL>http://www.minhaloja.com.br/paginaDeRedirecionamento</redirectURL>
        <items>
            <item>
                <id>0001</id>
                <description>Notebook Prata</description>
                <amount>1.00</amount>
                <quantity>1</quantity>
                <weight>1000</weight>
            </item>
            <item>
                <id>0002</id>
                <description>Notebook Rosa</description>
                <amount>2.00</amount>
                <quantity>2</quantity>
                <weight>750</weight>
            </item>
        </items>
        <reference>REF1234</reference>
        <sender>
            <name>José Comprador</name>
            <email>[email protected]</email>
            <phone>
                <areaCode>11</areaCode>
                <number>55663377</number>
            </phone>
        </sender>
        <shipping>
            <type>1</type>
            <address>
                <street>Rua sem nome</street>
                <number>1384</number>
                <complement>5o andar</complement>
                <district>Jardim Paulistano</district>
                <postalCode>01452002</postalCode>
                <city>Sao Paulo</city>
                <state>SP</state>
                <country>BRA</country>
            </address>
        </shipping>
    </checkout>';

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, Array('Content-Type: application/xml; charset=ISO-8859-1'));
curl_setopt($curl, CURLOPT_POSTFIELDS, $xml);
$xml= curl_exec($curl);

if($xml == 'Unauthorized'){
    //Insira seu código avisando que o sistema está com problemas, sugiro enviar um e-mail avisando para alguém fazer a manutenção 

    header('Location: paginaDeErro.php');
    exit;//Mantenha essa linha
}

curl_close($curl);

$xml= simplexml_load_string($xml);

if(count($xml -> error) > 0){
    //Insira seu código avisando que o sistema está com problemas, sugiro enviar um e-mail avisando para alguém fazer a manutenção, talvez seja útil enviar os códigos de erros.
    header('Location: paginaDeErro.php');
    exit;
}

header('Location: https://pagseguro.uol.com.br/v2/checkout/payment.html?code=' . $xml -> code);

Lembrando que é possível também enviar informações para incluir uma assinatura(cobrança recorrente) tudo nesse mesmo processo.

Veja detalhes em: Requisição de pagamento do PagSeguro com assinatura associada usando PHP

Bom até a próxima, duvidas, sugestões e o qualquer coisa que possa ajudar o blog só comentar abaixo…

Veja outros posts como este aqui:

Utilizando as APIs do PagSeguro e PHP – Sem utilizar a biblioteca oficial.