Skip to content

Commit ffcece6

Browse files
author
pagseguro
committed
Importando o testserver do svn
0 parents  commit ffcece6

8 files changed

+287
-0
lines changed

PagSeguroTestsServer/HTTPSServer.py

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# -*- encoding: utf-8 -*-
2+
'''Servidor de teste para o PagSeguro.'''
3+
import socket, os, cgi
4+
from SocketServer import BaseServer
5+
from BaseHTTPServer import HTTPServer,BaseHTTPRequestHandler
6+
from SimpleHTTPServer import SimpleHTTPRequestHandler
7+
from OpenSSL import SSL
8+
9+
class SecureHTTPServer(HTTPServer):
10+
'''Servidor HTTPS com OpenSSL.'''
11+
def __init__(self, server_address, HandlerClass,fpem):
12+
BaseServer.__init__(self, server_address, HandlerClass)
13+
ctx = SSL.Context(SSL.SSLv23_METHOD)
14+
ctx.use_privatekey_file (fpem)
15+
ctx.use_certificate_file(fpem)
16+
self.socket = SSL.Connection(ctx, socket.socket(self.address_family,
17+
self.socket_type))
18+
self.server_bind()
19+
self.server_activate()
20+
21+
class HTTPSHandler(BaseHTTPRequestHandler):
22+
23+
def setup(self):
24+
self.connection = self.request
25+
self.rfile = socket._fileobject(self.request, "rb", self.rbufsize)
26+
self.wfile = socket._fileobject(self.request, "wb", self.wbufsize)
27+
28+
def send(self,msg,code=200):
29+
'''Envia HTML para o client'''
30+
self.send_response(code)
31+
self.end_headers()
32+
self.wfile.write(msg)
33+
34+
def do_POST(self):
35+
'''Responde a requisições POST'''
36+
if self.rfile:
37+
self.data=cgi.parse_qs(self.rfile.read(int(self.headers['Content-Length'])))
38+
else:
39+
self.data={}
40+
ret=self.process()
41+
self.send(ret)
42+
43+
def process(self):
44+
'''Processa a requisição. Sobrescreva este método em suas subclasses.'''
45+
return "Hello world!"
46+
47+
def do_GET(self):
48+
'''Apenas mostra uma mensagem de erro, uma vez que não deveríamos mesmo usar GET.'''
49+
self.send("Why GETting?")
50+
51+
#server.pem's location (containing the server private key and
52+
#the server certificate).
53+
fpem = 'server.pem'
54+
55+
def run(HandlerClass = HTTPSHandler,
56+
ServerClass = SecureHTTPServer):
57+
'''Roda o servidor'''
58+
server_address = ('', 443) # (address, port)
59+
httpd = ServerClass(server_address, HandlerClass, fpem)
60+
httpd.serve_forever()
61+
62+
if __name__ == '__main__':
63+
run()
64+
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from HTTPSServer import *
2+
from pagseguroMockup import pagseguro
3+
4+
class PagSeguroHandler(HTTPSHandler):
5+
def process(self):
6+
return pagseguro.process(self.path,self.data)
7+
8+
if __name__=="__main__":
9+
run(PagSeguroHandler,SecureHTTPServer)
10+
11+

