Skip to main content

App Django para Automatizar Integração com Gateway de Pagamento Pagarme

Project description

django_pagarme

App Django para Automatizar Integração com Gateway de Pagamento Pagarme

codecov

Instalação

Instale via pip

pip install django_pagarme

Configure o Django

Configure seu settings.py

INSTALLED_APPS = [
    'django_pagarme',
    'phonenumber_field',
    ...
]

# Dados para integração com Pagarme
CHAVE_PAGARME_API_PRIVADA = 'CHAVE_PAGARME_API_PRIVADA'
CHAVE_PAGARME_CRIPTOGRAFIA_PUBLICA = 'CHAVE_PAGARME_CRIPTOGRAFIA_PUBLICA'

# Para validar telefones no Brasil
PHONENUMBER_DEFAULT_REGION = 'BR'

Rode as migrações

python manage.py migrate

Configure as urls:

from django.urls import include, path
...

urlpatterns = [
    path('checkout/', include('django_pagarme.urls')),
    ...
]

Personalize seus formulários

Crie uma app e no diretório de templates, crie suas páginas como descrito abaixo.

Dados de Contato

Formulário para obter dados de contato do usuário

Template django_pagarme/contact_form.html

Ex:

<body>
<form action="{% url 'django_pagarme:contact_info' slug=slug %}" method="post">
    {% csrf_token %}
    {{ contact_form.as_p }}
    <button type="submit">Comprar</button>
</form>
</body>

Formulário de erros

Formulário de erros de dados de contato do usuário.

Template django_pagarme/contact_form_errors.html

Pode herdar de contact_form.html no caso de vc decidir que quer usar a mesma página com formulário

Ex:

{% extends 'django_pagarme/contact_form.html' %}

Página de Checkout do Pagarme

Página onde o usuário preenche os dados de pagamento.

Template django_pagarme/pagarme.html

Se você quiser customizar a página de boleto para um produto específico, crie um template com sufixo do slug do produto. Supondo slug upsell-item, o nome do template ficaria django_pagarme/pagarme_upsell_item.html

Deve ter um elemento clicável com classe css pay-button. Ao clicar nesse elemento, o checkout é iniciado.

Ex:

{% load django_pagarme %}
<html>
<head>
    <!-- SCRIPT PAGAR.ME -->
    <title>{{ payment_item.name }}</title>
    <script src="//assets.pagar.me/checkout/1.1.0/checkout.js"></script>
</head>
<body>
<h1>{{ payment_item.name }}</h1>
<h2>Planos</h2>
<ul>
    {% for installments, amount, installment_amount in payment_item.payment_plans %}
        {% if installments == 1 %}
            <li>{{ amount|cents_to_brl }} a vista</li>
        {% else %}
            <li>{{ amount|cents_to_brl }} em {{ installments }} parcelas de {{ installment_amount|cents_to_brl }}</li>
        {% endif %}
    {% endfor %}
</ul>
<button class="pay-button">Abrir modal de pagamento</button>
{% show_pagarme payment_item customer address open_modal review_informations %}

</body>
</html>

Página de visualização de Boleto

Página onde o usuário acessa os dados do boleto para pagamento

Template django_pagarme/show_boleto_data.html

Se você quiser customizar a página de boleto para um produto específico, crie um template com sufixo do slug do produto. Supondo slug upsell-item, o nome do template ficaria django_pagarme/show_boleto_data_upsell_item.html

Ex:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Dados do Boleto</title>
</head>
<body>
<h1>Dados do Boleto</h1>
<p>Código de Barras: {{ payment.boleto_barcode }}</p>
<iframe src="{{ payment.boleto_url }}"></iframe>
{% if upsell %}
    <form action="{% url 'django_pagarme:one_click' slug=upsell.slug %}" method="post">
        {% csrf_token %}
        <button type="submit"> Comprar {{ upsell.name }}</button>
    </form>
{% endif %}

</body>
</html>

Você também pode criar uma página de boleto específica para cada produto. Suponha um produto com slug 'curso-avancado'. A view de captura irá tentar então renderizar o template django_pagarme/show_boleto_data_curso_avancado.html. Dessa maneira vc pode customizar dados de acordo com o produto vendido.

Página de obrigado

Página para onde o usuário é levado ao finalizar o pagamento

Template django_pagarme/thanks.html. Se você quiser customizar a página de obrigado para um produto específico, crie um template com sufixo do slug do produto. Supondo slug upsell-item, o nome do template ficaria django_pagarme/thanks_upsell_item.html

