Exemplo n.º 1
0
def payment(request):
    cart = Cart(request)
    product_price = 10000
    imp_key = '3573147061630950'
    imp_secret = 'FeUZatDu2pPcSBhuMXPRVmXFwjmamVW1aR1kkFOm4EyXfQr1NhTJDQpa9LlvHhxR8zcse1PjFogVeIX2'


    # 객체 만들기
    iamport = Iamport(imp_key=imp_key, imp_secret=imp_secret)
    # 테스트용 키와 시크릿은 tests/conftest.py 파일에 DEFAULT_TEST_IMP_KEY, DEFAULT_TEST_IMP_SECRET를 참고하세요.
    # 객체 만들기
    iamport = Iamport(imp_key=imp_key, imp_secret=imp_secret)

    # 테스트용 값
    payload = {
        'merchant_uid': str(datetime.now) + '00000000',
        'amount': 10000,
        'card_number': '4092-0230-1234-1234',
        'expiry': '2019-03',
        'birth': '500203',
        'pwd_2digit': '19'
    }

    try:
        response = iamport.pay_onetime(**payload)
    except KeyError:
        # 필수 값이 없을때 에러 처리
        pass
    except Iamport.ResponseError as e:
        # 응답 에러 처리
        pass
    except Iamport.HttpError as http_error:
        # HTTP not 200 응답 에러 처리
        pass
    return response
Exemplo n.º 2
0
def _payment_process_for_domestic(**payload):
    """Process payment via Iamport PG service
    For domestic, ['merchant_uid', 'amount', 'card_number', 'expiry', 'birth', 'pwd_2digit']"""
    iamport = Iamport(config.IAMPORT_API_KEY_FOR_DOMESTIC,
                      config.IAMPORT_API_SECRET_FOR_DOMESTIC)

    try:
        result = iamport.pay_onetime(**payload)
        return True, result,
    except Exception as exception:
        return _process_exception(exception)
Exemplo n.º 3
0
def payment_process(request):
    # 비정상적 접근으로 등록 메인 페이지로 이동합니다.
    if request.method == 'GET':
        return redirect('registration_index')

    # 이미 등록된 사용자로 등록 현황 페이지로 이동합니다.
    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,
        })

    remain_ticket_count = (config.TOTAL_TICKET - Registration.objects.filter(
        payment_status__in=['paid', 'ready']).count())

    # 매진 상태
    if remain_ticket_count <= 0:
        return JsonResponse({
            'success': False,
            'message': '티켓이 매진 되었습니다',
        })

    # 후원 추가 금액이 0원 미만일 때
    if form.cleaned_data.get('additional_price', 0) < 0:
        return JsonResponse({
            'success': False,
            'message': u'후원 금액은 0원 이상이어야 합니다.',
        })

    cleaned_form = form.cleaned_data

    registration = Registration(
        user=request.user,
        email=request.user.email,
        merchant_uid=request.POST.get('merchant_uid'),
        name=cleaned_form.get('name'),
        additional_price=cleaned_form.get('additional_price', 0),
        company=cleaned_form.get('company', ''),
        top_size=cleaned_form.get('top_size', ''),
        phone_number=cleaned_form.get('phone_number', ''),
        option=cleaned_form.get('option'),
        payment_method=cleaned_form.get('payment_method'))

    # 다시 한 번 매진 확인
    if registration.option.is_sold_out:
        return JsonResponse({
            'success':
            False,
            'message':
            '{name} 티켓이 매진 되었습니다'.format(name=registration.option.name),
        })

    try:
        product = registration.option
        post_data = request.POST

        # 한국인용 카드 결제일 때
        if registration.payment_method == 'card-korean':
            iamport = Iamport(config.IMP_DOM_API_KEY,
                              config.IMP_DOM_API_SECRET)

            # TODO : use validated and cleaned data
            iamport_params = dict(name=product.name,
                                  amount=product.price +
                                  registration.additional_price,
                                  token=post_data.get('token'),
                                  merchant_uid=post_data.get('merchant_uid'),
                                  card_number=post_data.get('card_number'),
                                  expiry=post_data.get('expiry'),
                                  birth=post_data.get('birth'),
                                  pwd_2digit=post_data.get('pwd_2digit'),
                                  vat=0,
                                  buyer_name=post_data.get('name'),
                                  buyer_email=post_data.get('email'),
                                  buyer_tel=post_data.get('phone_number'))

            iamport.pay_onetime(**iamport_params)

            confirm = iamport.find_by_merchant_uid(
                post_data.get('merchant_uid'))

            # 결제한 금액과 Form에 입력된 결제 금액들이 다를 때
            if confirm[
                    'amount'] != product.price + registration.additional_price:
                # TODO : 결제 취소하는 로직 있어야 함
                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 == 'card-foreign':
            iamport = Iamport(config.IMP_INTL_API_KEY,
                              config.IMP_INTL_API_SECRET)

            # TODO : use validated and cleaned data
            iamport_params = dict(name=product.name,
                                  amount=product.price +
                                  registration.additional_price,
                                  token=post_data.get('token'),
                                  merchant_uid=post_data.get('merchant_uid'),
                                  card_number=post_data.get('card_number'),
                                  expiry=post_data.get('expiry'),
                                  birth=post_data.get('birth'),
                                  pwd_2digit=post_data.get('pwd_2digit'),
                                  vat=0,
                                  buyer_name=post_data.get('name'),
                                  buyer_email=post_data.get('email'),
                                  buyer_tel=post_data.get('phone_number'))
            iamport.pay_foreign(**iamport_params)

            confirm = iamport.find_by_merchant_uid(
                post_data.get('merchant_uid'))

            # 결제한 금액과 Form에 입력된 결제 금액들이 다를 때
            if confirm[
                    'amount'] != product.price + registration.additional_price:
                # TODO : 결제 취소하는 로직 있어야 함
                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 == 'vbank':
            registration.transaction_code = post_data.get('pg_tid')
            registration.payment_method = post_data.get('pay_method')
            registration.payment_status = post_data.get('status')
            registration.payment_message = post_data.get('fail_reason')
            registration.vbank_name = post_data.get('vbank_name', None)
            registration.vbank_num = post_data.get('vbank_num', None)
            registration.vbank_date = post_data.get('vbank_date', None)
            registration.vbank_holder = post_data.get('vbank_holder', None)
            registration.save()

        else:
            raise Exception('Unknown payment method')

    except IamporterError as e:
        # TODO : other status code
        return JsonResponse({
            'success': False,
            'code': e.code,
            'message': e.message,
        })
    else:
        return JsonResponse({
            'success': True,
        })
