def registration_payment(request): max_ticket_limit = settings.MAX_TICKET_NUM if not is_registration_time(): return redirect("registration_info") if request.method == "GET": product = Product() registered = Registration.objects.filter(user=request.user, payment_status__in=["paid", "ready"]).exists() if registered: return redirect("registration_status") uid = str(uuid4()).replace("-", "") form = RegistrationForm(initial={"email": request.user.email}) return render( request, "pyconkr/registration/payment.html", { "title": _("Registration"), "IMP_USER_CODE": settings.IMP_USER_CODE, # TODO : Move to 'settings context processor' "form": form, "uid": uid, "product_name": product.name, "amount": product.price, "vat": 0, }, ) elif request.method == "POST": payment_logger.debug(request.POST) form = RegistrationForm(request.POST) # TODO : more form validation # eg) merchant_uid if not form.is_valid(): form_errors_string = "\n".join(("%s:%s" % (k, v[0]) for k, v in form.errors.items())) return render_json({"success": False, "message": form_errors_string}) # TODO : ... remain_ticket_count = ( settings.MAX_TICKET_NUM - Registration.objects.filter(payment_status__in=["paid", "ready"]).count() ) # sold out if remain_ticket_count <= 0: return render_json({"success": False, "message": u"티켓이 매진 되었습니다"}) registration, created = Registration.objects.get_or_create(user=request.user) registration.name = form.cleaned_data.get("name") registration.email = request.user.email registration.company = form.cleaned_data.get("company", "") registration.phone_number = form.cleaned_data.get("phone_number", "") registration.merchant_uid = request.POST.get("merchant_uid") registration.save() # TODO : use form.save() try: product = Product() access_token = get_access_token(settings.IMP_API_KEY, settings.IMP_API_SECRET) imp_client = Iamporter(access_token) if request.POST.get("payment_method") == "card": # TODO : use validated and cleaned data imp_client.onetime( token=request.POST.get("token"), merchant_uid=request.POST.get("merchant_uid"), amount=request.POST.get("amount"), # vat=request.POST.get('vat'), card_number=request.POST.get("card_number"), expiry=request.POST.get("expiry"), birth=request.POST.get("birth"), pwd_2digit=request.POST.get("pwd_2digit"), customer_uid=form.cleaned_data.get("email"), ) confirm = imp_client.find_by_merchant_uid(request.POST.get("merchant_uid")) if confirm["amount"] != product.price: # TODO : cancel return render_io_error("amount is not same as product.price. it will be canceled") registration.payment_method = confirm.get("pay_method") registration.payment_status = confirm.get("status") registration.payment_message = confirm.get("fail_reason") registration.vbank_name = confirm.get("vbank_name", None) registration.vbank_num = confirm.get("vbank_num", None) registration.vbank_date = confirm.get("vbank_date", None) registration.vbank_holder = confirm.get("vbank_holder", None) registration.save() send_email_ticket_confirm(request, registration) except IamporterError as e: # TODO : other status code return render_json({"success": False, "code": e.code, "message": e.message}) else: return render_json({"success": True})
def payment_process(request): if request.method == 'GET': return redirect('registration_index') payment_logger.debug(request.POST) form = RegistrationAdditionalPriceForm(request.POST) # TODO : more form validation # eg) merchant_uid if not form.is_valid(): form_errors_string = "\n".join(('%s:%s' % (k, v[0]) for k, v in form.errors.items())) return JsonResponse({ 'success': False, 'message': form_errors_string, # TODO : ... }) remain_ticket_count = (config.TOTAL_TICKET - Registration.objects.filter(payment_status__in=['paid', 'ready']).count()) # sold out if remain_ticket_count <= 0: return JsonResponse({ 'success': False, 'message': u'티켓이 매진 되었습니다', }) registration, _ = Registration.objects.get_or_create(user=request.user) registration.name = form.cleaned_data.get('name') registration.email = request.user.email registration.additional_price = form.cleaned_data.get('additional_price', 0) registration.company = form.cleaned_data.get('company', '') registration.phone_number = form.cleaned_data.get('phone_number', '') registration.merchant_uid = request.POST.get('merchant_uid') registration.option = form.cleaned_data.get('option') registration.save() # TODO : use form.save() try: product = registration.option access_token = get_access_token(config.IMP_API_KEY, config.IMP_API_SECRET) imp_client = Iamporter(access_token) if request.POST.get('payment_method') == 'card': # TODO : use validated and cleaned data imp_client.onetime( token=request.POST.get('token'), merchant_uid=request.POST.get('merchant_uid'), amount=product.price + registration.additional_price, card_number=request.POST.get('card_number'), expiry=request.POST.get('expiry'), birth=request.POST.get('birth'), pwd_2digit=request.POST.get('pwd_2digit'), customer_uid=form.cleaned_data.get('email'), ) confirm = imp_client.find_by_merchant_uid(request.POST.get('merchant_uid')) if confirm['amount'] != product.price + registration.additional_price: # TODO : cancel return render_io_error("amount is not same as product.price. it will be canceled") registration.payment_method = confirm.get('pay_method') registration.payment_status = confirm.get('status') registration.payment_message = confirm.get('fail_reason') registration.vbank_name = confirm.get('vbank_name', None) registration.vbank_num = confirm.get('vbank_num', None) registration.vbank_date = confirm.get('vbank_date', None) registration.vbank_holder = confirm.get('vbank_holder', None) registration.save() if not settings.DEBUG: send_email_ticket_confirm(request, registration) except IamporterError as e: # TODO : other status code return JsonResponse({ 'success': False, 'code': e.code, 'message': e.message, }) else: return JsonResponse({ 'success': True, })
def registration_payment(request): max_ticket_limit = settings.MAX_TICKET_NUM if not is_registration_time(): return redirect('registration_info') if request.method == 'GET': product = Product() registered = Registration.objects.filter( user=request.user, payment_status__in=['paid', 'ready']).exists() if registered: return redirect('registration_status') uid = str(uuid4()).replace('-', '') form = RegistrationForm(initial={'email': request.user.email}) return render( request, 'pyconkr/registration/payment.html', { 'title': _('Registration'), 'IMP_USER_CODE': settings. IMP_USER_CODE, # TODO : Move to 'settings context processor' 'form': form, 'uid': uid, 'product_name': product.name, 'amount': product.price, 'vat': 0, }) elif request.method == 'POST': payment_logger.debug(request.POST) form = RegistrationForm(request.POST) # TODO : more form validation # eg) merchant_uid if not form.is_valid(): form_errors_string = "\n".join( ('%s:%s' % (k, v[0]) for k, v in form.errors.items())) return render_json({ 'success': False, 'message': form_errors_string, # TODO : ... }) remain_ticket_count = ( settings.MAX_TICKET_NUM - Registration.objects.filter( payment_status__in=['paid', 'ready']).count()) # sold out if remain_ticket_count <= 0: return render_json({ 'success': False, 'message': u'티켓이 매진 되었습니다', }) registration, created = Registration.objects.get_or_create( user=request.user) registration.name = form.cleaned_data.get('name') registration.email = request.user.email registration.company = form.cleaned_data.get('company', '') registration.phone_number = form.cleaned_data.get('phone_number', '') registration.merchant_uid = request.POST.get('merchant_uid') registration.save() # TODO : use form.save() try: product = Product() access_token = get_access_token(settings.IMP_API_KEY, settings.IMP_API_SECRET) imp_client = Iamporter(access_token) if request.POST.get('payment_method') == 'card': # TODO : use validated and cleaned data imp_client.onetime( token=request.POST.get('token'), merchant_uid=request.POST.get('merchant_uid'), amount=request.POST.get('amount'), # vat=request.POST.get('vat'), card_number=request.POST.get('card_number'), expiry=request.POST.get('expiry'), birth=request.POST.get('birth'), pwd_2digit=request.POST.get('pwd_2digit'), customer_uid=form.cleaned_data.get('email'), ) confirm = imp_client.find_by_merchant_uid( request.POST.get('merchant_uid')) if confirm['amount'] != product.price: # TODO : cancel return render_io_error( "amount is not same as product.price. it will be canceled") registration.payment_method = confirm.get('pay_method') registration.payment_status = confirm.get('status') registration.payment_message = confirm.get('fail_reason') registration.vbank_name = confirm.get('vbank_name', None) registration.vbank_num = confirm.get('vbank_num', None) registration.vbank_date = confirm.get('vbank_date', None) registration.vbank_holder = confirm.get('vbank_holder', None) registration.save() send_email_ticket_confirm(request, registration) except IamporterError as e: # TODO : other status code return render_json({ 'success': False, 'code': e.code, 'message': e.message, }) else: return render_json({ 'success': True, })