Example #1
0
def callback_commercegate(request):
    try:
        data = request.body
        request_unquote = urllib.unquote_plus(data)
        xml = xmltodict.parse(request_unquote[22:])
    except Exception:
        return HttpResponse('Error parsing callback data',
                            content_type='text/plain',
                            status='200')

    xml_data = xml['cgCallback']
    transaction_type = xml_data['TransactionType']
    transaction_id = xml_data['TransactionID']
    user_id = xml_data['UserID']

    try:
        user = User.objects.get(user_id=user_id)
    except ObjectDoesNotExist:
        return HttpResponse('UserId does not exist',
                            content_type='text/plain',
                            status='200')

    if 'TransactionReferenceID' in xml_data:
        transaction_reference_id = xml_data['TransactionReferenceID']

    if transaction_type == 'SALE':
        try:
            up = UserPayment.objects.filter(user=user,
                                            status='PE').order_by('-id')[0]
            ph = PaymentHistory.objects.filter(
                user_payment__user_payment_id=up.user_payment_id,
                status='P').order_by('-id')[0]
        except Exception as e:
            return HttpResponse('Error getting up or ph: %s' % e,
                                content_type='text/plain',
                                status='200')

        # Activar user payment
        up.active()
        up.payment_date = up.calc_payment_date(datetime.now())
        if up.is_trial:
            up.trial_counter -= 1
        up.save()

        # Aprobar payment history
        ph.approve(transaction_id)

        # Setear fecha de expiracion del usuario
        user.set_expiration(up.payment_date)

        print 'CommerceGate callback: Sale'

        # POST to promiscuus
        if ph.trial:
            ph.trial_duration = up.trial_recurrence
        else:
            ph.trial_duration = 0
        resp_promiscuus = post_to_promiscuus(ph, 'payment_commit')
        if resp_promiscuus['status'] == 'error':
            ph.message = "%s - Promiscuus error: %s" % (
                ph.message, resp_promiscuus['message'])
            ph.save()

    elif transaction_type == 'REBILL':
        up = UserPayment.objects.get(user=user, status='AC')
        payment_id = 'PH_%s_%d' % (user.user_id, int(time()))

        # Modificar fecha de user payment
        up.payment_date = up.calc_payment_date(datetime.now())
        up.save()

        # Modificar fecha de expiracion del usuario
        user.set_expiration(up.payment_date)

        # Obtengo integrador
        integrator = Integrator.get_by_country('commerce_gate', user.country)

        # Crear payment history
        ph = PaymentHistory.create(up,
                                   payment_id,
                                   integrator,
                                   status='A',
                                   gateway_id=transaction_id)

        if up.is_trial:
            up.trial_counter -= 1
            up.save()

        print 'CommerceGate callback: Rebill'

        # POST to promiscuus
        if ph.trial:
            ph.trial_duration = up.trial_recurrence
        else:
            ph.trial_duration = 0
        resp_promiscuus = post_to_promiscuus(ph, 'rebill')
        if resp_promiscuus['status'] == 'error':
            ph.message = "%s - Promiscuus error: %s" % (
                ph.message, resp_promiscuus['message'])
            ph.save()

    elif transaction_type == 'CANCELMEMBERSHIPNOTIFY':
        up = UserPayment.objects.get(user=user, status='AC')
        up.cancel('U')

        # POST to promiscuus
        resp_promiscuus = post_to_promiscuus(up, 'cancel')
        if resp_promiscuus['status'] == 'error':
            up.message = "%s - Promiscuus error: %s" % (
                up.message, resp_promiscuus['message'])
            up.save()

        print 'CommerceGate callback: Cancel membership notify. User: %s' % user.user_id

    elif transaction_type == 'CANCELMEMBERSHIP':
        up = UserPayment.get_active(user)
        if up is not None:
            up.cancel('C')

            # POST to promiscuus
            resp_promiscuus = post_to_promiscuus(up, 'cancel')
            if resp_promiscuus['status'] == 'error':
                up.message = "%s - Promiscuus error: %s" % (
                    up.message, resp_promiscuus['message'])
                up.save()

        user.expire()
        print 'CommerceGate callback: Cancel membership. User: %s' % user.user_id

    elif transaction_type == 'REFUND':
        try:
            ph = PaymentHistory.objects.get(
                gateway_id=transaction_reference_id)
            ph.cancel(transaction_id, 'refund')
        except:
            print 'Refund: Transaction ID %s not found' % transaction_reference_id

    print(xml)
    return HttpResponse('SUCCESS', content_type='text/plain', status='200')
