Pular para conteúdo

Middleware

CredentialsMiddleware

Source code in payment_emulation\payment\middleware.py
 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
from django.http import HttpRequest
from pycpfcnpj.compatible import clear_punctuation as cp


class CredentialsMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response


    def __call__(self, request: HttpRequest):
        if request.method == 'POST':
            keys = ['validity', 'cvv', 'holder']

            values = {
                key: request.POST.get(key, "")
                for key in keys
            }

            card_number = request.POST.get('card_number')
            if card_number:
                values.update(card_number=card_number.replace(' ', ''))
            else:
                values.update(card_number="")

            if request.POST.get('cpfcnpj') == 'CPF':
                values.update(cpf=cp(request.POST.get('cpf', "")))
            elif request.POST.get('cpfcnpj') == 'CNPJ':
                values.update(cnpj=cp(request.POST.get('cnpj', "")))

            if not request.POST.get('cpfcnpj'):
                if request.POST.get('cpf'):
                    values['cpf'] = cp(request.POST.get('cpf', ""))

                elif request.POST.get('cnpj'):
                    values['cnpj'] = cp(request.POST.get('cnpj', ""))

            caunt = 0
            for _, value in values.items():
                if value != "":
                    caunt += 1
            if caunt > 0:
                request.credentials = values
            else:
                request.credentials = {}
        else:
            request.credentials = {}

        response = self.get_response(request)
        return response

O CredentialsMiddleware intercepta requisições HTTP para extrair, a partir de formulários, os dados de credenciais de pagamento. Ele foi desenvolvido especificamente para funcionar com o modal de pagamento. Sua principal função é criar, na instância de request, um atributo chamado credentials contendo um dicionário com os dados extraídos. Dessa forma, as credenciais ficam prontamente disponíveis para serem utilizadas, por exemplo, no método payment() do PaymentSDK.

Como adicionar o middleware

Para que o middleware funcione corretamente, adicione-o ao final da lista de middlewares do seu projeto. Exemplo:

MIDDLEWARE = [
    ...
    'payment_emulation.payment.middleware.CredentialsMiddleware',
]

Exemplo de uso

No exemplo abaixo, o atributo credentials é utilizado em uma view para executar o pagamento:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
from django.shortcuts import render
from payment_emulation.payment.paymentSDK import PaymentSDK


def index(request):
    if request.method == 'POST':
        items = [
            {'quantity': 2, 'unit_price': 67.73, 'title': 'T-shirt'},
            {'quantity': 4, 'unit_price': 45.78, 'title': 'Shoes'},
        ]

        sdk = PaymentSDK(items)
        response = sdk.payment(**request.credentials)

        print(response)
        return render(request, 'index.html')
    else:
        return render(request, 'index.html')
output:
{
    "transaction": "success", 
    "items": [
        {"quantity": 2, "unit_price": 67.73, "title": "T-shirt"}, 
        {"quantity": 4, "unit_price": 45.78, "title": "Shoes"}
    ], 
    "redirect_urls": null, 
    "address": null, 
    "payer": null, 
    "amount": 318.58, 
    "created_at": "2025-02-16T00:29:10.852211+00:00"
}

Formulário genérico compatível com o middleware

Caso deseje implementar seu próprio formulário de pagamento e aproveitar a interceptação de dados realizada pelo middleware, certifique-se de utilizar os seguintes nomes para os campos de entrada:

  • card_number: Número do cartão (os espaços serão removidos automaticamente).
  • holder: Nome do titular do cartão.
  • validity: Data de validade do cartão no formato MM/AA.
  • cvv: Código de segurança (valor de verificação do cartão).
  • cpf: CPF do titular (as pontuações ., - serão removidos automaticamente).
  • cnpj: CNPJ do titular (as pontuações ., -, / serão removidos automaticamente).
  • cpfcnpj: Campo (normalmente um select) para alternar entre CPF e CNPJ.

Utilize esses nomes de campos para que o middleware possa interceptar e processar corretamente as informações enviadas.