Git Product home page Git Product logo

imobanco / zoop-wrapper Goto Github PK

View Code? Open in Web Editor NEW
1.0 8.0 1.0 6.25 MB

Cliente não oficial Zoop Python, para realizar integração com o gateway de pagamento, voltado para os subvendedores do MarkePlace e extendendo seu suporte

Home Page: https://zoop-wrapper.readthedocs.io/

License: GNU General Public License v3.0

Dockerfile 0.19% Makefile 0.17% Python 99.64%
zoop pagamento dinheiro brasil api-client python3

zoop-wrapper's Introduction


Zoop Logo


PyPI Version PyPI - Python Version
Test status Documentation Status
Licença Contributors


Cliente não oficial da Zoop feito em Python, para realizar integração com o gateway de pagamento.

Documentação oficial da Zoop

Instalando

Nosso pacote está hospedado no PyPI

pip install zoop-wrapper

Configuração

Para utilizar o zoop-wrapper é necessário ter duas constantes/variáveis. sendo elas:

ZOOP_KEY='chave de autenticação recebida da zoop'
MARKETPLACE_ID='ID do market place'

Recomendamos criar um arquivo .env contendo essas varíaveis de ambiente.

Podem ser criadas diretamente no terminal utilizando (não recomendado):

export ZOOP_KEY='chave de autenticação recebida da zoop'
export MARKETPLACE_ID='ID do market place'

Podem ser criadas também diretamente no arquivo.py

!DANGER!

Fazer isso além de não ser recomendado é uma FALHA de segurança.

Documentação da Zoop

A Zoop fornece diversas formas de comunicação. Sendo uma telas API's baseadas na tecnologia REST. A documentação da API da zoop não é uma das melhores, mas está disponível abertamente.

Warning

Não temos conhecimento se TODOS os testes podem ser realizados sem ônus ao desenvolvedor.

As transações de cartão podem ser extornadas e não há problema em gerar boletos (não paga a baixa).

Saiba mais na documentação oficial da Zoop

Recursos disponíveis

Market Place

  • ☐ detalhes

Webhooks

  • ☑ Cadastro
  • ☑ listagem
  • ☑ detalhes
  • ☑ remoção

Buyer

  • ☑ Atualização
  • ☑ Cadastro
  • ☑ listagem
  • ☑ detalhes
  • ☑ remoção

Seller

  • ☑ Atualização
  • ☑ Cadastro
  • ☑ listagem
  • ☑ detalhes
  • ☑ remoção

Token

  • ☑ Cadastro de token cartão de crédito
  • ☑ Cadastro de token conta bancária
  • ☐ detalhes

Cartão de crédito

  • ☑ Conexão
  • ☑ detalhes
  • ☐ remoção

Conta bancária

  • ☐ Atualização
  • ☑ Conexão
  • ☑ listagem
  • ☑ detalhes
  • ☐ remoção

Boleto

  • ☑ detalhes

Transação

  • ☑ listagem
  • ☑ detalhes
  • ☑ cancelamento
  • ☑ Cadastro transação boleto
  • ☑ Cadastro transação cartão de crédito

zoop-wrapper's People

Contributors

pedroregispoar avatar rodrigondec avatar

Stargazers

 avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Forkers

adelarduarte

zoop-wrapper's Issues

Documentar BankAccount

Resumo

criar documentação de exemplos para os métodos do BankAccountWrapper.

A criação de conta bancária está relacionada ao #31

Tarefas

  • Criar exemplos
  • Criar documentação

Envio de documento

Resumo

Precisamos enviar alguns documentos para validar os vendedores.

Tarefas

  • estudar os endpoints da zoop
  • criar métodos de envio de documento
  • criar exemplos

Estorno Transação de crédito

Resumo

Precisamos ter o estorno de transação.

Dados mágicos

existe uma mágica transação de id 720ba7a640564c229437f0644cdf37fe que precisamos estornar.

ela está em PROD

Critérios de aceite

  • fazer o estorno dessa transação mágica
  • terminar o cancel_transaction
  • fazer os testes desse método

Revisar o arquivo CONTRIBUTING.md

Resumo

Atualmente o CONTRIBUTING.md está sugerindo que se use make config, não existe essa regra no make. Assim como não existe a regra make config.data.

Além disso, tem-se o problema de mistura entre inglês e português.