Example #2
0
def cancel_commercegate(request):
    # Cargo el JSON
    try:
        data = json.loads(request.body)
    except Exception:
        message = 'error decoding json'
        body = {'status': 'error', 'message': message}

        return HttpResponse(json.dumps(body),
                            content_type='application/json',
                            status=http_BAD_REQUEST)

    # Verifico las key mandatorias
    keys = ['user_id']

    json_loader = __validate_json(data, keys)

    if json_loader['status'] == 'error':
        json_loader['message'] = 'check api mandatory parameters'
        return HttpResponse(json.dumps(json_loader),
                            content_type='application/json',
                            status=http_BAD_REQUEST)

    # Obtengo pais
    country = Country.get_by_code(data['user_id'].split("_")[0].lower())

    # Obtengo Integrador
    integrator = Integrator.get_by_country('commerce_gate', country)
    if integrator is None:
        message = "integrator does not exist for country %s" % country.name
        body = {'status': 'error', 'message': message}
        return HttpResponse(json.dumps(body),
                            content_type="application/json",
                            status=http_BAD_REQUEST)

    # Obtengo Integrator Settings
    endpoint_cancel = IntegratorSetting.get_var(integrator, 'endpoint_cancel')
    customer_id = IntegratorSetting.get_var(integrator, 'customer_id')
    password = IntegratorSetting.get_var(integrator, 'password')

    # Verifico que el usuario existe o no este ya cancelado
    try:
        user = User.objects.get(user_id=data['user_id'])
    except ObjectDoesNotExist:
        message = 'user not found'
        body = {'status': 'error', 'message': message}

        return HttpResponse(json.dumps(body),
                            content_type='application/json',
                            status=http_NOT_FOUND)

    if not user.is_active:
        message = 'already canceled user'
        body = {'status': 'error', 'message': message}

        return HttpResponse(json.dumps(body),
                            content_type='application/json',
                            status=http_NOT_FOUND)

    up = UserPayment.get_active(user=user)
    if up is None:
        message = "user_id %s has not enabled recurring payment" % data[
            'user_id']
        body = {'status': 'error', 'message': message}
        return HttpResponse(json.dumps(body),
                            content_type="application/json",
                            status=http_BAD_REQUEST)

    ph = PaymentHistory.get_first_approved(up)
    if ph is None:
        message = "there isnt approved payments for userpayment_id %s" % up.user_payment_id
        body = {'status': 'error', 'message': message}
        return HttpResponse(json.dumps(body),
                            content_type="application/json",
                            status=http_BAD_REQUEST)

    #params = { 'customerId': customer_id, 'websiteId': website_id, 'password': password, 'username': data['user_id'] }
    params = {
        'customerId': customer_id,
        'password': password,
        'first_transaction_id': ph.gateway_id
    }
    url = '%s?%s' % (endpoint_cancel, urlencode(params))

    # Llamo a la api de commercegate
    try:
        resp, content = Http().request(url, 'POST')
    except Exception as e:
        message = 'communication error with commercegate'
        body = {'status': 'error', 'message': e}
        return HttpResponse(json.dumps(body),
                            content_type='application/json',
                            status=http_BAD_REQUEST)

    body = {'status': 'success'}
    return HttpResponse(json.dumps(body),
                        content_type='application/json',
                        status=http_POST_OK)
Example #3
0
def payment_commercegate(request):
    # Verifico ApiKey
    cap = __check_apikey(request)
    if cap['status'] == 'error':
        return HttpResponse(status=http_UNAUTHORIZED)

    # Cargo el JSON
    try:
        data = json.loads(request.body)
        print "CONTENT MA: %s" % data
    except Exception:
        message = 'error decoding json'
        body = {'status': 'error', 'message': message}

        return HttpResponse(json.dumps(body),
                            content_type='application/json',
                            status=http_BAD_REQUEST)

    # Verifico las key mandatorias
    keys = ['user_id', 'email', 'recurrence']

    json_loader = __validate_json(data, keys)

    if json_loader['status'] == 'error':
        json_loader[
            'message'] = 'Ocurrió un error con el pago, por favor reintente nuevamente más tarde'

        return HttpResponse(json.dumps(json_loader),
                            content_type='application/json',
                            status=http_BAD_REQUEST)

    # Obtengo pais
    country = Country.get_by_code(data['user_id'].split("_")[0].lower())

    # Obtengo Integrador
    integrator = Integrator.get_by_country('commerce_gate', country)
    if integrator is None:
        message = "integrator does not exist for country %s" % country.name
        body = {'status': 'error', 'message': message}
        return HttpResponse(json.dumps(body),
                            content_type="application/json",
                            status=http_BAD_REQUEST)

    # Obtengo Integrator Settings
    redirect_url_failed = IntegratorSetting.get_var(integrator,
                                                    'redirect_url_failed')
    redirect_url_success = IntegratorSetting.get_var(integrator,
                                                     'redirect_url_success')
    endpoint = IntegratorSetting.get_var(integrator, 'endpoint')
    endpoint_token = IntegratorSetting.get_var(integrator, 'endpoint_token')
    website_id = IntegratorSetting.get_var(integrator, 'website_id')
    customer_id = IntegratorSetting.get_var(integrator, 'customer_id')

    # Verifico si el usuario existe y sino lo creo
    try:
        user = User.objects.get(user_id=data['user_id'])
        user.email = data['email']
        user.save()
    except ObjectDoesNotExist:
        user = User.create(data['user_id'], data['email'], integrator.country)

    # Obtengo el paquete
    if 'package_id' in data:
        package = Package.get_by_id(data['package_id'], integrator)
    else:
        package = Package.get(data['recurrence'], integrator)

    if package is None:
        message = "package not found with that duration"
        body = {'status': 'error', 'message': message}

        return HttpResponse(json.dumps(body),
                            content_type="application/json",
                            status=http_BAD_REQUEST)

    # Si tiene algun UserPayment habilitado devuelvo un error
    up = UserPayment.get_active(user)
    if up is not None:
        message = 'enabled user payment already exists'
        body = {'status': 'error', 'message': message}
        return HttpResponse(json.dumps(body),
                            content_type='application/json',
                            status=http_BAD_REQUEST)
    else:
        up = UserPayment.create_from_package(user, package)

    payment_id = "PH_%s_%d" % (user.user_id, int(time()))

    # Creo el PaymentHistory
    ph = PaymentHistory.create(up, payment_id, integrator)

    params = {
        'cid': customer_id,
        'wid': website_id,
        'packid': package.package_id,
        'username': data['user_id'],
        'email': data['email']
    }
    url = '%s?%s' % (endpoint_token, urlencode(params))

    try:
        resp, content = Http().request(url, 'POST')
    except Exception as e:
        message = "communication error with commercegate, waiting callback"
        body = {'status': 'error', 'message': message}

        return HttpResponse(json.dumps(body),
                            content_type="application/json",
                            status=http_PAYMENT_REQUIRED)

    iframe_params = {'cid': customer_id, 'wid': website_id, 'token': content}

    if redirect_url_success:
        iframe_params['successUrl'] = redirect_url_success

    if redirect_url_failed:
        iframe_params['failedUrl'] = "%s://%s/commercegate/error/%s" % (
            request.scheme, request.META['HTTP_HOST'], up.user_payment_id)

    iframe_url = '%s?%s' % (endpoint, urlencode(iframe_params))
    body = {'status': 'success', 'value': {'url': iframe_url}}

    return HttpResponse(json.dumps(body),
                        content_type="application/json",
                        status=http_POST_OK)
