def payment_process(request): if request.method == 'GET': return redirect('registration_index') # alreay registered if Registration.objects.filter(user=request.user, payment_status__in=['paid','ready']).exists(): return redirect('registration_status') 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'티켓이 매진 되었습니다', }) if form.cleaned_data.get('additional_price', 0) < 0: return JsonResponse({ 'success': False, 'message': u'후원 금액은 0원 이상이어야 합니다.', }) registration = Registration( user=request.user, name = form.cleaned_data.get('name'), email = request.user.email, additional_price = form.cleaned_data.get('additional_price', 0), company = form.cleaned_data.get('company', ''), phone_number = form.cleaned_data.get('phone_number', ''), merchant_uid = request.POST.get('merchant_uid'), option = form.cleaned_data.get('option'), payment_method = form.cleaned_data.get('payment_method') ) # sold out if registration.option.is_soldout: return JsonResponse({ 'success': False, 'message': u'{name} 티켓이 매진 되었습니다'.format(name=registration.option.name), }) try: product = registration.option access_token = get_access_token(config.IMP_API_KEY, config.IMP_API_SECRET) imp_client = Iamporter(access_token) if registration.payment_method == 'card': # TODO : use validated and cleaned data imp_params = dict( 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'), name=product.name ) if request.POST.get('birth') == '': # foreign payment imp_client.foreign(**imp_params) else: imp_client.foreign(**imp_params) # imp_client.onetime(**imp_params) 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.transaction_code = confirm.get('pg_tid') 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() elif registration.payment_method == 'bank': registration.payment_status = 'ready' registration.save() else: raise Exception('Unknown payment method') # 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 payment_process(request): if request.method == 'GET': return redirect('registration_index') # alreay registered if Registration.objects.filter(user=request.user, payment_status__in=['paid','ready']).exists(): return redirect('registration_status') 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'티켓이 매진 되었습니다', }) if form.cleaned_data.get('additional_price', 0) < 0: return JsonResponse({ 'success': False, 'message': u'후원 금액은 0원 이상이어야 합니다.', }) registration = Registration( user=request.user, name = form.cleaned_data.get('name'), email = request.user.email, additional_price = form.cleaned_data.get('additional_price', 0), company = form.cleaned_data.get('company', ''), phone_number = form.cleaned_data.get('phone_number', ''), merchant_uid = request.POST.get('merchant_uid'), option = form.cleaned_data.get('option'), payment_method = form.cleaned_data.get('payment_method') ) # sold out if registration.option.is_soldout: return JsonResponse({ 'success': False, 'message': u'{name} 티켓이 매진 되었습니다'.format(name=registration.option.name), }) try: product = registration.option if registration.payment_method == 'card': access_token = get_access_token(config.IMP_API_KEY, config.IMP_API_SECRET) imp_client = Iamporter(access_token) # TODO : use validated and cleaned data imp_params = dict( 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'), name=product.name, buyer_name=request.POST.get('name'), buyer_email=request.POST.get('email'), buyer_tel=request.POST.get('phone_number') ) if request.POST.get('birth') == '': # foreign payment imp_client.foreign(**imp_params) else: imp_client.foreign(**imp_params) # imp_client.onetime(**imp_params) 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.transaction_code = confirm.get('pg_tid') 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() elif registration.payment_method == 'bank': registration.transaction_code = request.POST.get('pg_tid') registration.payment_method = request.POST.get('pay_method') registration.payment_status = request.POST.get('status') registration.payment_message = request.POST.get('fail_reason') registration.vbank_name = request.POST.get('vbank_name', None) registration.vbank_num = request.POST.get('vbank_num', None) registration.vbank_date = request.POST.get('vbank_date', None) registration.vbank_holder = request.POST.get('vbank_holder', None) registration.save() else: raise Exception('Unknown payment method') # 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, })