Japle / python-pagseguro

Integração com a API v2 de pagamentos e notificações do Pagseguro utilizando requests.
MIT License
172 stars 69 forks source link

Url de notificação não funciona para Assinaturas #44

Open rodfersou opened 7 years ago

rodfersou commented 7 years ago

Utilizando a versão 0.2.1 da biblioteca, nem a url de redirecionamento, nem a url de notificação funciona para assinaturas.

rodfersou commented 7 years ago

A princípio pensei que o problema estava relacionado a minha url, por que estava direcionando para uma porta do meu computador, mas agora fiz o mesmo teste em um novo servidor, e não funcionou

rochacbruno commented 7 years ago

@rodfersou vc tem como colocar a url que foi gerada, ou pelo menos uma parte dela so para verificar se tem algo errado na montagem da url

rodfersou commented 7 years ago

@rochacbruno lendo a documentação, descobri que o problema estava no método que estou usando para criar a subscrição da assinatura.

Corrigi com um monkey patch:

# -*- coding: utf-8 -*-
from pagseguro import logger
from pagseguro import PagSeguro
from pagseguro.configs import Config
from pagseguro.configs import ConfigSandbox
from pagseguro.utils import parse_date

class PagSeguroPreApprovalResponse:

    def __init__(self, xml, config=None):
        self.xml = xml
        self.config = config or {}
        self.code = None
        self.date = None
        self.errors = None
        self.payment_url = None
        self.payment_link = None
        self.transaction = None
        logger.debug(self.__dict__)
        self.parse_xml(xml)

    def parse_xml(self, xml):
        """ parse returned data """
        try:
            parsed = xmltodict.parse(xml, encoding='iso-8859-1')
        except Exception as e:
            logger.debug(
                'Cannot parse the returned xml \'{0}\' -> \'{1}\''.format(xml, e))
            parsed = {}

        if 'errors' in parsed:
            self.errors = parsed['errors']['error']
            return

        checkout = parsed.get('preApprovalRequest', {})
        self.code = checkout.get('code')
        self.date = parse_date(checkout.get('date'))

        self.payment_url = self.config.PRE_APPROVAL_PAYMENT_URL % self.code

        # this is used only for transparent checkout process

        self.transaction = parsed.get('transaction', {})
        self.payment_link = self.transaction.get('paymentLink')

def pre_approval_ask_payment(self, **kwargs):
    """ create a pagseguro pre approval subscription """
    self.data['currency'] = self.config.CURRENCY
    self.build_checkout_params(**kwargs)
    response = self.post(url=self.config.PRE_APPROVAL_URL)
    return PagSeguroPreApprovalResponse(response.content, config=self.config)

Config.PRE_APPROVAL_SUFFIX = Config.VERSION + 'pre-approvals/request'
Config.PRE_APPROVAL_URL = Config.BASE_URL + Config.PRE_APPROVAL_SUFFIX
Config.PRE_APPROVAL_PAYMENT_URL = Config.PAYMENT_HOST + Config.PRE_APPROVAL_SUFFIX + '.html?code=%s'
ConfigSandbox.PRE_APPROVAL_SUFFIX = ConfigSandbox.VERSION + 'pre-approvals/request'
ConfigSandbox.PRE_APPROVAL_URL = ConfigSandbox.BASE_URL + ConfigSandbox.PRE_APPROVAL_SUFFIX
ConfigSandbox.PRE_APPROVAL_PAYMENT_URL = ConfigSandbox.PAYMENT_HOST + ConfigSandbox.PRE_APPROVAL_SUFFIX + '.html?code=%s'
ConfigSandbox.QUERY_PRE_APPROVAL_URL = ConfigSandbox.BASE_URL + ConfigSandbox.VERSION + 'pre-approvals'
PagSeguro.pre_approval_ask_payment = pre_approval_ask_payment

Ao invés de checkout uso o método pre_approval_ask_payment.

Lembro que estou usando a versão 0.2.1 ainda.. por algum motivo não consegui atualizar para 0.3.0.. o meu buildout não conseguiu baixar essa versão quando testei.. quando tiver mais tempo abro uma nova issue para reportar isso.

Com esse código a redireção começou a funcionar.

rodfersou commented 7 years ago

Vou deixar a issue aberta por enquanto, e fechar ela quando prover um pull request com as alterações.

leonardocintra commented 7 years ago

@rodfersou por acaso o erro que você esta recebendo é um que abri na #45 ?

rochacbruno commented 7 years ago

@rodfersou @leonardocintra o problema de instalacao foi resolvido, agora voce pode tentar instalar o 0.3.1 e por favor veja se o erro continua. valeu!

rodfersou commented 7 years ago

@leonardocintra isso!

@rochacbruno obrigado!

nadermx commented 7 years ago

@rodfersou en tu implimentacion monkey patch, ese script donde lo pones? O lo usas para crear el URL, estoy un poco confundido

rodfersou commented 7 years ago

@nadermx eu usei esse monkey patch na minha aplicação por que estava aprendendo como resolver meu problema. preciso transformar isso em um pull request com correções