Example #4
0
def add_card_pagodigital(request):
    # Vars
    integrator = Integrator.get('pagodigital')
    baseurl = Setting.get_var('baseurl')
    template = 'pagodigital/pagodigital.html'

    # Verifico ApiKey
    cap = __check_apikey(request)
    if cap['status'] == 'error':
        return HttpResponse(status=http_UNAUTHORIZED)

    # Cargo el JSON
    try:
        data = json.loads(request.body)
    except Exception:
        message = 'error decoding json'
        body = {'status': 'error', 'message': message}
        return HttpResponse(json.dumps(body),
                            content_type='application/json',
                            status=http_BAD_REQUEST)

    # Verifico las key mandatorias
    keys = ['user_id']
    json_loader = __validate_json(data, keys)

    if json_loader['status'] == 'error':
        return HttpResponse(json.dumps(json_loader),
                            content_type='application/json',
                            status=http_BAD_REQUEST)

    # Verifico si el usuario existe y sino devuelvo error
    try:
        user = User.objects.get(user_id=data['user_id'])
    except ObjectDoesNotExist:
        message = 'user does not exist'
        body = {'status': 'error', 'message': message}
        return HttpResponse(json.dumps(body),
                            content_type='application/json',
                            status=http_BAD_REQUEST)

    # Obtengo el User Payment activo sino devuelvo error
    up = UserPayment.get_active(user)
    if up is None:
        message = 'enabled user payment does not exist'
        body = {'status': 'error', 'message': message}
        return HttpResponse(json.dumps(body),
                            content_type='application/json',
                            status=http_BAD_REQUEST)

    # Creo el form
    form = Form.create(user, up, integrator, template, 'AC')
    if form is None:
        message = "form could not be created"
        body = {'status': 'error', 'message': message}
        return HttpResponse(json.dumps(body),
                            content_type="application/json",
                            status=http_INTERNAL_ERROR)

    iframe_params = {'user_id': user.user_id, 'token': form.token}
    iframe_url = '%sapi/v1/pagodigital/addcard/form/?%s' % (
        baseurl, urlencode(iframe_params))
    body = {'status': 'success', 'value': {'url': iframe_url}}

    return HttpResponse(json.dumps(body),
                        content_type="application/json",
                        status=http_POST_OK)
Example #5
0
def payment_pagodigital(request):
    # Vars
    integrator = Integrator.get('pagodigital')
    baseurl = Setting.get_var('baseurl')
    template = 'pagodigital/pagodigital.html'

    # Verifico ApiKey
    cap = __check_apikey(request)
    if cap['status'] == 'error':
        return HttpResponse(status=http_UNAUTHORIZED)

    # Cargo el JSON
    try:
        data = json.loads(request.body)
        print "CONTENT MA: %s" % data
    except Exception:
        message = 'error decoding json'
        body = {'status': 'error', 'message': message}
        return HttpResponse(json.dumps(body),
                            content_type='application/json',
                            status=http_BAD_REQUEST)

    # Verifico las key mandatorias
    keys = ['user_id', 'email', 'payment_date', 'recurrence']
    json_loader = __validate_json(data, keys)

    if json_loader['status'] == 'error':
        return HttpResponse(json.dumps(json_loader),
                            content_type='application/json',
                            status=http_BAD_REQUEST)

    # Verifico si el usuario existe y sino lo creo
    try:
        user = User.objects.get(user_id=data['user_id'])
        user.email = data['email']
        user.save()
    except ObjectDoesNotExist:
        user = User.create(data['user_id'], data['email'], integrator.country)

    # Verifico que no tenga un User Payment activo
    up = UserPayment.get_active(user)
    if up is not None:
        if up.enabled_card:
            message = 'enabled user payment already exists'
            body = {'status': 'error', 'message': message}
            return HttpResponse(json.dumps(body),
                                content_type='application/json',
                                status=http_BAD_REQUEST)
        else:
            up.status = 'PE'
            up.save()

    # Obtengo el paquete
    if 'package_id' in data:
        package = Package.get_by_id(data['package_id'], integrator)
    else:
        package = Package.get(data['recurrence'], integrator)

    if package is None:
        message = "package not found with that duration"
        body = {'status': 'error', 'message': message}
        return HttpResponse(json.dumps(body),
                            content_type="application/json",
                            status=http_BAD_REQUEST)

    # Creo UserPayment
    up = UserPayment.create_from_package(user, package, data['payment_date'],
                                         0, 0, True)

    # Aplico descuento si existe
    if 'discount' in data and 'disc_counter' in data:
        up.discount(data['discount'], data['disc_counter'])

    # Creo el form
    form = Form.create(user, up, integrator, template, 'UP', package)
    if form is None:
        message = "form could not be created"
        body = {'status': 'error', 'message': message}
        return HttpResponse(json.dumps(body),
                            content_type="application/json",
                            status=http_INTERNAL_ERROR)

    iframe_params = {'user_id': user.user_id, 'token': form.token}
    iframe_url = '%sapi/v1/pagodigital/userpayment/form/?%s' % (
        baseurl, urlencode(iframe_params))
    body = {'status': 'success', 'value': {'url': iframe_url}}

    return HttpResponse(json.dumps(body),
                        content_type="application/json",
                        status=http_POST_OK)
