Exemple #1
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)
Exemple #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)