def deleteuserpayment(request): if request.is_ajax(): if request.method == 'POST': txtmessage = '' try: json_data = json.loads(request.body) if json_data['txtmessage']: txtmessage = json_data['txtmessage'] userpayment_id = json_data['userpayment_id'] registro = UserPayment.objects.get( user_payment_id=userpayment_id) registro.message = txtmessage registro.enabled = False registro.status = 'CA' registro.channel = 'X' registro.save() # Envio envento a intercom ep = Setting.get_var('intercom_endpoint') token = Setting.get_var('intercom_token') try: intercom = Intercom(ep, token) reply = intercom.submitEvent( registro.user.user_id, registro.user.email, "cancelled-sub", { "event_description": "recurrencia cancelada por el administrador" }) if not reply: registro.message = "Intercom error: cannot post the event" registro.save() except Exception as e: registro.message = "Intercom error: %s" % str(e) registro.save() return JsonResponse({'message': 'activado correctamente'}, status=200) except Exception as e: return JsonResponse( { 'message': 'Hubo un error', 'data': e.message }, status=500) return JsonResponse({ 'message': 'Metodo no permitido', 'data': '' }, status=500)
def expireuser(request): if request.is_ajax(): if request.method == 'GET': fecha = datetime.today() if request.method == 'POST': try: json_data = json.loads(request.body) user_id = json_data['user_id'] user = User.objects.get(user_id=user_id) fecha = datetime.today() d = timedelta(days=1) fecha -= d user.expiration = fecha user.save() # Envio envento a intercom ep = Setting.get_var('intercom_endpoint') token = Setting.get_var('intercom_token') try: intercom = Intercom(ep, token) metadata = { "event_description": "usuario expirado por el administrador", "expire_at": str(int(mktime(user.expiration.timetuple()))) } reply = intercom.submitEvent(user.user_id, user.email, "user_expired", metadata) except Exception as e: pass return JsonResponse( { 'message': 'Guardado correctamente', 'data': fecha }, status=200) except Exception as e: return JsonResponse( { 'message': 'Hubo un error', 'data': e.message }, status=500) return JsonResponse({ 'message': 'Metodo no permitido', 'data': '' }, status=500)
def __check_apikey(request): if 'HTTP_X_AUTH_CCM_KEY' in request.META: if request.META['HTTP_X_AUTH_CCM_KEY'] == Setting.get_var('ma_apikey'): return {'status': 'success'} else: return {'status': 'error'} else: return {'status': 'error'}
def manual_payment(request): if request.is_ajax(): if request.method == 'POST': try: json_data = json.loads(request.body) userpayment_id = json_data['userpayment_id'] up = UserPayment.get_by_id(userpayment_id) if up is None: return JsonResponse( { 'message': 'Error al realizar el pago, el usuario no existe' }, status=500) if up.user.has_active_recurrence(): return JsonResponse( { 'message': 'Error al realizar el pago: el usuario ya posee una recurrencia activa' }, status=500) logging.basicConfig( format= '%(asctime)s - manual_payments -[%(levelname)s]: %(message)s', filename=Setting.get_var('log_path'), level=logging.INFO) # Cambio a estado Pending up.status = 'PE' up.save() # Obtengo la tarjeta habilitada para el usuario card = up.user.get_card() if card is None: msg = 'Error al obtener la tarjeta para el usuario' up.error(msg) return JsonResponse({'message': msg}, status=500) pay = make_payment(up, card, logging, True) if pay: return JsonResponse( {'message': 'Pago efectuado correctamente'}, status=200) else: return JsonResponse( { 'message': 'Error al realizar el pago: verificar PaymentHistory' }, status=500) except Exception: return JsonResponse({'message': 'Hubo un error'}, status=500) return JsonResponse({'message': 'metodo no permitido'}, status=500)
def deleteuserpayment(request): if request.is_ajax(): if request.method == 'POST': try: json_data = json.loads(request.body) userpayment_id = json_data['userpayment_id'] registro = UserPayment.objects.get( user_payment_id=userpayment_id) if json_data['txtmessage'] != '': registro.message = json_data['txtmessage'] # Envio cancelacion a CommerceGate integrator = Integrator.objects.get( country=registro.user.country, enabled=True) if integrator.name == 'commerce_gate': registro.channel = 'X' registro.save() baseurl = Setting.get_var('baseurl') url = "%sapi/v1/commercegate/set/cancel" % baseurl user_id = {'user_id': registro.user.user_id} data = json.dumps(user_id) resp, content = Http().request( url, 'POST', body=data, headers={'content-type': 'application/json'}) else: registro.channel = 'X' registro.enabled = False registro.status = 'CA' registro.save() # POST to promiscuus resp_promiscuus = post_to_promiscuus(registro, 'cancel') if resp_promiscuus['status'] == 'error': registro.message = "%s - Promiscuus error: %s" % ( up.message, resp_promiscuus['message']) registro.save() return JsonResponse({'message': 'activado correctamente'}, status=200) except Exception as e: return JsonResponse( { 'message': 'Hubo un error', 'data': e.message }, status=500) return JsonResponse({ 'message': 'Metodo no permitido', 'data': '' }, status=500)
def activateuser(request): if request.is_ajax(): if request.method == 'POST': try: json_data = json.loads(request.body) user_id = json_data['user_id'] days = json_data['days'] user = User.objects.get(user_id=user_id) # Sumar la cantidad de dias a hoy date = user.enable_for(days) # Envio evento a intercom ep = Setting.get_var('intercom_endpoint') token = Setting.get_var('intercom_token') try: intercom = Intercom(ep, token) metadata = { 'event_description': 'usuario activado por el administrador', 'expire_at': str(int(mktime(date.timetuple()))) } reply = intercom.submitEvent(user.user_id, user.email, 'user_activated', metadata) except Exception as e: pass return JsonResponse({'message': 'activado correctamente'}, status=200) except Exception as e: return JsonResponse( { 'message': 'Hubo un error', 'data': e.message }, status=500) return JsonResponse({ 'message': 'Metodo no permitido', 'data': '' }, status=500)
def filter_recurrence(request): data = [] prices = Setting.get_var('packages_recurrence').split(",") for price in prices: data.append({'key': price, 'value': price}) body = {'status': 'success', 'data': data} return HttpResponse(json.dumps(body, cls=DjangoJSONEncoder), content_type='application/json', status=http_REQUEST_OK)
def __callback_paymentez_proc(data, country): # Verifico el stoken if not __validate_stoken(data, country): body = {"status": "error", "message": "not authorized"} return HttpResponse(json.dumps(body), content_type="application/json", status=200) # Obtengo los valores segun la respuesta de Paymentez pr = paymentez_translator(data) # Obtengo el PaymentHistory con el dev_reference informado try: ph = PaymentHistory.objects.get( payment_id=data["transaction"]["dev_reference"]) except ObjectDoesNotExist: body = {"status": "error", "message": "invalid dev_refence"} return HttpResponse(json.dumps(body), content_type="application/json", status=200) # Verifico que este en Waiting Callback if ph.status == 'W' or (ph.status == 'A' and pr["ph_status"] == 'C'): # Seteo los valores de la UserPayment ph.user_payment.status = pr["up_status"] ph.user_payment.message = pr["up_message"] ph.user_payment.enabled = pr["up_recurrence"] if ph.user_payment.status == 'AC': # calcular next_payment_day ph.user_payment.payment_date = ph.user_payment.calc_payment_date() # Fija la fecha de expiration del usuario ph.user_payment.user.set_expiration(ph.user_payment.payment_date) if ph.user_payment.disc_counter > 0: ph.user_payment.disc_counter = ph.user_payment.disc_counter - 1 else: ph.user_payment.channel = 'C' ph.user_payment.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 pr["user_expire"]: ph.user_payment.user.expire() if pr["intercom"]["action"]: ep = Setting.get_var('intercom_endpoint') token = Setting.get_var('intercom_token') try: intercom = Intercom(ep, token) reply = intercom.submitEvent( ph.user_payment.user.user_id, ph.user_payment.user.email, pr["intercom"]["event"], paymentez_intercom_metadata(data['transaction'])) if not reply: ph.message = "%s - Intercom error: cannot post the event" % ( ph.message) ph.save() except Exception as e: ph.message = "%s - Intercom error: %s" % (ph.message, str(e)) ph.save() else: body = { "status": "error", "message": "ignoring callback: PH status %s" % ph.status } return HttpResponse(json.dumps(body), content_type="application/json", status=200) body = {'status': 'success', 'message': ''} return HttpResponse(json.dumps(body), content_type="application/json", status=200)
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)
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)
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)
def payment_error(request): template = 'error/paymenterror.html' base_url = Setting.get_var('ma_base_url') url = "%sprofile" % base_url context = {'redirect_url': url} return render(request, template, context)
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)