Example #6
0
def userpayment_form_pagodigital(request):
    ########  Metodo POST  ########
    if request.method == 'POST':
        data = request.POST
        template = 'pagodigital/redirect.html'

        # Verifico las key mandatorias
        keys = [
            'name', 'phone', 'address', 'id_card', 'email', 'city', 'state',
            'cc_number', 'cc_exp_month', 'cc_exp_year', 'cc_cvv',
            'cc_fr_number', 'cc_fr_name', 'user_id', 'token'
        ]

        json_loader = __validate_json(data, keys)
        if json_loader['status'] == 'error':
            return HttpResponse(json.dumps(json_loader),
                                content_type='application/json',
                                status=http_BAD_REQUEST)

        # Obtengo el usuario y el form vinculado al token
        user = User.get(data['user_id'])
        form = Form.get(user, data['token'])
        if form is None:
            message = 'form not available'
            body = {'status': 'error', 'message': message}
            return HttpResponse(json.dumps(body),
                                content_type='application/json',
                                status=http_BAD_REQUEST)

        # Verifico que no tenga un User Payment activo
        active_up = UserPayment.get_active(user)
        if active_up is not None:
            message = 'enabled user payment already exists'
            body = {'status': 'error', 'message': message}
            return HttpResponse(json.dumps(body),
                                content_type='application/json',
                                status=http_BAD_REQUEST)

        up = form.user_payment

        # Obtengo settings del integrator
        api_key = IntegratorSetting.get_var(form.integrator, 'api_key')
        api_secret = IntegratorSetting.get_var(form.integrator, 'api_secret')
        success_url = IntegratorSetting.get_var(form.integrator,
                                                'redirect_url_success')
        failed_url = IntegratorSetting.get_var(form.integrator,
                                               'redirect_url_failed')
        jwt_endpoint = IntegratorSetting.get_var(form.integrator,
                                                 'jwt_endpoint')
        jwt_user = IntegratorSetting.get_var(form.integrator, 'jwt_user')
        jwt_pass = IntegratorSetting.get_var(form.integrator, 'jwt_pass')

        # Obtengo el JWT
        pd_jwt_gw = PagoDigitalJWTGateway(jwt_endpoint, jwt_user, jwt_pass)
        try:
            ret, content = pd_jwt_gw.doPost()
            if not ret:
                message = "%s - %s" % (content['STATUS_MESSAGE'],
                                       content['MESSAGE'])
                up.reply_error(message)
                context = {'redirect_url': failed_url}
                return render(request, template, context)
            if not 'TOKEN' in content:
                message = "JWT ERROR - TOKEN key not found"
                up.reply_error(message)
                context = {'redirect_url': failed_url}
                return render(request, template, context)
            pd_jwt = content['TOKEN']
        except Exception as e:
            message = 'jwt error: %s' % e
            up.reply_error(message)
            context = {'redirect_url': failed_url}
            return render(request, template, context)

        # Realizar add card y obtener token
        pd_ac_endpoint = IntegratorSetting.get_var(form.integrator,
                                                   'add_card_endpoint')
        pd_gw = PagoDigitalGateway(pd_ac_endpoint, api_key, api_secret, pd_jwt)
        pd_card = PagoDigitalCard(data['cc_number'], data['cc_cvv'],
                                  data['cc_fr_number'], data['cc_exp_month'],
                                  data['cc_exp_year'], data['name'],
                                  data['id_card'], data['address'],
                                  data['email'], data['phone'], data['city'],
                                  data['state'])
        new_card = True
        try:
            ret, content = pd_gw.doPost(pd_card.to_dict())
            if not ret:
                message = "%s - %s" % (content['STATUS_MESSAGE'],
                                       content['MESSAGE'])
                up.reply_error(message)
                context = {'redirect_url': failed_url}
                return render(request, template, context)
            if 'CODIGO_RESPUESTA' in content:
                if str(content['CODIGO_RESPUESTA']) not in SUCCESS_CODES:
                    message = "ADD CARD ERROR - code: %s - message: %s" % (
                        content['CODIGO_RESPUESTA'], content['RESPUESTA'])
                    up.reply_error(message)
                    context = {'redirect_url': failed_url}
                    return render(request, template, context)
            elif 'CODIGO_ERROR' in content and content[
                    'CODIGO_ERROR'] == 'PD38':
                if 'TOKEN' not in content:
                    message = "ADD CARD ERROR - CODIGO_ERROR PD38 but TOKEN not returned"
                    up.reply_error(message)
                    context = {'redirect_url': failed_url}
                    return render(request, template, context)
                new_card = False
            else:
                message = "ADD CARD ERROR - CODIGO_RESPUESTA not found"
                up.reply_error(message)
                context = {'redirect_url': failed_url}
                return render(request, template, context)
        except Exception as e:
            message = 'add card error: %s' % e
            up.reply_error(message)
            context = {'redirect_url': failed_url}
            return render(request, template, context)

        # Habilito tarjeta en UP
        up.enabled_card = True

        # Deshabilito cualquier tarjeta existente
        cards = Card.objects.filter(user=user, enabled=True)
        for card in cards:
            card.disable()

        # Creo la tarjeta o la obtengo si ya existe
        card = Card.get_by_token(up.user, content['TOKEN'])
        if card is not None:
            card.enable()
        elif new_card:
            card_exp = "%s/%s" % (data['cc_exp_month'],
                                  data['cc_exp_year'][-2:])
            card = Card.create_with_token(user, content['TOKEN'],
                                          data['cc_number'][-4:], card_exp,
                                          data['cc_fr_name'], form.integrator)
        else:
            up.enabled_card = False
            message = 'add card error: Token %s not found' % content['TOKEN']
            up.reply_error(message)
            context = {'redirect_url': failed_url}
            return render(request, template, context)

        # Verifico si es trial y aplico descuento si corresponde
        if up.is_trial:
            trial_flag = True
            disc_flag = False
            disc_pct = 0
        else:
            trial_flag = False
            if up.has_discount:
                disc_flag = True
                disc_pct = up.disc_pct
            else:
                disc_pct = 0
                disc_flag = False

        # Genero tx id sumando al userid el timestamp
        payment_id = "PH_%s_%d" % (user.user_id, int(time()))

        # Creo el registro en PaymentHistory
        ph = PaymentHistory.create(up, payment_id, form.integrator, card,
                                   disc_pct)

        if ph.amount > 0:
            # Realizar pago
            pd_tx_endpoint = IntegratorSetting.get_var(form.integrator,
                                                       'process_tx_endpoint')
            pd_gw = PagoDigitalGateway(pd_tx_endpoint, api_key, api_secret,
                                       pd_jwt)
            try:
                pd_tx = PagoDigitalTx(int(ph.amount), card.token)
                ret, content = pd_gw.doPost(pd_tx.to_dict())
                print ret
                print content
            except Exception as e:
                message = 'Payment error: %s' % e
                up.reply_error(message)
                ph.error('', message)
                return False
        else:
            ret = True
            content = {
                'CODIGO_RESPUESTA': '-10',
                'id': '-10',
                'message': 'Pago con descuento del 100%'
            }

        if ret:
            # Obtengo los valores segun la respuesta de Pagodigital
            pr = pagodigital_translator(content)

            # Seteo los valores de la UserPayment
            up.status = pr["up_status"]
            up.message = pr["up_message"]
            up.enabled = pr["up_recurrence"]

            if up.status == 'AC':
                # calcular next_payment_day
                up.payment_date = up.calc_payment_date()
                # Fija la fecha de expiration del usuario
                user.set_expiration(up.payment_date)
                if disc_flag:
                    up.disc_counter -= 1
                if trial_flag:
                    up.trial_counter -= 1
            else:
                up.channel = 'R'
            up.save()

            # Seteo los valores del PaymentHistory
            ph.status = pr["ph_status"]
            ph.gateway_id = pr["ph_gatewayid"]
            ph.message = pr["ph_message"]
            ph.save()

            if ph.status == 'A':
                redirect_url = success_url
            else:
                redirect_url = failed_url

            if pr["user_expire"]:
                user.expire()

            # POST to promiscuus
            if ph.trial:
                ph.trial_duration = up.trial_recurrence
            else:
                ph.trial_duration = 0
            resp_promiscuus = post_to_promiscuus(ph, 'payment_commit')
            if resp_promiscuus['status'] == 'error':
                ph.message = "%s - Promiscuus error: %s" % (
                    ph.message, resp_promiscuus['message'])
                ph.save()

            context = {'redirect_url': redirect_url}
            return render(request, template, context)

        else:
            message = "could not create user payment"
            up.reply_error(message)
            ph.error('', message)

            # POST to promiscuus
            if ph.trial:
                ph.trial_duration = up.trial_recurrence
            else:
                ph.trial_duration = 0
            resp_promiscuus = post_to_promiscuus(ph, 'payment_commit')
            if resp_promiscuus['status'] == 'error':
                ph.message = "%s - Promiscuus error: %s" % (
                    ph.message, resp_promiscuus['message'])
                ph.save()

            context = {'redirect_url': failed_url}
            return render(request, template, context)

    ########  Metodo GET  ########
    elif request.method == 'GET':
        user = User.get(request.GET['user_id'])
        template = Form.get_template(user, request.GET['token'])
        baseurl = Setting.get_var('baseurl')

        if template is None:
            message = 'form not available'
            body = {'status': 'error', 'message': message}
            return HttpResponse(json.dumps(body),
                                content_type='application/json',
                                status=http_BAD_REQUEST)

        context = {
            'country': user.country.code,
            'email': user.email,
            'baseurl': baseurl
        }
        return render(request, template, context)