Exemplo n.º 4
0
def manual_payment_process(request):
    if request.method == 'GET':
        return redirect('registration_index')

    payment_logger.debug(request.POST)
    form = ManualPaymentForm(request.POST)

    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 : ...
        })

    # check already payment
    try:
        mp = ManualPayment.objects.get(
            pk=request.POST.get('manual_payment_id'))
    except ManualPayment.DoesNotExist:
        return JsonResponse({
            'success':
            False,
            'message':
            '결제할 내역이 존재하지 않습니다. 다시 한번 확인해 주시기 바랍니다.',
        })

    if mp.payment_status == 'paid':
        return JsonResponse({
            'success':
            False,
            'message':
            '이미 지불되었습니다. 문의사항은 [email protected] 로 문의주시기 바랍니다.',
        })

    # Only card
    try:
        imp_client = Iamport(config.IMP_DOM_API_KEY, config.IMP_DOM_API_SECRET)

        imp_params = dict(token=request.POST.get('token'),
                          merchant_uid=request.POST.get('merchant_uid'),
                          amount=mp.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'),
                          name=mp.title,
                          buyer_name=request.POST.get('name', ''),
                          buyer_email=request.POST.get('email'),
                          buyer_tel=request.POST.get('phone_number', ''))

        imp_client.pay_onetime(**imp_params)
        confirm = imp_client.find_by_merchant_uid(
            request.POST.get('merchant_uid'))

        if confirm['amount'] != mp.price:
            return render_io_error(
                "amount is not same as product.price. it will be canceled")

        mp.transaction_code = confirm.get('pg_tid')
        mp.imp_uid = confirm.get('imp_uid')
        mp.merchant_uid = confirm.get('merchant_uid')
        mp.payment_method = confirm.get('pay_method')
        mp.payment_status = confirm.get('status')
        mp.payment_message = confirm.get('fail_reason')
        mp.confirmed = timezone.now()
        mp.save()
    except IamporterError as e:
        return JsonResponse({
            'success': False,
            'code': e.code,
            'message': e.message,
        })
    else:
        return JsonResponse({
            'success': True,
        })
