Pagar.me Python library
This lib can be found on pip. To install it, use:
$ pip install pagarme-python
If you have any problem or suggestion please open an issue here.
Check here.
🐍 Pagar.me's Python library
Home Page: https://pagar.me
License: MIT License
Depois de criar uma assinatura com sucesso (recebo o ID dela no retorno da API), a mesma 'some'... do find_all()
ou do find_by()
. Nem no painel de vcs ela é listada.
It's neither on requirements.txt or requirements-dev.txt
Saudações à equipe do Pagarme, gostaria de relatar um problema que estou tendo ao implementar a API ao meu site, o mesmo é feito com Python e Django. O problema é que quando envio os dados para o checkout através do formulário JS utilizando a encryption_key, o servidor barra a transação acusando a falta da api_key, sendo que a mesma ja foi configurada no backend. No settings.py importei o decouple que chama o arquivo .env que contém as duas chaves, e através do settings.chave que as chamo nas requisições.
OBS: já inseri as chaves hardcoded também e não funcionou, é como se o servidor nem pegasse essas chaves, como se a api_key não existisse.
Segue abaixo algumas imagens referentes ao formulário em JS:
E mais abaixo o formulário que recebe as informações de configurações de pagamentos e também abre o modal responsável por enviar o pagamento:
Aqui vai o arquivo .env com as chaves escondidas:
Aqui vai o settings.py do django:
Esse arquivo é o responsável por enviar a chave pública
Erro no navegador:
Resposta de erro do servidor:
De já agradeço a atenção da equipe! Lembrado que utilizo Python e Django
The pypi version (this) doesn't seem to work with subscription metadata:
sub = Subscription(
api_key='API_KEY",
plan_id=87509,
card_id='card_cixm63x0l00krin6d6tmhrnvh',
customer=customer,
metadata={
"object": {
"sdfsdfsd": "algo"
}
}
)
sub.create()
Como isso é um biblioteca, o ideal é não fixar as versões. Caso contrário, o usuário é obrigado a usar uma versão antiga do requests, potencialmente com vulnerabilidades de segurança, o que é crítico para uma lib que transaciona pagamentos.
Veja o exemplo:
pythonpro-website $ pipenv update -d
Running $ pipenv lock then $ pipenv sync.
Locking [dev-packages] dependencies…
Building requirements...
✔ Success!
Locking [packages] dependencies…
✘ Locking Failed!
[ResolutionFailure]: File "/home/renzo/.pyenv/versions/3.8.2/lib/python3.8/site-packages/pipenv/resolver.py", line 785, in _main
[ResolutionFailure]: resolve_packages(pre, clear, verbose, system, write, requirements_dir, packages)
[ResolutionFailure]: File "/home/renzo/.pyenv/versions/3.8.2/lib/python3.8/site-packages/pipenv/resolver.py", line 746, in resolve_packages
[ResolutionFailure]: results, resolver = resolve(
[ResolutionFailure]: File "/home/renzo/.pyenv/versions/3.8.2/lib/python3.8/site-packages/pipenv/resolver.py", line 728, in resolve
[ResolutionFailure]: return resolve_deps(
[ResolutionFailure]: File "/home/renzo/.pyenv/versions/3.8.2/lib/python3.8/site-packages/pipenv/utils.py", line 1378, in resolve_deps
[ResolutionFailure]: results, hashes, markers_lookup, resolver, skipped = actually_resolve_deps(
[ResolutionFailure]: File "/home/renzo/.pyenv/versions/3.8.2/lib/python3.8/site-packages/pipenv/utils.py", line 1093, in actually_resolve_deps
[ResolutionFailure]: resolver.resolve()
[ResolutionFailure]: File "/home/renzo/.pyenv/versions/3.8.2/lib/python3.8/site-packages/pipenv/utils.py", line 818, in resolve
[ResolutionFailure]: raise ResolutionFailure(message=str(e))
[pipenv.exceptions.ResolutionFailure]: Warning: Your dependencies could not be resolved. You likely have a mismatch in your sub-dependencies.
First try clearing your dependency cache with $ pipenv lock --clear, then try the original command again.
Alternatively, you can use $ pipenv install --skip-lock to bypass this mechanism, then run $ pipenv graph to inspect the situation.
Hint: try $ pipenv lock --pre if it is a pre-release dependency.
ERROR: Could not find a version that matches urllib3<1.25,<1.26,>=1.10.0,>=1.20,>=1.21.1,>=1.25.10 (from requests==2.21.0->-r /tmp/pipenvemk0vw5xrequirements/pipenv-4bx91kc9-constraints.txt (line 31))
Tried: 0.3, 1.0, 1.0.1, 1.0.2, 1.1, 1.2, 1.2.1, 1.2.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.7.1, 1.8, 1.8.2, 1.8.3, 1.9, 1.9.1, 1.10, 1.10.1, 1.10.2, 1.10.3, 1.10.4, 1.11, 1.11, 1.12, 1.12, 1.13, 1.13, 1.13.1, 1.13.1, 1.14, 1.14, 1.15, 1.15, 1.15.1, 1.15.1, 1.16, 1.16, 1.17, 1.17, 1.18, 1.18, 1.18.1, 1.18.1, 1.19, 1.19, 1.19.1, 1.19.1, 1.20, 1.20, 1.21, 1.21, 1.21.1, 1.21.1, 1.22, 1.22, 1.23, 1.23, 1.24, 1.24, 1.24.1, 1.24.1, 1.24.2, 1.24.2, 1.24.3, 1.24.3, 1.25, 1.25, 1.25.1, 1.25.1, 1.25.2, 1.25.2, 1.25.3, 1.25.3, 1.25.4, 1.25.4, 1.25.5, 1.25.5, 1.25.6, 1.25.6, 1.25.7, 1.25.7, 1.25.8, 1.25.8, 1.25.9, 1.25.9, 1.25.10, 1.25.10
There are incompatible versions in the resolved dependencies:
urllib3<1.25,>=1.21.1 (from requests==2.21.0->-r /tmp/pipenvemk0vw5xrequirements/pipenv-4bx91kc9-constraints.txt (line 31))
urllib3<1.26,>=1.20 (from botocore==1.17.50->boto3==1.14.50->-r /tmp/pipenvemk0vw5xrequirements/pipenv-4bx91kc9-constraints.txt (line 12))
urllib3>=1.10.0 (from sentry-sdk==0.17.0->-r /tmp/pipenvemk0vw5xrequirements/pipenv-4bx91kc9-constraints.txt (line 28))
urllib3>=1.25.10 (from responses==0.11.0->-r /tmp/pipenvemk0vw5xrequirements/pipenv-4bx91kc9-constraints.txt (line 25))
O problema é que o requirements.txt é um arquivo destinado ao desenvolvimento, cujo objetivo é ter build determinístico, por isso ele deve fixar as versões. Mas o setup.py não. Portanto, não se deve ler as versões fixas do requirements no setup.py.
Hi guys,
Correct me if I'm wrong, but in the way the API is coded now there is no way to know what was the HTTP response code. Let`s say I do the following request:
pagarme.authentication_key('...')
subscription = pagarme.subscription.create({...})
If everything goes well and the subscription is registered, this approach has no problems. However, if something goes wrong on pagarme.subscription.create
, than the following happens:
pagarme.subscription.create
calls handler_request.post
handler_request.post
calls pagarme.resources.handler_request.validate_response
pagarme.resources.handler_request.validate_response
calls pagarme.resources.handler_request.error
pagarme.resources.handler_request.error
simply returnsIn this process, we completely miss the status_code. This means that, once subscription = pagarme.subscription.create
has gone wrong, there is no if subscription.status_code == 400
or some try: ... except: PagarmeException e: ...
that we can use.
The only current way I see to know if the response is an error would be some odd array format testing, like: if 'message' in subscription and 'parameter_name' in subscription and 'type' in subscription: # we have an error
.
Please let me know if there is another way that I did not see or if you intend to fix this.
I used pagarme.subscription.create
in the example, but as far as I know this problem affects any other methods having HTTP calls as they go by pagarme.resources.handler_request.validate_response
.
When calling pip install pagarme-python
, it gives the following output:
Traceback (most recent call last):
File "<string>", line 20, in <module>
File "/tmp/pip-build-o69jyrm9/pagarme-python/setup.py", line 5, in <module>
requires = [i.strip() for i in open("requirements.txt").readlines()]
FileNotFoundError: [Errno 2] No such file or directory: 'requirements.txt'
And looking into the package pagarme-python-2.0.0.tar.gz , there's no file named requirements.txt
.
Na resposta do método transaction.create() as propriedades boleto_url e boleto_barcode não estão sendo retornadas. Esse é o comportamento esperado?
Esse commit é bem crítico, podendo inclusive gerar cobranças duplicadas porque o pagarme travou na resposta mas a operação aconteceu internamente.
Isso acontece, a gente ocasionalmente tem cobranças duplicadas por retentar algum caso, mas temos controle sobre isso. Transformar isso em built-in da lib é uma breaking change bem significativa.
Olá pessoal,
Estou querendo usar a biblioteca de vocês mas, pelo code climate aparentemente o build está falhando.
A razão é esse commit aqui:
Ele altera a versão para referenciar o pacote sdk dentro do setup. O problema disso é que sdk está dentro de pagarme/init.py. Logo, quando o setup rodar na fase de build vai importar todos pacotes internos. E aí o problema ocorre quando um pacote importar requests, uma vez que na hora que o sistema roda o arquivo setup do pacote, requests ainda não está instalado. Segue log do Heroku onde uso o Pagarme para o site www.python.pro.br:
-----> Installing dependencies with Pipenv 2018.5.18…
Installing -e git+https://github.com/pagarme/pagarme-python.git@master#egg=pagarme-python…
Obtaining pagarme-python from git+https://github.com/pagarme/pagarme-python.git@master#egg=pagarme-python
Cloning https://github.com/pagarme/pagarme-python.git (to master) to ./src/pagarme-python
Complete output from command python setup.py egg_info:
Traceback (most recent call last):
File "", line 1, in
File "/tmp/build_cfb8612950954d19070f198e19ca55d6/src/pagarme-python/setup.py", line 3, in
from pagarme import sdk
File "/tmp/build_cfb8612950954d19070f198e19ca55d6/src/pagarme-python/pagarme/init.py", line 1, in
from pagarme.resources.handler_request import authentication_key
File "/tmp/build_cfb8612950954d19070f198e19ca55d6/src/pagarme-python/pagarme/resources/handler_request.py", line 1, in
import requests
ModuleNotFoundError: No module named 'requests'
----------------------------------------
Error: An error occurred while installing -e git+https://github.com/pagarme/pagarme-python.git@master#egg=pagarme-python!
Command "python setup.py egg_info" failed with error code 1 in /tmp/build_cfb8612950954d19070f198e19ca55d6/src/pagarme-python/
You are using pip version 9.0.2, however version 19.2.3 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
This is likely caused by a bug in -e git+https://github.com/pagarme/pagarme-python.git@master#egg=pagarme-python. Report this to its maintainers.
! Push rejected, failed to compile Python app.
! Push failed
O arquivo requirements possui a seguinte dependência:
requests==2.18.2
Sugiro alterar para o que consta abaixo para não ter que obter uma versão antiga de requests sendo que é uma lib muito usada e a versão atual é maior que essa acima.
requests>=2.18.2
Ao instalar consta o seguinte erro:
ERROR: pagarme-python 3.3.0 has requirement requests==2.18.2, but you'll have requests X.XX.X (versão que possuo) which is incompatible.
Nao estou conseguindo autenticar
Oi, tudo bem?
Comecei a testar a pagarme e a biblioteca que vocês fizeram... quando fiz rodei o
pip install pagarme-python
acabou baixando essa biblioteca aqui:
https://github.com/pagarme/pagarme-core-api-python
Eles também trabalham com a pagarme?
Python 3.5 has just been born, we can test this version and check the compatibility.
Saudações,
Conforme reportado pelo usuário rezon a lib, até a versão atual disponibilizada, apresenta problemas devido a fixação das depedências no setup.py, conforme pode ser confirmado a seguir:
ERROR: pagarme-python 4.0.1 has requirement requests[security]<=2.23.0,>=2.18.2, but you'll have requests 2.25.1 which is incompatible.
Pergunto se existe alguma previsão de resolução desse problema, tendo em vista que ele já foi levantada a um bom tempo e inclusive já foi solucionado pelo mesmo usuário renzon na pull request #118. Estamos usando a lib em um projeto comercial importante e é necessário saber se a biblioteca ainda esta sendo mantida e atualizada, caso contrário peço um feedback e seguiremos na busca de outras alternativa de API.
Hey, I've implemented the card_hash method in my python project, but I'm not sure where to implement it in the library, could someone please enlighten me?
Devo estar comendo bola, mas estou tentando encontrar a versão de API da pagarme correspondente a cada release da lib e não achei.
Obrigado!
Do I need the JS library to create a cardhash?
I wanted to create an entirely backend app.
If there's no way to do that using this library, is there some other way?
I went over the js script and noticed is merely a post to a pagarme endpoint with some encrypted parameters.
I just wanted to know if there was other ways to accomplish this.
Estou integrando a pagar.me em meu produto e ao usar o método: pagarme.transaction.create(params), ele não me retorna os dados de boleto, somente sua data de expiração.
Os métodos find_by
para transações e recebíveis deveriam suportar ranges de data. A documentação mostra o uso via cURL enviando duas keys com os valores mas no entanto, como no Python o find_by
recebe dicionários, não é possível ter duas keys.
Talvez fosse interessante suportar o formato {'created_at': ('>=1546318800', '<=1546491600')}
para ranges de data.
pequeno erro nos testes. Falta o módulo Mock no requirements e existe um ponto a mais no parâmetro de importação do pagarme_test.py na linha 13.
Caso alguém mais iniciante tente utilizar o modelo irá ter dificuldades para começar a implementar.
I had to open an issue to find the name on the package on pypi.
It would be good if that was provided in the README.
Durante a execução do pagarme.transaction.create(data) é retornado no terminal algo como:
Traceback (most recent call last):
File "pg.py", line 81, in
trx = pagarme.transaction.create(data)
File "/home/haw/.local/lib/python3.7/site-packages/pagarme/transaction.py", line 14, in create
return handler_request.post(transaction_routes.BASE_URL, dictionary)
File "/home/haw/.local/lib/python3.7/site-packages/pagarme/resources/handler_request.py", line 46, in post
pagarme_response = requests_retry_session().post(end_point, json=data)
File "/home/haw/.local/lib/python3.7/site-packages/pagarme/resources/requests_retry.py", line 21, in requests_retry_session
session.headers.update(headers())
File "/home/haw/.local/lib/python3.7/site-packages/pagarme/resources/requests_retry.py", line 9, in headers
'User-Agent': 'pagarme-python/{} python/{}'.format(sdk.VERSION, sys.version.split(' ',1)[0]),
NameError: name 'sys' is not defined
Resolvi localmente em meu ambiente virtual apenas adicionando: import sys em:
~/.virtualenvs/brioche_food/lib/python3.7/site-packages/pagarme/resources/requests_retry.py
Ao integrar minha plataforma com o pagarme percebi que existe uma função de error
no handler.py
que dispara uma Exception genérica do python, o que me traz certos problemas, pois eles se misturam com todas as outras exceções disparadas na linguagem por exemplo.
Não seria melhor que fosse implementado uma exception específica para que possamos identificar especificamente aquilo que é retornado do pagarme?
Gerei um pull request com o ID #114 com sugestão para resolução dessa issue.
O problema dessa abordagem é que nos obriga a usar dependências antigas em nossos projetos, como a requests 2.18 que tem vulnerabilidade.
O objetivo do requirements é ter um build determinístico para quem desenvolve a lib. Já o setup deve manter o máximo de liberdade ao escolher as dependências. Não só pelo fato de obrigar a usar libs antigas, mas também as vezes inviabilizar o uso da lib com outras dependências que precisam de outras versões.
Eu sei que manter isso tudo dá trabalho. Por isso recomendo migraram para o Pipenv, que evita ter que ficar gerenciando isso tudo. Vou ver se consigo mandar um PR para isso.
documentacao muito ruim, usem outro fornecedor
Customer is also a Resource from my point of view.
That said, it should inherit from AbstractResource like the others.
It does have a resource url(e.g. "/customer"), it can be created and all that.
Right?
When testing on python3, every request I try to make greets me with an error:
Traceback (most recent call last):
File "script.py", line 9, in <module>
transaction.charge()
File "/home/hugollm/.virtualenvs/pagarme/lib/python3.4/site-packages/pagarme/transaction.py", line 56, in charge
self.error(pagarme_response.content)
File "/home/hugollm/.virtualenvs/pagarme/lib/python3.4/site-packages/pagarme/transaction.py", line 44, in error
data = json.loads(response)
File "/usr/lib/python3.4/json/__init__.py", line 312, in loads
s.__class__.__name__))
TypeError: the JSON object must be str, not 'bytes'
It seems to be happening on unsucessful requests (not 200 response). I wasn't able to test on a successful one, though. Tested with the following code:
from pagarme import Pagarme
pagarme = Pagarme('ak_test_***')
transaction = pagarme.start_transaction(
amount=10,
card_hash='***==',
payment_method='credit_card'
)
transaction.charge()
Used ***
to omit sensitive information.
Recebi um e-mail sobre a "Migração para o protocolo TLS 1.2" e gostaria de saber se a biblioteca terá suporte para esse protocolo?
Grato.
Would be nice have some guidelines for new contributors to follow.
Corrigir os testes para que eles passem a funcionar corretamente.
Atualmente sleeps são utilizados, mas em pesquisas notei que a lib requests já trabalha sincronamente, não sendo necessário o uso dessa função.
It's not in the docs but using api_key
and encryption_key
fields in the body is deprecated.
The correct way is to send the API Key with HTTP basic authentication as the username. Also, the password must be x
.
Atualmente desenvolvedores python estão utilizando o PIpenv como gerenciador de pacotes. Eu acho que seria uma boa ideia pelo versionamento que ele trás ao projeto, implementar está feature.
Creio que faltou uma classe/metodo para validar os postbacks enviados pela pagar.me
Segue documetacao sobre assunto a que me refiro.
https://docs.pagar.me/v2017-08-28/reference#validando-um-postback
Implementação dos parâmetros count e page nos métdos find_all do SDK.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.