Example #7
0
def user_status(request, user_id):
    ret = {}
    # Verifico ApiKey
    cap = __check_apikey(request)
    if cap['status'] == 'error':
        return HttpResponse(status=http_UNAUTHORIZED)

    # Verifico que el usuario exista
    try:
        user = User.objects.get(user_id=user_id)
    except ObjectDoesNotExist:
        message = "user_id %s does not exist" % user_id
        body = {'status': 'error', 'message': message}
        return HttpResponse(json.dumps(body),
                            content_type="application/json",
                            status=http_BAD_REQUEST)

    if user.expiration is not None and user.expiration >= date.today():
        # A la expiracion le sumo un dia para evitar dejarlo sin acceso sin haber intentado cobrarle
        ret['expiration'] = mktime(user.expiration.timetuple())
    else:
        ret['expiration'] = None

    # Obtengo el UserPayment activo y si no existe devuelvo solo fecha de expiracion
    up = UserPayment.get_active(user)
    if up is None:
        up = UserPayment.get_last(user)
        if up is not None:
            ret['status_detail'] = up.status
            if up.status != 'RE':
                ret['status'] = 'E'
                body = {'status': 'success', 'value': ret}
                return HttpResponse(json.dumps(body),
                                    content_type="application/json",
                                    status=http_REQUEST_OK)
        else:
            ret['status_detail'] = 'ER'
            ret['status'] = 'E'
            body = {'status': 'success', 'value': ret}
            return HttpResponse(json.dumps(body),
                                content_type="application/json",
                                status=http_REQUEST_OK)

    ret['status'] = 'A'
    ret['message'] = ''
    ret['status_detail'] = up.status
    ret['recurrence'] = up.recurrence
    ret['payment_date'] = mktime(up.payment_date.timetuple())
    ret['currency'] = up.currency.code
    ret['amount'] = up.amount
    ret['discount'] = up.disc_pct
    ret['disc_counter'] = up.disc_counter
    ret['trial_amount'] = up.trial_amount
    ret['trial_counter'] = up.trial_counter
    ret['trial_recurrence'] = up.trial_recurrence
    ret['subscription_date'] = user.get_subscription_date()

    integrator = up.get_integrator()
    if integrator is not None:
        ret['integrator'] = integrator.name

    body = {'status': 'success', 'value': ret}
    return HttpResponse(json.dumps(body),
                        content_type="application/json",
                        status=http_REQUEST_OK)
