Beispiel #1
0
 def test_repr(self):
     comercial = Comercial(
         numero=1006993069,
         chave=
         '25fbb99741c739dd84d7b06ec78c9bac718838630f30b112d033ce2e621b34f3')
     cartao = Cartao(numero=4012001037141112,
                     validade=201805,
                     indicador=1,
                     codigo_seguranca=123,
                     nome_portador='Fulano Silva')
     pedido = Pedido(numero='1234',
                     valor=10000,
                     moeda=986,
                     data_hora='2016-03-05T05:01:30.738727')
     pagamento = Pagamento(bandeira='visa', produto='1', parcelas=1)
     transacao = Transacao(comercial=comercial,
                           cartao=cartao,
                           pedido=pedido,
                           pagamento=pagamento,
                           autorizar=3,
                           capturar=True)
     self.assertEqual(
         repr(transacao),
         '<Transacao(comercial=<Comercial(numero=1006993069, chave=25fbb99741c739dd84d7b06ec78c9bac718838630f30b112d033ce2e621b34f3)>, cartao=<Cartao(numero=4012001037141112, validade=201805, indicador=1, codigo_seguranca=123, nome_portador=Fulano Silva, token=None)>, pedido=<Pedido(numero=1234, valor=10000, moeda=986, data_hora=2016-03-05T05:01:30.738727, descricao=None, idioma=PT, taxa_embarque=None, soft_descriptor=None)>, pagamento=<Pagamento(bandeira=visa, produto=1, parcelas=1)>, url_retorno=None, autorizar=3, capturar=True, campo_livre=None, bin=None, gerar_token=None, avs=None, autenticacao=None, autorizacao=None, captura=None, token=None, cancelamento=None, tid=None, pan=None, status=None, url_autenticacao=None)>'
     )
 def test_autorizar_com_erro(self):
     transacao = Transacao(comercial=self.comercial,
                           cartao=self.cartao,
                           pedido=self.pedido,
                           pagamento=self.pagamento,
                           autorizar=3,
                           capturar=True)
     with pytest.raises(CieloRequestError) as excinfo:
         self.request.autorizar(transacao)
     assert '000 - Mensagem' in str(excinfo.value)
    def test_autorizar(self):
        with pytest.raises(TypeError) as excinfo:
            self.request.autorizar('transacao')
        assert 'transacao precisa ser do tipo Transacao.' in str(excinfo.value)

        transacao = Transacao(comercial=self.comercial,
                              cartao=self.cartao,
                              pedido=self.pedido,
                              pagamento=self.pagamento,
                              autorizar=3,
                              capturar=True)
        transacao = self.request.autorizar(transacao=transacao)
        self.assertTrue(isinstance(transacao, Transacao))
        self.assertEqual(transacao.tid, '1006993069484E8B1001')
        self.assertEqual(transacao.pan,
                         'IqVz7P9zaIgTYdU41HaW/OB/d7Idwttqwb2vaTt8MT0=')
Beispiel #4
0
def get_in_progress_transaction(numero=1, valor="", produto="", bandeira="", parcelas=1, tid="", return_url=AUTH_URL):
    return Transacao(
        pedido=dict_to_pedido({'numero':str(numero),
                               'valor':valor,
                               'moeda':941,
                               'data-hora':'2016-01-01T01:00Z'}),
        pagamento=dict_to_pagamento({'bandeira':bandeira, # CieloCardBrand.Visa,
                                     'produto':produto, # CieloProduct.Credit,
                                     'parcelas':parcelas}),
        token=None,
        captura=None,
        cancelamento=None,
        tid=tid,
        pan=None,
        status=CieloTransactionStatus.InProgress.value,
        url_autenticacao=return_url,
    )
Beispiel #5
0
 def test_autorizar_com_rejeicao(self):
     self.pedido = Pedido(
         numero='1234',
         valor=553482920,
         moeda=986,
         data_hora=datetime.now().isoformat(),
     )
     transacao = Transacao(comercial=self.comercial,
                           cartao=self.cartao,
                           pedido=self.pedido,
                           pagamento=self.pagamento,
                           autorizar=3,
                           capturar=True)
     transacao = self.request.autorizar(transacao=transacao)
     self.assertTrue(isinstance(transacao, Transacao))
     self.assertEqual(transacao.tid, '100699306900050E36EA')
     self.assertEqual(transacao.pan,
                      'IqVz7P9zaIgTYdU41HaW/OB/d7Idwttqwb2vaTt8MT0=')
     self.assertEqual(transacao.autorizacao.mensagem, 'Autorizacao negada')