PagSeguroTestsServer/pagseguroMockup/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
# -*- encoding: utf-8 -*-
2+
import random,md5
3+
from datetime import datetime
4+
from settings import retornourl
5+
6+
template="""<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
7+
<html xmlns="http://www.w3.org/1999/xhtml">
8+
9+
<head>
10+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
11+
12+
<title>%(titulo)s</title>
13+
14+
</head>
15+
16+
<body>
17+
<h1>%(titulo)s</h1>
18+
<pre>%(dump)s</pre>
19+
<hr />
20+
<form method="POST" action="%(url)s" target="_blank">
21+
%(formdump)s
22+
<input type="submit" value="Testar Retorno Automático" />
23+
</form>
24+
25+
<hr />
26+
<a href="%(url)s">Testar link de retorno para a loja</a>
27+
28+
</body>
29+
30+
</html>"""
31+
32+
def input(name,value):
33+
'''Gera um input hidden HTML'''
34+
return '<input name="%(name)s" value="%(value)s" type="hidden" />\n' % locals()
35+
36+
def select(name,values):
37+
'''Gera um input select HTML'''
38+
return '<label>'+name+': <select name="'+name+'">\n'+('\n'.join([
39+
'<option value="%s">%s</option>' % (i,i) for i in values
40+
]))+'\n</select></label><br />\n'
41+
42+
def get(k,d,v):
43+
if k in d: return ''.join(d[k])
44+
return v
45+
46+
def process(path,data):
47+
'''Imita o PagSeguro'''
48+
global retornourl
49+
url=retornourl
50+
if path.lower()=='/security/webpagamentos/webpagto.aspx':
51+
titulo='Pagamento processado.'
52+
dump='\n'.join(sorted(['%s="%s"' % (k,'","'.join(v)) for k,v in data.iteritems()]))
53+
transid=md5.new(str(random.random())).hexdigest()
54+
prods=[i for i in data if i.startswith('item_id')]
55+
datamap={
56+
'TransacaoID': transid,
57+
'TipoFrete': 'FR',
58+
'ValorFrete': '0,00',
59+
'Anotacao': 'Pagamento gerado pelo ambiente de testes',
60+
'DataTransacao': datetime.now().strftime('%d/%m/%Y %H:%M:%S'),
61+
'ValorFrete': '0,00',
62+
'VendedorEmail': 'email_cobranca',
63+
'Referencia': ''.join(data['ref_transacao']), #'ref_transacao',
64+
'CliNome': 'nome',
65+
'CliEmail': 'email',
66+
'CliEndereco': 'Rua dos Bobos',
67+
'CliNumero': '0',
68+
'CliComplemento': '',
69+
'CliBairro': 'Paytown',
70+
'CliCidade': 'Payland',
71+
'CliEstado': 'AC',
72+
'CliCEP': '01234567',
73+
'CliTelefone': '99 55555555',
74+
'NumItens': len(prods),
75+
}
76+
proddatamap={
77+
'ProdId':'item_id',
78+
'ProdDescricao':'item_descr',
79+
'ProdQuantidade':'item_quant',
80+
'ProdFrete':'0,00',
81+
'ProdExtras':'0,00',
82+
'ProdValor':'item_valor',
83+
}
84+
formdump=''.join([input(k,get(k,data,v)) for k,v in datamap.iteritems()])
85+
for i in filter(lambda a:'valor' in a,data):
86+
data[i][0]=("%.2f" % (int(data[i][0])/100.0)).replace(".",",")
87+
for prod in prods:
88+
prod_id=prod.replace('item_id','')
89+
for k,v in proddatamap.iteritems():
90+
if v+prod_id in data:v=data[v+prod_id][0]
91+
formdump+=input(k+prod_id,v)
92+
93+
formdump+=select('TipoPagamento',(
94+
'Pagamento',
95+
'Cartão de Crédito',
96+
'Boleto',
97+
'Pagamento Online',
98+
))
99+
formdump+=select('StatusTransacao',(
100+
'Completo',
101+
'Aguardando Pagto',
102+
'Aprovado',
103+
'Em Análise',
104+
'Cancelado',
105+
))
106+
return template % locals()
107+
if path.lower().rstrip('/')=='/security/npi/default.aspx':
108+
return "VERIFICADO"
109+
return 'Unknown data'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# -*- encoding: utf-8 -*-
2+
import unittest
3+
import pagseguro
4+
5+
pagtoURL='/Security/webpagamentos/webpagto.aspx'
6+
retornoURL='/Security/NPI/Default.aspx'
7+
8+
def dados():
9+
return {
10+
"email_cobranca":["[email protected]"],
11+
"tipo":["CP"],
12+
"moeda":["BR"],
13+
"cliente_nome":["Joaquim José da Silva Xavier"],
14+
"cliente_cep":["01234567"],
15+
"cliente_end":["Rua dos Bobos, 0"],
16+
"cliente_bairro":["Paytown"],
17+
"cliente_cidade":["Payland"],
18+
"cliente_uf":["AC"],
19+
"cliente_pais":["BRA"],
20+
"cliente_tel":["55555555"],
21+
"cliente_email":["[email protected]"],
22+
"item_id_1":["1"],
23+
"item_descr_1":["Enxugador de gelo"],
24+
"item_quant_1":["1"],
25+
"item_valor_1":["20"],
26+
"item_frete_1":["0"],
27+
"ref_transacao":["b612"],
28+
}
29+
30+
31+
class MockupTest(unittest.TestCase):
32+
'''Testa o objeto Mockup'''
33+
34+
def testExistance(self):
35+
'''A função process existe e retorna uma string'''
36+
self.assertEquals(str,type(pagseguro.process('',{})))
37+
38+
def testValidPaymentTitle(self):
39+
'''O retorno de uma requisição válida de pagamento deve incluir um título.'''
40+
retorno=pagseguro.process(pagtoURL,dados())
41+
self.assertTrue('Pagamento processado.</h1>' in retorno)
42+
43+
def testValidPaymentDump(self):
44+
'''O retorno de uma requisição válida de pagamento deve incluir um dump dos dados.'''
45+
retorno=pagseguro.process(pagtoURL,dados())
46+
self.assertTrue('ref_transacao="b612"' in retorno)
47+
48+
def testValidPaymentForm(self):
49+
'''O retorno de uma requisição válida de pagamento deve incluir um formulário para teste do retorno automático.'''
50+
retorno=pagseguro.process(pagtoURL,dados())
51+
self.assertTrue('<form' in retorno)
52+
self.assertTrue('name="Referencia" value="b612"' in retorno)
53+
54+
def testNPIWithoutSlash(self):
55+
'''Testa se a confirmação do retorno automático (usando url sem /) vem como "VERIFICADO"'''
56+
retorno=pagseguro.process(retornoURL,dados())
57+
self.assertEquals('VERIFICADO',retorno)
58+
59+
def testNPIWithSlash(self):
60+
'''Testa se a confirmação do retorno automático (usando url com /)vem como "VERIFICADO"'''
61+
retorno=pagseguro.process(retornoURL + '/',dados())
62+
self.assertEquals('VERIFICADO',retorno)
63+
64+
if __name__=="__main__":
65+
unittest.main()
66+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
retornourl="http://localhost/pagseguro/retorno.php"