Example #8
0
def cancel_payment(request):
    # Verifico ApiKey
    cap = __check_apikey(request)
    if cap['status'] == 'error':
        return HttpResponse(status=http_UNAUTHORIZED)

    # Cargo el json
    try:
        data = json.loads(request.body)
    except Exception:
        message = "error decoding json"
        body = {'status': 'error', 'message': message}
        return HttpResponse(json.dumps(body),
                            content_type="application/json",
                            status=http_BAD_REQUEST)

    # Verifico las key mandatorios del json
    keys = ['user_id']
    json_loader = __validate_json(data, keys)
    if json_loader['status'] == 'error':
        return HttpResponse(json.dumps(json_loader),
                            content_type="application/json",
                            status=http_BAD_REQUEST)

    # Verifico que el usuario exista
    try:
        user = User.objects.get(user_id=data['user_id'])
    except ObjectDoesNotExist:
        message = "user_id %s does not exist" % data['user_id']
        body = {'status': 'error', 'message': message}
        return HttpResponse(json.dumps(body),
                            content_type="application/json",
                            status=http_BAD_REQUEST)

    # Obtengo el UserPayment activo y si no existe devulvo error
    up = UserPayment.get_active(user=user)
    if up is None:
        up = UserPayment.get_rebill_error(user=user)
        if up is None:
            message = "user_id %s has not enabled recurring payment" % data[
                'user_id']
            body = {'status': 'error', 'message': message}
            return HttpResponse(json.dumps(body),
                                content_type="application/json",
                                status=http_BAD_REQUEST)

    # Si el integrador es CommerceGate ejecuto baja para ese integrador
    # ph = PaymentHistory.objects.filter(user_payment=up).order_by('-id')[0]
    #if ph.integrator.name == 'commerce_gate':
    if not up.internal:
        return cancel_commercegate(request)

    # Cancelo la recurrencia
    try:
        up.user_cancel()
    except:
        message = "could not disable recurring payment"
        body = {'status': 'error', 'message': message}
        return HttpResponse(json.dumps(body),
                            content_type="application/json",
                            status=http_INTERNAL_ERROR)

    # POST to promiscuus
    resp_promiscuus = post_to_promiscuus(up, 'cancel')
    if resp_promiscuus['status'] == 'error':
        up.message = "%s - Promiscuus error: %s" % (up.message,
                                                    resp_promiscuus['message'])
        up.save()

    return HttpResponse(status=http_POST_OK)
