示例#1
0
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,
        })
示例#2
0
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,
        })