Beispiel #6
0
    def test_validate(self):
        comercial = Comercial(numero=1234, chave='1234')
        cartao = Cartao(numero=1234,
                        validade=201805,
                        indicador=1,
                        codigo_seguranca=123,
                        nome_portador='Fulano Silva')
        pedido = Pedido(
            numero='1234',
            valor=10000,
            moeda=986,
            data_hora='2011-12-07T11:43:37',
        )
        pagamento = Pagamento(bandeira='visa', produto='1', parcelas=1)
        autenticacao = Autenticacao(codigo=1,
                                    mensagem='msg',
                                    data_hora='2011-12-07T11:43:37',
                                    valor=10000,
                                    eci=7)
        autorizacao = Autorizacao(codigo=1,
                                  mensagem='msg',
                                  data_hora='2011-12-07T11:43:37',
                                  valor=10000,
                                  lr=1,
                                  arp=1,
                                  nsu=1)
        token = Token(codigo='codigo', status=1, numero='1234')
        avs = Avs(endereco='Rua 1',
                  complemento='',
                  numero=1,
                  bairro='Bairro',
                  cep='00000-000')
        captura = Captura(codigo=1,
                          mensagem='mensagem',
                          data_hora='2011-12-07T11:43:37',
                          valor=10000,
                          taxa_embarque=0)
        cancelamento = Cancelamento(
            codigo=1,
            mensagem='mensagem',
            data_hora='2011-12-07T11:43:37',
            valor=10000,
        )

        with pytest.raises(TypeError) as excinfo:
            Transacao(
                comercial=1,
                cartao=cartao,
                pedido=pedido,
                pagamento=pagamento,
            )
        assert 'comercial precisa ser do tipo Comercial.' in str(excinfo.value)

        with pytest.raises(TypeError) as excinfo:
            Transacao(
                comercial=comercial,
                cartao=1,
                pedido=pedido,
                pagamento=pagamento,
            )
        assert 'cartao precisa ser do tipo Cartao.' in str(excinfo.value)

        with pytest.raises(TypeError) as excinfo:
            Transacao(
                comercial=comercial,
                cartao=cartao,
                pedido=1,
                pagamento=pagamento,
            )
        assert 'pedido precisa ser do tipo Pedido.' in str(excinfo.value)

        with pytest.raises(TypeError) as excinfo:
            Transacao(
                comercial=comercial,
                cartao=cartao,
                pedido=pedido,
                pagamento=1,
            )
        assert 'pagamento precisa ser do tipo Pagamento.' in str(excinfo.value)

        with pytest.raises(TypeError) as excinfo:
            Transacao(comercial=comercial,
                      cartao=cartao,
                      pedido=pedido,
                      pagamento=pagamento,
                      autorizar='1')
        assert 'autorizar precisa ser do tipo inteiro.' in str(excinfo.value)

        with pytest.raises(TypeError) as excinfo:
            Transacao(comercial=comercial,
                      cartao=cartao,
                      pedido=pedido,
                      pagamento=pagamento,
                      autorizar=1,
                      url_retorno=1)
        assert 'url_retorno precisa ser do tipo string.' in str(excinfo.value)

        with pytest.raises(TypeError) as excinfo:
            Transacao(comercial=comercial,
                      cartao=cartao,
                      pedido=pedido,
                      pagamento=pagamento,
                      capturar='false')
        assert 'capturar precisa ser do tipo booleano.' in str(excinfo.value)

        with pytest.raises(TypeError) as excinfo:
            Transacao(comercial=comercial,
                      cartao=cartao,
                      pedido=pedido,
                      pagamento=pagamento,
                      campo_livre=1)
        assert 'campo_livre precisa ser do tipo string.' in str(excinfo.value)

        with pytest.raises(TypeError) as excinfo:
            Transacao(comercial=comercial,
                      cartao=cartao,
                      pedido=pedido,
                      pagamento=pagamento,
                      bin='1234')
        assert 'bin precisa ser do tipo inteiro.' in str(excinfo.value)

        with pytest.raises(TypeError) as excinfo:
            Transacao(comercial=comercial,
                      cartao=cartao,
                      pedido=pedido,
                      pagamento=pagamento,
                      gerar_token='false',
                      avs=avs)
        assert 'gerar_token precisa ser do tipo booleano.' in str(
            excinfo.value)

        with pytest.raises(TypeError) as excinfo:
            Transacao(comercial=comercial,
                      cartao=cartao,
                      pedido=pedido,
                      pagamento=pagamento,
                      avs=1)
        assert 'avs precisa ser do tipo Avs.' in str(excinfo.value)

        with pytest.raises(TypeError) as excinfo:
            Transacao(comercial=comercial,
                      cartao=cartao,
                      pedido=pedido,
                      pagamento=pagamento,
                      autenticacao=1,
                      autorizacao=autorizacao)
        assert 'autenticacao precisa ser do tipo Autenticacao.' in str(
            excinfo.value)

        with pytest.raises(TypeError) as excinfo:
            Transacao(comercial=comercial,
                      cartao=cartao,
                      pedido=pedido,
                      pagamento=pagamento,
                      autenticacao=autenticacao,
                      autorizacao=1,
                      captura=captura)
        assert 'autorizacao precisa ser do tipo Autorizacao.' in str(
            excinfo.value)

        with pytest.raises(TypeError) as excinfo:
            Transacao(comercial=comercial,
                      cartao=cartao,
                      pedido=pedido,
                      pagamento=pagamento,
                      autenticacao=autenticacao,
                      autorizacao=autorizacao,
                      captura=1)
        assert 'captura precisa ser do tipo Captura.' in str(excinfo.value)

        with pytest.raises(TypeError) as excinfo:
            Transacao(comercial=comercial,
                      cartao=cartao,
                      pedido=pedido,
                      pagamento=pagamento,
                      tid=1,
                      pan='pan',
                      status=1)
        assert 'tid precisa ser do tipo string.' in str(excinfo.value)

        with pytest.raises(TypeError) as excinfo:
            Transacao(comercial=comercial,
                      cartao=cartao,
                      pedido=pedido,
                      pagamento=pagamento,
                      tid='1',
                      pan=1,
                      status=1)
        assert 'pan precisa ser do tipo string.' in str(excinfo.value)

        with pytest.raises(TypeError) as excinfo:
            Transacao(comercial=comercial,
                      cartao=cartao,
                      pedido=pedido,
                      pagamento=pagamento,
                      tid='1',
                      pan='pan',
                      status='1',
                      url_autenticacao='http://google.com')
        assert 'status precisa ser do tipo inteiro.' in str(excinfo.value)

        with pytest.raises(TypeError) as excinfo:
            Transacao(comercial=comercial,
                      cartao=cartao,
                      pedido=pedido,
                      pagamento=pagamento,
                      tid='1',
                      pan='pan',
                      status=1,
                      url_autenticacao=1,
                      token=token)
        assert 'url_autenticacao precisa ser do tipo string.' in str(
            excinfo.value)

        with pytest.raises(TypeError) as excinfo:
            Transacao(comercial=comercial,
                      cartao=cartao,
                      pedido=pedido,
                      pagamento=pagamento,
                      tid='1',
                      pan='pan',
                      status=1,
                      token=1,
                      cancelamento=cancelamento)
        assert 'token precisa ser do tipo Token.' in str(excinfo.value)

        with pytest.raises(TypeError) as excinfo:
            Transacao(comercial=comercial,
                      cartao=cartao,
                      pedido=pedido,
                      pagamento=pagamento,
                      tid='1',
                      pan='pan',
                      status=1,
                      cancelamento=1)
        assert 'cancelamento precisa ser do tipo Cancelamento.' in str(
            excinfo.value)