Critérios de aceite

  • documentar de forma coerente com os comandos presentes no makefile;
  • traduzir o resto do arquivo;
  • no comando docker run -it usar a forma longa das flags -i = --interactive e -t = --tty e ordena-las alfabeticamente.

Captura

Resumo

Existe a flag capture para controlar a captura automática.

Tarefa

  • adicionar o input capture no required_fields

Eventos de transação

Resumo

A zoop possui eventos de transação! Já temos uma lista com eles!

O Felipe Lavra ficou de me enviar vários payloads de exemplos de transação. Para serem utilizados como referência.

Descrição

Não utilizar os eventos de transação:

"transaction.authorization.failed",      
"transaction.authorization.succeeded",

Eles não funcionam!

Deve ser utilizado os eventos:

"transaction.failed",      
"transaction.succeeded",
transaction.canceled
transaction.capture.failed
transaction.capture.succeeded
transaction.created
transaction.failed
transaction.void.failed
transaction.void.succeeded

Tarefas

  • adicionar documentação sobre eventos de transação da zoop
  • alterar lista de eventos
  • adicionar exemplos de eventos de transação

Parcelamento de cartão dentro do source

Resumo

Relacionado ao issue #101

Pode ser mais interessante installment_plan ir dentro do source do cartão. Para deixar uma interface mais homogênea no imopay!

Tarefas

  • mudar o campo/objeto installment_plan para dentro do source
  • testar
  • alterar os exemplo e rodá-los

Erro no update (verbo PATCH) de business sellers que não possuem endereço na Zoop

Resumo

Após um longo processo de troubleshoot foi possível identificar que o problema de erro na Zoop ocorre, até o presente momento, apenas na atualização de empresas que não tem endereço cadastrado.

Detalhes

Conforme @rodrigondec solicitou, disponibilizando dados relevantes a reprodução do erro com a Zoop.

Payload utilizado para reproduzir o erro de update de empresa na Zoop:

{
    "business_email": "foo",
    "ein": "64070465954529",
    "business_name": "foo",
    "business_phone": "foo",
    "business_opening_date": "foo",
    "business_website": "foo"
}

Note que o id no fim da URL foi obtido rodando primeiro o exemplo add_business_seller.py, obteu-se assim o id utilizado neste exemplo (diretamente do .json de retorno do exemplo).

Mensagem de erro obtida:

{
'status': 'Bad Request', 
'status_code': 400, 
'type': 'invalid_request_error', 
'category': 'missing_required_param', 
'message': 'Missing required param: address - line 1. Please verify request parameters.'
}

Mudar ordem dos badges

  • Deixar todos os badges do pypi na primeira linha
  • Deixar todos os badges do github na segunda linha
  • Deixar badges do codacy na última linha com o snyk

Erro na documentação de conta bancária, arquivo de remoção não incluído

Resumo

O exemplo de remover a conta bancária de um vendedor não está incluindo o arquivo .py, o nome esta errado, por isso não está sendo incluido.

Imagens

image

Tarefas

  • Corrigir o nome do arquivo na linha .. literalinclude:: ../../examples/bank_account/bank_account_delete.py do arquivo docs/examples/bank_account.rst para bank_account_remove.py.

Documentar Card

Resumo

precisamos criar os exemplos.py do CardWrapper.

Critério de aceite

Criar os exemplos de add_card e retrieve_card.

Adicionar na documentação (pasta docs) esse exemplo.

Modificar __init__ dos stubs

Resumo

Atualmente a declaração de inicialização está pegando o ZoopBase.__init__ que só tem o **kwargs.
image

Critério de aceite

Modificar os stubs de cada resource para mostrar os atributos possíveis a serem recebidos no __init__

Remover o `config_log`

O logging.BasicConfig sobreescreve as configurações de log dos projetos que utilizam o zoop_wrapper.

Testes de wrapper

Resumo

A maioria dos testes de wrapper não testam muita coisa.

Todos os testes do wrapper deveriam estar semelhantes ao

def test_update_buyer(self):

Esse teste realmente verifica se foi chamado um PUT com url, payload e auth corretos.

Tarefas

  • implementar esse estilo de teste em todos os testes do wrapper

Buyer & Seller validação de cpf/cnpj

Rodar a validação de cpf/cnpj pois a API da Zoop é PÉSSIMA!

Quando é um cpf inválido ela retorna uma resosta 200 ok com um dict de ERRO!!!!