Exemplo n.º 5
0
    def iamportPayment(self,
                       is_prod_server,
                       request_id,
                       user_email,
                       amount,
                       point_for_use=0,
                       promo_type=None,
                       promo_code=None,
                       is_additional=False,
                       is_groupRequest=False,
                       is_public=False,
                       **payload):
        """
        아임포트 No-ActiveX 결제 시스템이다.

        직접 카드번호 및 유효기간 등의 정보를 물러와서 결제를 바로 한다.
        그리고 이 자리에서 바로 결제를 하기 때문에 postprocessing 과정을 거쳐서 할 작업을 여기서 다 한다.
        """
        pay_by = "web"
        if is_prod_server == False:
            host_name = "http://ciceron.xyz"
        else:
            host_name = "http://ciceron.me"

        # Payload parameter check
        for item in ['card_number', 'expiry', 'birth', 'pwd_2digit']:
            if item not in payload:
                print(
                    "    Insufficient parameters. 'card_number', 'expiry', 'birth', 'pwd_2digit' are needed."
                )
                return False, None

        new_payload = payload
        order_no = self._orderNoGenerator()
        # Should check USD->KRW currency
        # Hard coded: 1200
        kor_amount = int(amount * 1160)

        new_payload['merchant_uid'] = order_no
        new_payload['amount'] = kor_amount

        pay_module = Iamport(imp_key=231, imp_secret='secrets')

        try:
            payment_result = pay_module.pay_onetime(**new_payload)
            double_check = pay_module.is_paid(**payment_result)
        except Iamport.ResponseError as e:
            print(e.code)
            print(e.message)
            raise Exception

        postprocess_api = "%s/%s" % (
            host_name, 'api/user/requests/%d/payment/postprocess' % request_id)
        param_dict = {
            'pay_via': 'iamport',
            'status': 'success',
            'user_id': user_email,
            'pay_amt': amount,
            'pay_by': pay_by,
            'use_point': point_for_use,
            'promo_type': promo_type,
            'promo_code': promo_code,
            'is_additional': 'false' if is_additional == False else 'true',
            'is_groupRequest': 'false' if is_groupRequest == False else 'true',
            'is_public': 'false' if is_public == False else 'true',
            'ciceron_order_id': order_no
        }
        return_url = ciceron_lib.apiURLOrganizer(postprocess_api, **param_dict)

        if double_check == False:
            print("    Iamport checkout abnormaly works!")
            return False, None
        else:
            return True, return_url
Exemplo n.º 6
0
    def iamportPayment2(self,
                        is_prod_server,
                        request_id,
                        user_email,
                        amount,
                        product,
                        point_for_use=0,
                        promo_type=None,
                        promo_code=None,
                        **payload):
        """
        아임포트 No-ActiveX 결제 시스템이다.

        직접 카드번호 및 유효기간 등의 정보를 물러와서 결제를 바로 한다.
        그리고 이 자리에서 바로 결제를 하기 때문에 postprocessing 과정을 거쳐서 할 작업을 여기서 다 한다.
        """
        if is_prod_server == False:
            host_name = "http://ciceron.xyz"
        else:
            host_name = "http://ciceron.me"

        # Payload parameter check
        for item in ['card_number', 'expiry', 'birth', 'pwd_2digit']:
            if item not in payload:
                print(
                    "    Insufficient parameters. 'card_number', 'expiry', 'birth', 'pwd_2digit' are needed."
                )
                return False, None

        new_payload = payload
        order_no = self._orderNoGenerator()
        # Should check USD->KRW currency
        # Hard coded: 1200
        kor_amount = int(amount * 1160)

        new_payload['merchant_uid'] = order_no
        new_payload['amount'] = kor_amount

        pay_module = Iamport(imp_key=111, imp_secret='SHOULD_BE_SECRET')

        try:
            payment_result = pay_module.pay_onetime(**new_payload)
            double_check = pay_module.is_paid(**payment_result)
        except Iamport.ResponseError as e:
            print(e.code)
            print(e.message)
            raise Exception

        postprocess_endpoint = self._organizePostprocessApiAddress(
            product, request_id)
        postprocess_api = "{}/{}".format(host_name, postprocess_endpoint)
        param_dict = {
            'payment_platform': 'iamport',
            'product': product,
            'request_id': request_id,
            'status': 'success',
            'user_email': user_email,
            'amount': amount,
            'point_for_use': point_for_use,
            'promo_type': promo_type,
            'promo_code': promo_code,
            'ciceron_order_id': order_no
        }
        return_url = ciceron_lib.dictToUrlParam(postprocess_api, **param_dict)

        if double_check == False:
            print("    Iamport checkout abnormaly works!")
            return False, None
        else:
            return True, return_url