Beispiel #7
0
    def form_valid(self, form):
        # verifica se existe alguma transação pendente na sessão
        # se sim, cancela a autorização antiga para fazer uma nova
        if self.request.cielo.transaction:
            try:
                self.request.cielo.transaction.safe_cancel(
                    self.request.cielo.transaction.total_value)
            except:
                logger.exception(_("Failed to cancel old Cielo transaction"))

        # populate the basket with all the checkout stuff
        _configure_basket(self.request)
        order_total = self.request.basket.taxful_total_price.value
        service = self.request.basket.payment_method.choice_identifier

        cc_info = form.cleaned_data
        transaction_total = order_total
        interest_amount = Decimal()
        installments = safe_int(cc_info['installments'])

        cielo_config = self.request.shop.cielo_config

        produto = CieloProduct.Credit

        if service == CIELO_SERVICE_CREDIT:
            if installments > 1:
                installment_choices = InstallmentContext(
                    order_total, cielo_config).get_intallments_choices()

                # verifica se o número da parcela existe nas opções
                if installments <= len(installment_choices):
                    produto = CieloProduct.InstallmentCredit

                    # obtém o valor da transação de acordo com a parcela escolhida
                    transaction_total = installment_choices[installments -
                                                            1][2]
                    interest_amount = installment_choices[installments - 1][3]
                else:
                    installments = 1

        else:
            # debito
            produto = CieloProduct.Debit
            installments = 1

        cielo_order = CieloOrderTransaction.objects.create()

        comercial = Comercial(numero=safe_int(cielo_config.ec_num),
                              chave=cielo_config.ec_key)

        cartao = Cartao(
            numero=safe_int(cc_info['cc_number']),
            validade=safe_int("{0}{1}".format(cc_info['cc_valid_year'],
                                              cc_info['cc_valid_month'])),
            indicador=1,  # sempre sera necessario o digito verificador
            codigo_seguranca=safe_int(cc_info['cc_security_code']),
            nome_portador=cc_info['cc_holder'])

        pedido = Pedido(
            numero="{0}".format(cielo_order.pk),
            valor=decimal_to_int_cents(transaction_total),
            moeda=986,  # Fixo
            data_hora=now().isoformat())

        pagamento = Pagamento(bandeira=cc_info['cc_brand'],
                              produto=produto,
                              parcelas=installments)

        return_url = self.request.build_absolute_uri(
            reverse("shuup:cielo_transaction_return",
                    kwargs={"cielo_order_pk": cielo_order.id}))

        transacao = Transacao(comercial=comercial,
                              cartao=cartao,
                              pedido=pedido,
                              pagamento=pagamento,
                              autorizar=cielo_config.authorization_mode,
                              capturar=cielo_config.auto_capture,
                              url_retorno=return_url)

        cielo_request = CieloRequest(sandbox=cielo_config.sandbox)

        # base response data
        response_data = {"success": False}
        cielo_transaction = None

        try:
            response_transaction = cielo_request.autorizar(transacao=transacao)

            cielo_transaction = CieloTransaction.objects.create(
                shop=self.request.shop,
                order_transaction=cielo_order,
                tid=response_transaction.tid,
                status=response_transaction.status,
                total_value=transaction_total,
                cc_holder=cc_info['cc_holder'],
                cc_brand=cc_info['cc_brand'],
                cc_product=produto,
                installments=installments,
                interest_value=interest_amount)

            # se existe uma URL para autenticacao, vamos redirecionar primeiro
            if response_transaction.url_autenticacao:
                response_data["success"] = True
                response_data[
                    "redirect_url"] = response_transaction.url_autenticacao

            # transação autorizada, vamos para a página de retorno para
            # efetivar
            elif response_transaction.autorizacao:

                if response_transaction.autorizacao.lr in CIELO_AUTHORIZED_STATUSES:
                    response_data["success"] = True
                    response_data["redirect_url"] = return_url

                else:
                    response_data["success"] = False
                    error = _p("Transaction not authorized: {0}").format(
                        CieloAuthorizationCode.get(
                            response_transaction.autorizacao.lr,
                            {}).get('msg', CIELO_UKNOWN_ERROR_MSG))
                    response_data["error"] = error

            else:
                response_data["success"] = False
                response_data["error"] = _p("Transaction not authorized: {0}"
                                            ).format(CIELO_UKNOWN_ERROR_MSG)

        except CieloRequestError:
            response_data["success"] = False
            response_data["error"] = _p("Internal error")
            logger.exception(_("Cielo transaction error."))

        else:
            self.request.cielo.set_order_transaction(cielo_order)
            self.request.cielo.set_transaction(cielo_transaction)
            self.request.cielo.commit()

        return self.render_to_response(response_data)