Além disso fazer gambiarra para alterar o status_code da resposta para ser levantado um HttpError.

image
image
image

Complementar os testes que tem chamada super()

Resumo

Nossos testes de conjuntos estão testando apenas o conjuto de dados hard-coded.
Porém não testam a chamada do método super corretamente.

Tarefas

  • Buyer
  • BusinessOrIndividual
  • Card
  • Invoice
  • Transaction
  • PaymentMethod
  • Token
  • Seller

Exemplo

Método

    @classmethod
    def get_required_fields(cls):
        fields = super().get_required_fields()
        return fields.union({"expiration_date", "payment_limit_date"})

Teste

    def test_required_fields(self):
        self.assertIsSubSet(
            {"expiration_date", "payment_limit_date"}, Invoice.get_required_fields()
        )

Proposta para o teste

    def test_required_fields(self):
        with patch("caminho.do.import.do.objeto.pai.ObjetoPai.get_required_fields") as mocked_super:
            mocked_super.return_value = set()
            self.assertIsSubSet(
                {"expiration_date", "payment_limit_date"}, Invoice.get_required_fields()
            )
            mocked_super.assert_called_once()

A zoop não tem validação de unicidade

Resumo

A zoop não tem restrição de unicidade no cpf nem email

Adendo

Isso foi testado no ambiente de teste e produção

Cenário

Dado que existe um cliente X que possui CPF Y na zoop
Quando for cadastrado cliente z que possui CPF Y na zoop
Então a zoop cadastra outro seller com o mesmo cpf.

Problema

O método search_individual_seller não está funcionando

Método de atualização do Buyer

Resumo

É necessário que o zoop-wrapper tenha suporte à atualização de Buyer's.

Direcionamento

Utilizar o wrapper.seller.update_seller como referência.

Tarefas

  • Adicionar método
  • Teste do método
  • Documentação da ação

Webhook

Resumo

A zoop possui webhooks!

https://docs.zoop.co/docs/sobre-os-webhooks
https://docs.zoop.co/docs/eventos-dispon%C3%ADveis

Tarefas

  • criar o model zoop_wrapper.models.event.Event
  • criar o wrapper zoop_wrapper.wrappers.webhook.WebhookWrapper
  • cenários de teste

zoop_wrapper.models.event.Event

https://docs.zoop.co/docs/sobre-os-webhooks#corpo-de-um-evento

Eventos são como comunicação assíncrona são feitas. Precisamos ter o model Event. Ele precisa ter:

  • lista de possíveis eventos
  • payload sendo transformado em um outro Model (?)

zoop_wrapper.wrappers.webhook.WebhookWrapper

create

Precisa ter o método de criação de um webhook. Que faz um POST corretamente na url da zoop.

update

Precisa ter o método de atualização de um webhook. Que faz um PATCH/PUT corretamente na url da zoop.

retrieve/search

Precisa ter o método de retrieve/search de um webhook. Que faz um GET corretamente na url da zoop.

Validar número de cartão de crédito

Resumo

A zoop retorna um erro muito bizarro de cartão de crédito.

Input de exemplo

{
	'customer': '8135bacf678842d18d71f1198377402f', 
	'payment_type': 'credit', 
	'on_behalf_of': '25037b2978b14e7fa5b902d9322e8426', 
	'description': 'Imobanco - Pedido no cartão de crédito', 
	'currency': 'BRL', 
	'capture': True, 
	'source': {
		'amount': 5400, 
		'usage': 'single_use', 
		'card': {
			'card_number': '1234123412341234', 
			'expiration_month': '12', 
			'expiration_year': '2023',
			'holder_name': 'abcde fghij',
			'security_code': '123'
		}
	}
}

Erro retornado

Sorry, the card (id: 661321d604d5484d845a44ba3b1c2b74) you are trying to use does not exist or has been deleted

Tarefa

  • Fazer uma validação do card_number na criação do token

O que acontece se for passado errado algo aqui, especialmente se for algo trocado, digo onde era para passar um CNPJ for passado um CPF válido? O pycpfcnpj vai detectar, ou algo irá detectar? Ou só lá na api da Zoop que vai dar o erro? Posso esta falando besteira, ou isso pode vir a ser um bug bem chato de achar caso ocorra.

O que acontece se for passado errado algo aqui, especialmente se for algo trocado, digo onde era para passar um CNPJ for passado um CPF válido? O pycpfcnpj vai detectar, ou algo irá detectar? Ou só lá na api da Zoop que vai dar o erro? Posso esta falando besteira, ou isso pode vir a ser um bug bem chato de achar caso ocorra.