Ex:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Obrigado por Comprar</title>
</head>
<body>
<h1> Obrigado por comprar {{ payment_item_config.name }}</h1>
{% if payment_item_config.upsell %}
    <form action="{% url 'django_pagarme:one_click' slug=payment_item_config.upsell.slug %}" method="post">
    {% csrf_token %}
    <button type="submit"> Comprar {{ payment_item_config.upsell.name }}</button>
    </form>
{% endif %}
</body>
</html>

Você também pode criar uma página de obrigado específica para cada produto. Suponha um produto com slug 'curso-avancado'. A view de obrigado irá tentar então renderizar o template django_pagarme/thank_curso_avancado.html. Dessa maneira vc pode customizar dados de acordo com o produto vendido.

Página de produto indisponível

Você deve criar o template que é exibido quando um Item de Pagamento não está disponível. O template deve se chamar unavailable_payment_item.html. Exemplo:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Produto {{ payment_item_config.name }} indisponível</title>
</head>
<body>
<h1> Desculpa, mas o produto {{ payment_item_config.name }} não está mais disponível.</h1>
</body>
</html>

Listeners

A biblioteca dispõe de uma série de listeners, que podem ser usados para tratar mudanças no status do pagamento, configuração da criação de usuário e controle de disponibilidade dos itens de pagamento.

Listener de Contato de usuário

Chamável utilizado para receber os dados do usuário

Ex:

from django_pagarme import facade


def print_contact_info(name, email, phone, payment_item_slug, user=None):
    print('Contact Data:', name, email, phone, payment_item_slug, user)


facade.add_contact_info_listener(print_contact_info)

Essa função pode ser usada para armazenar os dados em banco ou chamar uma api depois que o usuário preenche os dados de contato.

Fábrica de usuário

Chamável utilizado para criar um usuário para ser conectado ao pedido. Só é chamado se não houver usuário logado. Se não for setado, pedidos ainda serão feitos corretamente, mas sem link com qualquer usuário do sistema.

Ex:

from django_pagarme import facade
from django.contrib.auth import get_user_model


def user_factory(pagarme_transaction):
    customer = pagarme_transaction['customer']
    User = get_user_model()

    User.objects.get_or_create(
        email=customer['email'],
        defaults={'first_name': customer['name']}
    )


facade.set_user_factory(user_factory)

Listener de mudanças de status

Toda vez que o sistema recebe uma notificação de mudança de status, esse chamável é executado e recebe como parâmetro o id do respectivo pagamento.

Pode ser utilizado para ativar um usuário na base ou enviar o produto, de acordo com o status.

Ex:

from django_pagarme import facade


def print_payment_id(payment_id):
    payment = facade.find_payment(payment_id)
    print(payment, payment.status())


facade.add_payment_status_changed(print_payment_id)

Os status existentes estão disponíveis via fachada (facade):

PROCESSING = 'processing'
AUTHORIZED = 'authorized'
PAID = 'paid'
REFUNDED = 'refunded'
PENDING_REFUND = 'pending_refund'
WAITING_PAYMENT = 'waiting_payment'
REFUSED = 'refused'

Controlando disponibilidade dos itens de pagamento

Você pode controlar a disponibilidade dos itens através da propriedade available_until no admin do modelo PagarmeItemConfig. Basta setar uma data a partir do qual o produto ficará indisponível.

Se precisar de mais flexibilidade, você pode definir uma estratégia específica. Para isso, crie um chamável que recebe a configuração e a requisição web como parâmetros e retorne verdadeiro caso o produto esteja disponível, falso caso contrário.

Ex:

def is_payment_config_item_available(payment_item_config: PagarmeItemConfig, request: HttpRequest) -> bool:
    return payment_item_config.is_available()


facade.set_available_payment_config_item_strategy(is_payment_config_item_available)

IMPORTANTE: O comportamento da sua stratégia sobrescreve a lógica do atributo available_until. Portanto, você deve utilizar o método payment_item_config.is_available() em sua estratégia caso queira que o atributo continua efetivo.

Configuração de Pagamento

As configurações ficam disponíveis via admin do django. Você pode criar várias. Cada uma deve conter as configurações básicas de pagamento:

  • Um nome para identificar a opção
  • Número máximo de parcelas
  • Escolha padrão do número parcelas que vai aparecer no formulário
  • Número máximo de parcelas sem juros
  • Taxa de juros
  • Método de pagamento: Cartão, Boleto ou ambos.

Segue o exemplo:

Admin de Opções de Pagamento

Configuração de Item de Pagamento

Aqui vc configura os produtos que vai vender. Propriedades:

  • Nome do pagarme
  • Preço em Centavos
  • Se o pagarme é físico ou não
  • Opção padrão de pagamento
  • Upsell

Esse úlitmo é um relacionamento para outros produtos, afim de se tentar fazer processo de upsell logo após o pagamento de um produto.