PagSeguroTestsServer/server.pem

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIICXQIBAAKBgQC3w5BY7FzySxk0xMDyE02t0SvcucqT+raaTzGxmpJnXLwaaaoQ
3+
IH3nAFr1L/D0UZpBElftkui4KvCd85LJrJVDnEVrT8QiiS4hez6brg0EHgJ5c2gz
4+
IUcfx1wu2gM6avKrKD8q0WqSp7CNO/xbr9nwIKTZ13smWRVBbFlfv0iqqQIDAQAB
5+
AoGAdUggQVChRZY+gRot1pIRWqUMLHR7YRR7JGL04Vg4pjVebDER8/b4w8zLQH8X
6+
dqb6Hxu4+IxxcNEe/oAtJ/+4xvfSuMzulQptsrEZk8rhsgZcNBym/JdXMfHb8CPS
7+
1BGLQPyWeKzZK4KcW406PX3W/sx3w0Sx/shTnYOEqp/8ywECQQDhDdkTKhEPfaNr
8+
MjuYz1OSYvPaPEp7bDI1qAccJhm8GRHmua2a6yY/on/QbcWgvFoO+IkUW/ZwC7Um
9+
8yYOSASJAkEA0QhBoFzgTbjCqwQ2GAj3+hCyxKNqSHh/SNJ4RqZeYYdE7etf5mzE
10+
IdeHzRG5gIfW40uHP+88k+GNQXNVoJQtIQJAQza0jzGwGLVIOjqta+z3o6+j7pi1
11+
Efl1YWsGfJSweOnv2722qJ70NGseyywNqvy11OTLY+Y3Sq1kc/aIdhlyKQJBAJxz
12+
HINE4FDrly/egAovNEKCmvpYAOVq4oGDnafrPzqpvqp//4/8GjPmF+sheAC+KtSG
13+
JB1zFpjsOQgipZUBMmECQQDYhV8/KrJhVqxhdWQwZnrCrhuXVm1skN0UWeHxWfmr
14+
YSVqHN+DH13O8L0+stG/XXWoZb1G2TWqjDWXwAaio0ip
15+
-----END RSA PRIVATE KEY-----
16+
-----BEGIN CERTIFICATE-----
17+
MIIDezCCAuSgAwIBAgIJAMGi35LXBshtMA0GCSqGSIb3DQEBBQUAMIGGMQswCQYD
18+
VQQGEwJCUjESMBAGA1UECBMJU2FvIFBhdWxvMRIwEAYDVQQHEwlTYW8gUGF1bG8x
19+
DjAMBgNVBAoTBVZpc2llMQwwCgYDVQQLEwNEZXYxDjAMBgNVBAMTBUVsY2lvMSEw
20+
HwYJKoZIhvcNAQkBFhJlbGNpb0BlbGNpby5jb20uYnIwHhcNMDgxMDI3MjIzNjEz
21+
WhcNMDkxMDI3MjIzNjEzWjCBhjELMAkGA1UEBhMCQlIxEjAQBgNVBAgTCVNhbyBQ
22+
YXVsbzESMBAGA1UEBxMJU2FvIFBhdWxvMQ4wDAYDVQQKEwVWaXNpZTEMMAoGA1UE
23+
CxMDRGV2MQ4wDAYDVQQDEwVFbGNpbzEhMB8GCSqGSIb3DQEJARYSZWxjaW9AZWxj
24+
aW8uY29tLmJyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3w5BY7FzySxk0
25+
xMDyE02t0SvcucqT+raaTzGxmpJnXLwaaaoQIH3nAFr1L/D0UZpBElftkui4KvCd
26+
85LJrJVDnEVrT8QiiS4hez6brg0EHgJ5c2gzIUcfx1wu2gM6avKrKD8q0WqSp7CN
27+
O/xbr9nwIKTZ13smWRVBbFlfv0iqqQIDAQABo4HuMIHrMB0GA1UdDgQWBBRZ2kaZ
28+
y18gvRqmnI1G8ZxaKE8XmzCBuwYDVR0jBIGzMIGwgBRZ2kaZy18gvRqmnI1G8Zxa
29+
KE8Xm6GBjKSBiTCBhjELMAkGA1UEBhMCQlIxEjAQBgNVBAgTCVNhbyBQYXVsbzES
30+
MBAGA1UEBxMJU2FvIFBhdWxvMQ4wDAYDVQQKEwVWaXNpZTEMMAoGA1UECxMDRGV2
31+
MQ4wDAYDVQQDEwVFbGNpbzEhMB8GCSqGSIb3DQEJARYSZWxjaW9AZWxjaW8uY29t
32+
LmJyggkAwaLfktcGyG0wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQBT
33+
nt1b/d4vGVYFqHtj+B7AYlnU262z9+BgTf8y+s5MofzDWXt2iBfDBl6A1boA5sh9
34+
HdURLMFcMXzQd/FtrHC9avlY+aqZyD+BVa/2+CQpIKTpXmenMjLWYh+G98dMod/6
35+
faCBW4WH4Pnw2e2rx/VuoyqBd8DiLagPWxmnarzH7Q==
36+
-----END CERTIFICATE-----

ambiente de testes pagseguro.odt

56.6 KB
Binary file not shown.

0 commit comments

Comments
 (0)