def add_card_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) # Obtengo settings del integrator api_key = IntegratorSetting.get_var(form.integrator, 'api_key') api_secret = IntegratorSetting.get_var(form.integrator, 'api_secret') redirect_url = IntegratorSetting.get_var(form.integrator, 'redirect_url_add_card') 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: context = {'redirect_url': redirect_url} return render(request, template, context) if not 'TOKEN' in content: context = {'redirect_url': redirect_url} return render(request, template, context) pd_jwt = content['TOKEN'] except Exception as e: context = {'redirect_url': redirect_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']) try: ret, content = pd_gw.doPost(pd_card.to_dict()) if not ret: context = {'redirect_url': redirect_url} return render(request, template, context) if 'CODIGO_RESPUESTA' in content: if str(content['CODIGO_RESPUESTA']) not in SUCCESS_CODES: context = {'redirect_url': redirect_url} return render(request, template, context) else: context = {'redirect_url': redirect_url} return render(request, template, context) except Exception as e: context = {'redirect_url': redirect_url} return render(request, template, context) # 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(user, content['TOKEN']) if card is not None: card.enable() else: 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) context = {'redirect_url': redirect_url} return render(request, template, context)
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 change_token_card(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', 'token', 'card_number', 'card_type', 'integrator'] 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) # Verifico que el integrador exista try: integrator = Integrator.objects.get(name=data['integrator'], country=user.country) except ObjectDoesNotExist: message = "integrator %s does not exist" % data['integrator'] body = {'status': 'error', 'message': message} return HttpResponse(json.dumps(body), content_type="application/json", status=http_BAD_REQUEST) # Desabilito cualquier otra tarjeta del usuario cards = Card.objects.filter(user=user, enabled=True) for card in cards: card.disable() # Verifico si la tarjeta ya fue cargada y la habilito. card = __get_card(user, data['token']) if card is not None: card.enable() else: # Creo la nueva tarjeta try: card = Card.create_with_token(user, data['token'], data['card_number'], data['card_exp'], data['card_type'], integrator) except Exception: message = "new card could not be created" body = {'status': 'error', 'message': message} return HttpResponse(json.dumps(body), content_type="application/json", status=http_INTERNAL_ERROR) return HttpResponse(status=http_POST_OK)
def create_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) print "CONTENT MA: %s" % data except Exception: user_message = "Ocurrió un error con el pago, por favor reintente nuevamente más tarde" message = "error decoding json" body = { 'status': 'error', 'message': message, "user_message": user_message } return HttpResponse(json.dumps(body), content_type="application/json", status=http_BAD_REQUEST) # Verifico las key mandatorios del json keys = [ 'user_id', 'email', 'country', 'token', 'card_number', 'card_exp', 'card_type', 'integrator', 'amount', 'currency', 'payment_date', 'recurrence' ] json_loader = __validate_json(data, keys) if json_loader['status'] == 'error': json_loader[ 'user_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) # Verifico que la currency exista try: currency = Currency.objects.get(code=data['currency'].lower()) except ObjectDoesNotExist: user_message = "Ocurrió un error con el pago, por favor reintente nuevamente más tarde" message = "currency %s does not exist" % data['currency'] body = { 'status': 'error', 'message': message, 'user_message': user_message } return HttpResponse(json.dumps(body), content_type="application/json", status=http_BAD_REQUEST) # Verifico que el pais exista try: country = Country.objects.get(code=data['country'].lower()) except ObjectDoesNotExist: user_message = "Ocurrió un error con el pago, por favor reintente nuevamente más tarde" message = "country %s does not exist" % data['country'] body = { 'status': 'error', 'message': message, 'user_message': user_message } return HttpResponse(json.dumps(body), content_type="application/json", status=http_BAD_REQUEST) # Verifico que el integrador exista try: integrator = Integrator.objects.get(name=data['integrator'], country=country) except ObjectDoesNotExist: user_message = "Ocurrió un error con el pago, por favor reintente nuevamente más tarde" message = "integrator %s does not exist for country %s" % ( data['integrator'], country.name) body = { 'status': 'error', 'message': message, 'user_message': user_message } return HttpResponse(json.dumps(body), 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'], country) # Si tiene algun UserPayment habilitado devuelvo un error if UserPayment.objects.filter(user=user, enabled=True).exists(): user_message = "Ocurrió un error con el pago, por favor reintente nuevamente más tarde" message = "enabled user payment already exists" body = { 'status': 'error', 'message': message, 'user_message': user_message } return HttpResponse(json.dumps(body), content_type="application/json", status=http_BAD_REQUEST) # Desabilito cualquier otra tarjeta del usuario cards = Card.objects.filter(user=user, enabled=True) for card in cards: card.disable() # Creo la tarjeta si no existe con el metodo del integrador if integrator.method == 'TO': card = __get_card(user, data['token']) if card is not None: card.enable() else: # Creo la nueva tarjeta try: card = Card.create_with_token(user, data['token'], data['card_number'], data['card_exp'], data['card_type'], integrator) except Exception: user_message = "Ocurrió un error con el pago, por favor reintente nuevamente más tarde" message = "new card could not be created" body = { 'status': 'error', 'message': message, 'user_message': user_message } return HttpResponse(json.dumps(body), content_type="application/json", status=http_INTERNAL_ERROR) else: user_message = "Ocurrió un error con el pago, por favor reintente nuevamente más tarde" message = "integrator %s unknown" % integrator.method body = { 'status': 'error', 'message': message, 'user_message': user_message } return HttpResponse(json.dumps(body), content_type="application/json", status=http_INTERNAL_ERROR) # 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: user_message = "Ocurrió un error con el pago, por favor reintente nuevamente más tarde" message = "error getting package for %s_%s with id %d" % ( integrator.name, country.code, int(data['recurrence'])) body = { 'status': 'error', 'message': message, 'user_message': user_message } return HttpResponse(json.dumps(body), content_type="application/json", status=http_BAD_REQUEST) # Creo un nuevo pago recurrente try: if 'discount' in data and 'disc_counter' in data: up = UserPayment.create_from_package(user, package, data['payment_date'], data['discount'], data['disc_counter'], True) else: up = UserPayment.create_from_package(user, package, data['payment_date'], 0, 0, True) except Exception as e: user_message = "Ocurrió un error con el pago, por favor reintente nuevamente más tarde" message = "could not create user payment: (%s)" % str(e) body = { 'status': 'error', 'message': message, 'user_message': user_message } return HttpResponse(json.dumps(body), content_type="application/json", status=http_INTERNAL_ERROR) # Realizar el pago if data['payment_date'] == 0 or data['payment_date'] == '0' or data[ 'payment_date'] == 0.0: if integrator.name == 'paymentez': try: gw = PaymentezGateway( IntegratorSetting.get_var( integrator, 'paymentez_server_application_code'), IntegratorSetting.get_var(integrator, 'paymentez_server_app_key'), IntegratorSetting.get_var(integrator, 'paymentez_endpoint')) except Exception as e: user_message = "Ocurrió un error con el pago, por favor reintente nuevamente más tarde" message = "could not create user payment: (%s)" % str(e) body = { 'status': 'error', 'message': message, 'user_message': user_message } return HttpResponse(json.dumps(body), content_type="application/json", status=http_INTERNAL_ERROR) # 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, integrator, card, disc_pct) if ph.amount > 0: try: ret, content = gw.doPost( PaymentezTx(user.user_id, user.email, ph.amount, 'HotGo', ph.payment_id, ph.taxable_amount, ph.vat_amount, card.token)) print "CONTENT: %s" % str(content) except Exception: # Pongo el pago en Waiting Callback ph.status = "W" ph.save() user_message = "Ocurrió un error en la comunicación. Recibirás un correo electrónico en breve con " \ "los detalles de tu transacción. Por cualquier duda, contáctate con [email protected]" message = "communication error with paymentez, waiting callback" body = { 'status': 'error', 'message': message, 'user_message': user_message } return HttpResponse(json.dumps(body), content_type="application/json", status=http_PAYMENT_REQUIRED) else: ret = True content = { 'transaction': { 'status_detail': '-10', 'id': '-10', 'message': 'Pago con descuento del 100%' } } pr = paymentez_translator(content) if ret: # Obtengo los valores segun la respuesta de Paymentez pr = paymentez_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': rep_status = "success" else: rep_status = "error" 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() body = { 'status': rep_status, 'message': '', 'user_message': pr['user_message'] } return HttpResponse(json.dumps(body), content_type="application/json", status=http_POST_OK) else: message = 'type: %s, help: %s, description: %s' % ( content['error']['type'], content['error']['help'], content['error']['description']) up.reply_error(message) ph.error('', content) user_message = "Ocurrió un error con el pago, por favor reintente nuevamente más tarde" # 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() body = { 'status': 'error', 'message': message, 'user_message': user_message } return HttpResponse(json.dumps(body), content_type="application/json", status=http_UNPROCESSABLE_ENTITY) else: user_message = "Ocurrió un error con el pago, por favor reintente nuevamente más tarde" message = "could not create user payment: (Unknown Integrator: %s)" % str( integrator.name) body = { 'status': 'error', 'message': message, 'user_message': user_message } return HttpResponse(json.dumps(body), content_type="application/json", status=http_INTERNAL_ERROR) user_message = "Suscripción exitosa" body = {'status': 'success', 'message': '', 'user_message': user_message} return HttpResponse(json.dumps(body), content_type="application/json", status=http_POST_OK)
def add_card_form_prisma(request): 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', '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: context = {'redirect_url': redirect_url} return render(request, template, context) # 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: context = {'redirect_url': redirect_url} return render(request, template, context) # 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 try: ret, content = prisma_gw.get_payment_token( data) # Revisar que devuelve if not ret: context = {'redirect_url': redirect_url} return render(request, template, context) payment_token = content['id'] except Exception as e: context = {'redirect_url': redirect_url} return render(request, template, context) # Realizo pago para tokenizar tarjeta payment_id = "PH_%s_card_%d" % (user.user_id, int(time())) cc_bin = data['card_number'][:6] add_card_tx = PrismaTx(user.user_id, user.email, payment_id, payment_token, cc_bin, 1, payment_method_id) try: ret, content = prisma_gw.payment(add_card_tx.serialize()) if not ret: context = {'redirect_url': redirect_url} return render(request, template, context) card_token = content['customer_token'] except Exception as e: context = {'redirect_url': redirect_url} return render(request, template, context) # 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(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_brand'], form.integrator, data['security_code']) context = {'redirect_url': redirect_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)