Segue exemplo de um curso chamado Pytools custando R$ 97.00

Admin de Produto

Uma Configuração geral serve como configuração padrão de um item

Outras classes de interesse

No admin ainda existem 4 classes de interesse:

  1. PagarmePayment : reprensenta um pagamento (transction) do pagarme
  2. PagarmeNotification: representa uma notificacão do pagarme. Um pagamento pode possuir múltiplas notificações
  3. UserPaymentProfile: representa dados gerais preenchidos no último checkout feito no pagarme. É usado para preencher os dados em um próximo pagamento e está relacioando com o usuário Django.

Um exemplo completo de aplicação se encontra no diretório exemplo

Contribuidores

@walison17, @renzon

Como Contribuir

Seguimos a convenção de código da PEP8, com excessão do tamanho máximo de linha que pode ter 120 caracteres.

Faça um fork do projeto e mande um pull request. PR sem testes serão rejeitados.

Para rodar o projeto de exemplo:

Instale o docker Rode o Banco de Dados: docker-compose -f docker-compose.yml up -d Crie um arquivo .env dentro da pasta exemplo:

CHAVE_PAGARME_CRIPTOGRAFIA_PUBLICA=coloque_sua_chave_publica_aqui
CHAVE_PAGARME_API_PRIVADA=coloque_sua_chave_privada_aqui
PHONENUMBER_DEFAULT_REGION=BR
DATABASE_URL=postgres://postgres:postgres@localhost:5432/django_pagarme

Obs: Troque as chaves do pagarme pelas suas chaves do ambiente de teste para testar localmente.

Se for rodar em computador local, use um serviço como o ngrok para mapear suas portas locais na internet

Instale o pipenv:

python -m pip install pipenv

Navegue até a pasta exemplo e rode:

pipenv sync -d

Rode o servidor local:

pipenv run python manage.py runserver

Para rodar os testes:

exemplo $ pipenv run pytest .
Loading .env environment variables…
======================================================= test session starts ========================================================
platform darwin -- Python 3.8.0, pytest-5.3.5, py-1.8.1, pluggy-0.13.1
django: settings: base.settings (from ini)
rootdir: /Users/renzo/PycharmProjects/django_pagarme, inifile: setup.cfg
plugins: mock-2.0.0, cov-2.8.1, django-3.8.0
collected 85 items                                                                                                                 

base/tests/test_home.py .                                                                                                    [  1%]
pagamentos/tests/test_captura_boleto.py ............                                                                         [ 15%]
pagamentos/tests/test_captura_credit_card.py ..............                                                                  [ 31%]
pagamentos/tests/test_dados_usuario.py ........                                                                              [ 41%]
pagamentos/tests/test_pagarme_notification_transitions.py ................                                                   [ 60%]
pagamentos/tests/test_pagarme_notifications.py ....                                                                          [ 64%]
pagamentos/tests/test_pagina_pagamento.py ..................                                                                 [ 85%]
pagamentos/tests/test_thanks.py ..                                                                                           [ 88%]
base/tests/test_contact_info.py ........                                                                                     [ 97%]
base/tests/test_facade.py ..                                                                                                 [100%]

======================================================== 85 passed in 9.26s ======================================================== 

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_pagarme-0.26.tar.gz (38.9 kB view details)

Uploaded Source

Built Distribution

django_pagarme-0.26-py3-none-any.whl (36.5 kB view details)

Uploaded Python 3

File details

Details for the file django_pagarme-0.26.tar.gz.

File metadata

  • Download URL: django_pagarme-0.26.tar.gz
  • Upload date:
  • Size: 38.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.0 CPython/3.9.0

File hashes

Hashes for django_pagarme-0.26.tar.gz
Algorithm Hash digest
SHA256 acd2bd741deaa9596cf806a43a51b42a85dd22cb2c8a2abb595e572c36e8c2ad
MD5 c5b419b5a56de44c14000cf2242adc3b
BLAKE2b-256 df6b0d3594bcfc164ca9dcf59da09e55fc585bf0908d9c42ad35404714d20f70

See more details on using hashes here.

File details

Details for the file django_pagarme-0.26-py3-none-any.whl.

File metadata

  • Download URL: django_pagarme-0.26-py3-none-any.whl
  • Upload date:
  • Size: 36.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.0 CPython/3.9.0

File hashes

Hashes for django_pagarme-0.26-py3-none-any.whl
Algorithm Hash digest
SHA256 9f1fd5534c63b9493caa80a70db0c90b96bff3cad92a63469a0720fa47ef639d
MD5 229ea366084dd6ff04c7e31ecd3d06b2
BLAKE2b-256 026c7c6b816e7b2e0874f91773c8f280848ba4a586e04cbfbd38b30ffcd05d73

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page