#54 (comment)

Originally posted by @PedroRegisPOAR in #54

Transação de cartão de crédito

Resumo

A zoop possui Transação documentação oficial da zoop.

Descrição

A transação utiliza um 'objeto' nesteado chamado Payment Method.

O Payment Method 'boleto' já está funcionando.

Já existe o objeto PaymentMethod nos models.

Precisa testar e criar uma transação com o Payment Method 'credit_card'.

Cartão presente vs cartão não presente

Já temos o 'suporte' à cartão não presente. Que é justamente o fluxo de adicionar um cartão e utilizar o cartão já cadastrado na zoop para a transação.

documentação de cartão não presente/tokenizado

Porém me recordo de algo sobre ser utilizado um cartão 'on the fly' na transação.

documentação de cartão presente/'on the fly'

Source

Exist um objeto Source nesteado em transaction. Deverá ser criado o model para ele com os atributos do exemplo.

O Source herda de ZoopObject, por ele não ter nenhum atributo.

O source terá 'tipo dinâmico'. Ou seja, ele é um source do tipo 'cartão presente' ou então do tipo 'cartão tokenizado'.

Isso irá ditar quais são os atributos required.

Atributos

  • type
  • card
  • usage
  • currency
  • amount

Tipos de cartão

Cartão não presente

Exemplo de dados

"source": {
    "type": "card",
    "card": {
      "id": "8c795953db6342be9fc14a36d5308bed"
    }
  },

Conjunto do get_all_fields

{'type', 'card'}

Conjunto do get_validation_fields

como não temos outros valores para saber se tem algum outro campo 'não obrigatório' deduzimos que todos os campos são necessários

{'type', 'card'}

Tipo cartão presente

Exemplo de dados

"source":{
      "usage":"single_use",
      "card":{
         "holder_name":"JOAO SILVA",
         "expiration_month":"9",
         "expiration_year":"2027",
         "card_number":"4539003370725497",
         "security_code":"123"
      },
      "currency":"BRL",
      "type":"card",
      "amount":7
   },

Conjunto do get_all_fields

{'type', 'card', 'currency', 'usage', 'amount'}

Conjunto do get_validation_fields

como não temos outros valores para saber se tem algum outro campo 'não obrigatório' deduzimos que todos os campos são necessários

{'type', 'card', 'currency', 'usage', 'amount'}

Transaction

A transação possui tipos dinâmicos.

O tipo dinâmico é identificado a partir do atributo obrigatório payment_type.

conjunto get_required_fields

Esses campos são iguais para os dois tipos dinâmicos

{
   "amount",
   "currency",
   "description",
   "on_behalf_of",
   "payment_type"
} 

Tipo credit

Esse é o tipo do cartão.

https://docs.zoop.co/docs/cobrando-cart%C3%B5es-tokenizados

conjunto do get_all_fields

{
  "source", 
} 
+ conjunto de `get_required_fields` +
+ conjunto de `get_non_required_fields`

conjunto do get_validation_fields

{
  "source", 
} 
+ conjunto de `get_required_fields`

Tipo boleto

Esse é o tipo do boleto.

https://docs.zoop.co/docs/gerando-um-boleto

conjunto do get_all_fields

{
  "payment_method", 
} 
+ conjunto de `get_required_fields` +
+ conjunto de `get_non_required_fields`

conjunto do get_validation_fields

{
  "payment_method", 
} 
+ conjunto de `get_required_fields`

Tarefas

  • Estudar os campos de uma transação de cartão de crédito
    • Transação com cartão não presente
    • Transação com cartão presente
  • Criar Model Source
  • Alterar o model Transaction para ter o atributo source
    • Não quebrar o invoice
    • Identificar dinamicamente quando é um invoice e quando é um card utilizando algum atributo distinto
      • Fazer construção dos campos required a partir do tipo identificado dinamicamente
  • Criar testes
    • Para os models
    • Para o wrapper de transação card
  • Criar exemplos
  • Criar documentação

Testes

Resumo

temos alguns misses no nosso coverage.

Models

Base

image

BankAccount

image

Seller

image

Token

image

Wrapper

Base

image
image
image

BankAccount

image

Card

image

Invoice

image

Seller

image

Transaction

image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.