Example #9
0
def payment_discount(request):
    # Verifico ApiKey
    cap = __check_apikey(request)
    dap = __check_discount_apikey(request)
    if cap['status'] == 'error' and dap['status'] == 'error':
        return HttpResponse(status=http_UNAUTHORIZED)

    if request.method == 'POST':
        # Cargo el json
        try:
            data = json.loads(request.body)
        except Exception:
            message = "error decoding json"
            body = {'status': 'error', 'message': message}
            return HttpResponse(json.dumps(body),
                                content_type="application/json",
                                status=http_BAD_REQUEST)

        # Verifico las key mandatorios del json
        keys = ['user_id', 'discount', 'disc_counter']
        json_loader = __validate_json(data, keys)
        if json_loader['status'] == 'error':
            return HttpResponse(json.dumps(json_loader),
                                content_type="application/json",
                                status=http_BAD_REQUEST)

        user_id = data['user_id']
        discount = data['discount']
        disc_counter = data['disc_counter']
        status = http_POST_OK

    else:
        try:
            user_id = request.GET['user_id']
            discount = int(request.GET['discount'])
            disc_counter = int(request.GET['disc_counter'])
            status = http_REQUEST_OK
        except:
            message = "missing parameter"
            body = {'status': 'error', 'message': message}
            return HttpResponse(json.dumps(body),
                                content_type="application/json",
                                status=http_BAD_REQUEST)

        if discount < 1 or discount > 100 or disc_counter < 1:
            message = "invalid parameter value"
            body = {'status': 'error', 'message': message}
            return HttpResponse(json.dumps(body),
                                content_type="application/json",
                                status=http_BAD_REQUEST)

    # Verifico que el usuario exista
    try:
        user = User.objects.get(user_id=user_id)
    except ObjectDoesNotExist:
        message = "user_id %s does not exist" % user_id
        body = {'status': 'error', 'message': message}
        return HttpResponse(json.dumps(body),
                            content_type="application/json",
                            status=http_BAD_REQUEST)

    # Obtengo el UserPayment y si no existe devulvo error
    up = UserPayment.get_active(user=user)
    if up is None:
        up = UserPayment.get_rebill_error(user=user)
        if up is None:
            message = "user_id %s has not enabled recurring payment" % user_id
            body = {'status': 'error', 'message': message}
            return HttpResponse(json.dumps(body),
                                content_type="application/json",
                                status=http_BAD_REQUEST)

    # Aplico el descuento
    try:
        up.discount(discount, disc_counter)
    except:
        message = "could not apply discount"
        body = {'status': 'error', 'message': message}
        return HttpResponse(json.dumps(body),
                            content_type="application/json",
                            status=http_INTERNAL_ERROR)

    return HttpResponse(status=status)
Example #10
0
def userpayment_form_prisma_view(request):
    ########  Metodo POST  ########
    if request.method == 'POST':
        data = request.POST
        template = 'prisma/redirect.html'

        # Verifico las key mandatorias
        keys = [
            'card_number', 'card_expiration_month', 'card_expiration_year',
            'security_code', 'card_holder_name', 'card_type', 'id_type',
            'id_number', 'user_id', 'token'
        ]
        json_loader = __validate_json(data, keys)
        if json_loader['status'] == 'error':
            return HttpResponse(json.dumps(json_loader),
                                content_type='application/json',
                                status=http_BAD_REQUEST)

        # Obtengo el id de la tarjeta
        payment_method_id = get_prisma_card_id(data['card_type'])
        if payment_method_id is None:
            message = 'invalid payment method ID'
            body = {'status': 'error', 'message': message}
            return HttpResponse(json.dumps(body),
                                content_type='application/json',
                                status=http_BAD_REQUEST)

        # Obtengo el usuario y el form vinculado al token
        user = User.get(data['user_id'])
        form = Form.get(user, data['token'])
        if form is None:
            message = 'form not available'
            body = {'status': 'error', 'message': message}
            return HttpResponse(json.dumps(body),
                                content_type='application/json',
                                status=http_BAD_REQUEST)

        # Verifico que no tenga un User Payment activo
        active_up = UserPayment.get_active(user)
        if active_up is not None:
            message = 'enabled user payment already exists'
            body = {'status': 'error', 'message': message}
            return HttpResponse(json.dumps(body),
                                content_type='application/json',
                                status=http_BAD_REQUEST)

        up = form.user_payment

        # Obtengo settings del integrator
        public_apikey = IntegratorSetting.get_var(form.integrator,
                                                  'public_apikey')
        private_apikey = IntegratorSetting.get_var(form.integrator,
                                                   'private_apikey')
        success_url = IntegratorSetting.get_var(form.integrator,
                                                'redirect_url_success')
        failed_url = IntegratorSetting.get_var(form.integrator,
                                               'redirect_url_failed')
        endpoint = IntegratorSetting.get_var(form.integrator, 'endpoint')

        prisma_gw = PrismaGateway(endpoint, public_apikey, private_apikey)

        # Obtengo Token de pago
        prisma_token = PrismaPaymentToken(data['card_number'],
                                          data['card_expiration_month'],
                                          data['card_expiration_year'],
                                          data['security_code'],
                                          data['card_holder_name'],
                                          data['id_type'], data['id_number'])

        try:
            ret, content = prisma_gw.get_payment_token(
                prisma_token.serialize())  # Revisar que devuelve
            if not ret:
                up.reply_error(json.dumps(content))
                context = {'redirect_url': failed_url}
                return render(request, template, context)
            payment_token = content['id']
        except Exception as e:
            message = {
                'status': 'error',
                'message': 'get_payment_token(): %s' % e
            }
            up.reply_error(json.dumps(message))
            context = {'redirect_url': failed_url}
            return render(request, template, context)

        # Realizo primer pago para tokenizar tarjeta
        payment_id = "PH_%s_%dc" % (user.user_id, int(time()))
        cc_bin = data['card_number'][:6]
        add_card_amount = 10 * 100
        add_card_tx = PrismaTx(user.user_id, user.email, payment_id,
                               payment_token, cc_bin, add_card_amount,
                               payment_method_id)
        try:
            ret, content = prisma_gw.add_card(add_card_tx.serialize())
            if not ret:
                up.reply_error(json.dumps(content))
                context = {'redirect_url': failed_url}
                return render(request, template, context)
            card_token = content['customer_token']
            if card_token is None:
                message = 'add card error - payment(): card token is null'
                up.reply_error(message)
                context = {'redirect_url': failed_url}
                return render(request, template, context)
        except Exception as e:
            message = 'add card error - payment(): %s' % e
            up.reply_error(message)
            context = {'redirect_url': failed_url}
            return render(request, template, context)

        # Habilito tarjeta en UP
        up.enabled_card = True

        # Deshabilito cualquier tarjeta existente
        cards = Card.objects.filter(user=user, enabled=True)
        for card in cards:
            card.disable()

        # Creo la tarjeta o la obtengo si ya existe
        card = Card.get_by_token(up.user, card_token)
        if card is not None:
            card.enable()
        else:
            card_exp = "%s/%s" % (data['card_expiration_month'],
                                  data['card_expiration_month'])
            card = Card.create_with_token(user, card_token,
                                          data['card_number'][-4:], card_exp,
                                          data['card_type'], form.integrator,
                                          data['security_code'],
                                          data['card_number'][:6])

        # Verifico si es un pago futuro
        if up.payment_date > timezone.now().date():
            context = {'redirect_url': success_url}
            return render(request, template, context)

        # Verifico si es trial y aplico descuento si corresponde
        if up.is_trial:
            trial_flag = True
            disc_flag = False
            disc_pct = 0
        else:
            trial_flag = False
            if up.has_discount:
                disc_flag = True
                disc_pct = up.disc_pct
            else:
                disc_pct = 0
                disc_flag = False

        # Genero tx id sumando al userid el timestamp
        payment_id = "PH_%s_%d" % (user.user_id, int(time()))

        # Creo el registro en PaymentHistory
        ph = PaymentHistory.create(up, payment_id, form.integrator, card,
                                   disc_pct)

        if ph.amount > 0:
            # Obtengo nuevo Token de pago
            payment_data = {'token': card.token, 'security_code': card.cvv}
            try:
                ret, content = prisma_gw.get_recurrence_token(
                    payment_data)  # Revisar que devuelve
                if not ret:
                    up.reply_error(json.dumps(content))
                    context = {'redirect_url': failed_url}
                    return render(request, template, context)
                payment_token = content['id']
            except Exception as e:
                message = 'ERROR get_recurrence_token(): %s' % e
                up.reply_error(message)
                context = {'redirect_url': failed_url}
                return render(request, template, context)

            # Realizo pago
            final_amount = int(ph.amount * 100) - add_card_amount
            prisma_tx = PrismaTx(user.user_id, user.email, payment_id,
                                 payment_token, cc_bin, final_amount,
                                 payment_method_id)
            try:
                ret, content = prisma_gw.payment(prisma_tx.serialize())
                if not ret:
                    up.reply_error(json.dumps(content))
                    context = {'redirect_url': failed_url}
                    return render(request, template, context)
                card_token = content['customer_token']
            except Exception as e:
                message = 'ERROR payment(): %s' % e
                up.reply_error(message)
                ph.error('', message)
                return False
        else:
            ret = True
            content = {"status": "approved", "code": '-10'}

        if ret:
            # Obtengo los valores segun la respuesta de Prisma
            pr = prisma_translator(content)

            # Seteo los valores de la UserPayment
            up.status = pr["up_status"]
            up.message = pr["up_message"]
            up.enabled = pr["up_recurrence"]

            if up.status == 'AC':
                # calcular next_payment_day
                up.payment_date = up.calc_payment_date()
                # Fija la fecha de expiration del usuario
                user.set_expiration(up.payment_date)
                if disc_flag:
                    up.disc_counter -= 1
                if trial_flag:
                    up.trial_counter -= 1
            else:
                up.channel = 'R'
            up.save()

            # Seteo los valores del PaymentHistory
            ph.status = pr["ph_status"]
            ph.gateway_id = pr["ph_gatewayid"]
            ph.message = pr["ph_message"]
            ph.save()

            if ph.status == 'A':
                redirect_url = success_url
            else:
                redirect_url = failed_url

            if pr["user_expire"]:
                user.expire()

            # POST to promiscuus
            if ph.trial:
                ph.trial_duration = up.trial_recurrence
            else:
                ph.trial_duration = 0
            resp_promiscuus = post_to_promiscuus(ph, 'payment_commit')
            if resp_promiscuus['status'] == 'error':
                ph.message = "%s - Promiscuus error: %s" % (
                    ph.message, resp_promiscuus['message'])
                ph.save()

            context = {'redirect_url': redirect_url}
            return render(request, template, context)

        else:
            message = json.dumps(content)
            up.reply_error(message)
            ph.error('', message)

            # POST to promiscuus
            if ph.trial:
                ph.trial_duration = up.trial_recurrence
            else:
                ph.trial_duration = 0
            resp_promiscuus = post_to_promiscuus(ph, 'payment_commit')
            if resp_promiscuus['status'] == 'error':
                ph.message = "%s - Promiscuus error: %s" % (
                    ph.message, resp_promiscuus['message'])
                ph.save()

            context = {'redirect_url': failed_url}
            return render(request, template, context)

    ########  Metodo GET  ########
    elif request.method == 'GET':
        user = User.get(request.GET['user_id'])
        template = Form.get_template(user, request.GET['token'])
        baseurl = Setting.get_var('baseurl')

        if template is None:
            message = 'form not available'
            body = {'status': 'error', 'message': message}
            return HttpResponse(json.dumps(body),
                                content_type='application/json',
                                status=http_BAD_REQUEST)

        context = {
            'country': user.country.code,
            'email': user.email,
            'baseurl': baseurl
        }
        return render(request, template, context)