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 post(self, request, format=None):
        merchant_uid = request.data.get('merchantUid', None)
        imp_uid = request.data.get('impUid', None)
        imp_success = request.data.get('impSuccess', None)
        if merchant_uid and imp_uid:
            iamport = Iamport(settings.IAMPORT_API_KEY,
                              settings.IAMPORT_API_SECRET)
            meta = iamport.find(merchant_uid=merchant_uid)
            payment = models.Payment.objects.get(merchant_uid=merchant_uid)
            payment.meta = meta
            payment.imp_uid = imp_uid

            pay_status = meta['status']
            if imp_success == 'true':
                payment.status = 'paid'
                payment.alert_status = 'confirmed'
                payment.save()
                order = payment.order
                order.status = 'paid'
                order.save()
            else:
                payment.status = pay_status
                payment.alert_status = 'required'
                payment.save()

            return Response(status=status.HTTP_200_OK, data={'status': 'ok'})
        else:
            return Response(
                status=status.HTTP_203_NON_AUTHORITATIVE_INFORMATION,
                data={
                    'error':
                    'Payment failed! Please contact to [email protected]'
                })
Exemplo n.º 3
0
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['channels'] = Channel.objects.order_by('?')[:4]

        try:
            order = Order.objects.get(
                merchant_uid=self.request.GET['merchant_uid']
            )

            iamport = Iamport(
                imp_key='8161721766694252',
                imp_secret='kJqNZpHNzkWkA55fMJ9h1GyOm5ataB1vkrikRZ8qk4KUaQaWAjeB0MpmRAQ2bRxwjPRaP0B94m4fdecO'
            )
            is_paid = iamport.is_paid(
                order.product.price,
                merchant_uid=self.request.GET['merchant_uid']
            )

            if is_paid is True:
                order.status = Order.PAID
                order.save()

            context['order'] = order
        except Exception as e:
            order = {
                'status': Order.UNPAID,
            }
            context['order'] = order
        return context
Exemplo n.º 4
0
 def save_model(self, request, obj, form, change):
     if change:  # 변경이 감지되면
         n = Notification()
         if obj.status == 3 and obj.video and obj.is_alarm:  # 주문완료(3) and 영상업로드 알림 전송(v) and
             n.video_complete(obj.phonenumber, obj.user,
                              obj.channel)  # 비디오 완성 알림
             obj.save()
             # 주문취소 발생 시
         elif obj.status == 4 and obj.cancelreason and obj.cancel:
             iamport = Iamport(
                 imp_key='8161721766694252',
                 imp_secret=
                 'kJqNZpHNzkWkA55fMJ9h1GyOm5ataB1vkrikRZ8qk4KUaQaWAjeB0MpmRAQ2bRxwjPRaP0B94m4fdecO'
             )  # 알림이 발생이 안하면 이미 주문이 취소 된 건이다.
             try:
                 # 상품 아이디로 취소
                 iamport.cancel(u'취소하는 이유', merchant_uid=obj.merchant_uid)
             except Iamport.ResponseError as e:
                 print
                 e.code
                 print
                 e.message  # 에러난 이유를 알 수 있음
             except Iamport.HttpError as http_error:
                 print
                 http_error.code
                 print
                 http_error.reason  # HTTP not 200 에러난 이유를 알 수 있음
             else:  # 에러가 발생하지 않았다면 아래 구문 실행
                 # [!] 주문취소 알람발생
                 n.payment_cancel(obj.phonenumber, obj.user, obj.channel,
                                  obj.created_at, obj.cancelreason)
                 obj.save()
Exemplo n.º 5
0
def _cancel_process_for_domestic(**payload):
    """Process a cancel request by imp_uid"""
    iamport = Iamport(config.IAMPORT_API_KEY_FOR_DOMESTIC,
                      config.IAMPORT_API_SECRET_FOR_DOMESTIC)

    try:
        result = iamport.cancel_by_imp_uid(**payload)
        return True, result,
    except Exception as exception:
        return _process_exception(exception)
Exemplo n.º 6
0
def _cancel_process_for_international(**payload):
    """Process a cancel request by imp_uid"""
    iamport = Iamport(config.IAMPORT_API_KEY_FOR_INTERNATIONAL,
                      config.IAMPORT_API_SECRET_FOR_INTERNATIONAL)

    try:
        result = iamport.cancel_by_imp_uid(**payload)
        return True, result,
    except Exception as exception:
        return _process_exception(exception)
Exemplo n.º 7
0
def payinfo_view(request, cart_pk):
    order = Cart.objects.get(pk=cart_pk)
    iamport = Iamport(imp_key=settings.IAMPORT_KEY,
                      imp_secret=settings.IAMPORT_SECRET)
    response = iamport.find(imp_uid=order.order_id)
    context = {
        'order': order,
        'rsp': response,
    }
    return render(request, 'users/payinfo.html', context)
Exemplo n.º 8
0
    def get_payment(merchant_uid):
        merchant_uid = merchant_uid

        imp_key = os.environ.get("IMPORT_REST_API")
        imp_secret = os.environ.get("IMPORT_REST_API_SECRET")

        iamport = Iamport(imp_key=imp_key, imp_secret=imp_secret)
        response = iamport.find(merchant_uid=merchant_uid)

        print(response)
        return response
Exemplo n.º 9
0
def _payment_process_for_international(**payload):
    """Process payment via Iamport PG service
    For international, ['merchant_uid', 'amount', 'card_number', 'expiry']:"""
    iamport = Iamport(config.IAMPORT_API_KEY_FOR_INTERNATIONAL,
                      config.IAMPORT_API_SECRET_FOR_INTERNATIONAL)

    try:
        result = iamport.pay_foreign(**payload)
        return True, result,
    except Exception as exception:
        return _process_exception(exception)
Exemplo n.º 10
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.º 11
0
def cancel_reservation(meal_id, guest_id):
    reservation = Reservation.query.filter_by(meal_id=meal_id,
                                              guest_id=guest_id).first()
    if reservation.payment_id:
        # cancel payment transaction
        iamport = Iamport(imp_key=app.config['IAMPORT_API_KEY'],
                          imp_secret=app.config['IAMPORT_API_SECRET'])
        iamport.cancel('예약 취소', imp_uid=reservation.payment_id)

    db_session.delete(reservation)
    db_session.flush()
    return redirect(url_for('meal.detail_meal', meal_id=meal_id))
Exemplo n.º 12
0
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        iamport = Iamport(
            imp_key='8161721766694252',
            imp_secret=
            'kJqNZpHNzkWkA55fMJ9h1GyOm5ataB1vkrikRZ8qk4KUaQaWAjeB0MpmRAQ2bRxwjPRaP0B94m4fdecO'
        )

        pay_information = iamport.find(merchant_uid=self.object.merchant_uid)
        context['pay_info'] = pay_information
        return context
Exemplo n.º 13
0
def reservation(meal_id, guest_id):
    meal = Meal.query.get_or_404(meal_id)
    iamport = Iamport(imp_key=app.config['IAMPORT_API_KEY'],
                      imp_secret=app.config['IAMPORT_API_SECRET'])
    if not iamport.is_paid(meal.price, imp_uid=request.form['payment_id']):
        iamport.cancel('Bad request', imp_uid=request.form['payment_id'])
        flash('잘못된 접근입니다.')
        raise BadRequest()
    else:
        reservations = Reservation(meal_id=meal_id,
                                   guest_id=guest_id,
                                   payment_id=request.form['payment_id'])
        db_session.add(reservations)
        db_session.flush()
        return redirect(url_for('meal.detail_meal', meal_id=meal_id))
Exemplo n.º 14
0
def payment_cancel_confirm_view(request, pk):
    payment = get_object_or_404(Payment, pk=pk)
    iamport = Iamport(imp_key=settings.IMP_KEY,
                      imp_secret=settings.IMP_SECRET)
    # 입력한 취소 사유로 해당 imp_uid의 결제 취소 진행
    # Iamport.ResponseError > 이미 결제 취소되어진 경우
    try:
        cancel = iamport.cancel(payment.paymentcancel.reason, imp_uid=payment.imp_uid)
    except Iamport.ResponseError:
        raise exceptions.PermissionDenied('Already cancelled')
    all_fields = [f.name for f in Payment._meta.get_fields()]
    Payment.objects.filter(pk=pk).update(
        **{key: value for key, value in cancel.items() if key in all_fields},
    )
    payment.reservation.status = 'cancelled'
    payment.reservation.save()
    return redirect('reservations:views:reservation_check_detail', pk=payment.reservation.pk)
Exemplo n.º 15
0
def makeimaport():
    # 상점정보?
    iamport = Iamport(
        imp_key='4463657570405001',
        imp_secret=
        'o6Ntie0KDH6fcTOXUh2tj4ELwyFmsq3QwRjP6jzJ0GZdANau5dYohDaOcQbEgeuN6NCc7cW8SVltJwXP'
    )
    return iamport
Exemplo n.º 16
0
def payment_reservations_save_view(request):
    if request.method == 'POST':
        restaurant = int(request.POST.get('restaurant'))
        information = int(request.POST.get('information'))
        name = request.POST.get('name')
        party = int(request.POST.get('party'))
        phone_number = int(request.POST.get('phone_number'))
        email = request.POST.get('email')
        price = int(request.POST.get('price'))
        reservation = Reservation.objects.create(
            user=request.user,
            information=get_object_or_404(ReservationInfo, pk=information),
            restaurant=get_object_or_404(Restaurant, pk=restaurant),
            name=name,
            party=party,
            phone_number=phone_number,
            email=email,
            price=price,
        )
        # 예약 가능 인원 수에서 예약 인원만큼 빼 줌
        get_object_or_404(ReservationInfo, pk=information).acceptable_size_of_party_update(party)
        iamport = Iamport(imp_key=settings.IMP_KEY,
                          imp_secret=settings.IMP_SECRET)
        # 입력한 imp_uid로부터 결제정보를 가져옴
        payment = iamport.find(imp_uid=request.POST.get('imp_uid'))
        # Payment 모델에 있는 모든 필드를 리스트에 담음
        all_fields = [f.name for f in Payment._meta.get_fields()]
        # 주문 해야할 금액과 실제 결제 금액이 일치하는지 검증 후 일치하지 않으면 자동으로 취소
        # 취소 되었을 경우에는 취소 되어진 결제정보로 데이터베이스에 저장
        # 또한, 취소 되었을 경우 취소되었다는 메일 보냄(celery로 비동기 처리, celery config dev로 바꾸고 배포 관련 처리 하고 주석 빼야 함)
        if not iamport.is_paid(int(request.POST.get('price')), imp_uid=request.POST.get('imp_uid')):
            cancel = iamport.cancel(u'가격 불일치', imp_uid=request.POST.get('imp_uid'))
            # send_mail_task.delay('Test', 'Test', '*****@*****.**')
            Payment.objects.create(
                **{key: value for key, value in cancel.items() if key in all_fields},
                reservation=reservation
            )
        else:
            Payment.objects.create(
                **{key: value for key, value in payment.items() if key in all_fields},
                reservation=reservation
            )
            return HttpResponse('success')
        return HttpResponse('failed')
def test_cancel():
    iamport = Iamport()
    with pytest.raises(TypeError):
        iamport.cancel(imp_uid='nothing')
    with pytest.raises(Iamport.ResponseError):
        iamport.cancel('reason', imp_uid='nothing')
    try:
        iamport.cancel('reason', imp_uid='nothing')
    except Iamport.ResponseError as e:
        assert e.code == 1
        assert e.message == u'취소할 결제건이 존재하지 않습니다.'
Exemplo n.º 18
0
def manage_payment():
    iamport_api = Iamport(imp_key=current_app.config['IMP_KEY'],
                          imp_secret=current_app.config['IMP_SECRET'])
    # result = iamport_api.is_paid(request.args.get('amount', 0), imp_uid=request.args.get('imp_uid', None))
    point = Point(user_id=current_user.id,
                  amount=request.args.get('amount', 10000))
    db.session.add(point)
    db.session.commit()
    return jsonify(
        {'data': render_template('account/email/success_form.html', code=302)})
Exemplo n.º 19
0
 def post(self, request, pk):
     reservation = get_object_or_404(Reservation, pk=pk)
     iamport = Iamport(imp_key=settings.IMP_KEY,
                       imp_secret=settings.IMP_SECRET)
     payment = iamport.find(imp_uid=request.data.get('imp_uid'))
     if not iamport.is_paid(int(request.data.get('price')),
                            imp_uid=request.data.get('imp_uid')):
         cancel = iamport.cancel(u'가격 불일치',
                                 imp_uid=request.data.get('imp_uid'))
         serializer = PaymentSerializer(data=cancel)
     else:
         serializer = PaymentSerializer(data=payment)
     if serializer.is_valid(raise_exception=True):
         try:
             serializer.save(reservation=reservation)
         except IntegrityError:
             raise exceptions.ValidationError
         return Response(serializer.data, status=status.HTTP_201_CREATED)
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Exemplo n.º 20
0
def payment(req):
    # 테스트 용
    DEFAULT_TEST_IMP_KEY = 'imp_apikey'
    DEFAULT_TEST_IMP_SECRET = ('ekKoeW8RyKuT0zgaZsUtXXTLQ4AhPFW3ZGseDA6bkA5lamv9O'
                            'qDMnxyeB9wqOsuO9W3Mx9YSJ4dTqJ3f')

    _iamport = Iamport(imp_key=DEFAULT_TEST_IMP_KEY, imp_secret=DEFAULT_TEST_IMP_SECRET)

    return render(req, 'payment/pay.html')
    # 실제 상점 정보
    # iamport = Iamport(imp_key='{발급받은 키}', imp_secret='{발급받은 시크릿}')
Exemplo n.º 21
0
 def patch(self, request, imp_uid):
     payment = get_object_or_404(Payment, imp_uid=imp_uid)
     iamport = Iamport(imp_key=settings.IMP_KEY,
                       imp_secret=settings.IMP_SECRET)
     # 입력한 취소 사유로 해당 imp_uid의 결제 취소 진행
     # Iamport.ResponseError > 이미 결제 취소되어진 경우
     try:
         cancel = iamport.cancel(request.data['reason'],
                                 imp_uid=payment.imp_uid)
     except Iamport.ResponseError:
         raise exceptions.NotAcceptable('Already cancelled')
     except MultiValueDictKeyError:
         raise exceptions.ValidationError
     serializer = PaymentSerializer(payment, data=cancel, partial=True)
     # 결제 취소가 이루어지면 해당 결제 정보에 연결된 예약 정보의 status 필드를 cancelled로 변경
     if serializer.is_valid(raise_exception=True):
         serializer.save()
         payment.reservation.status = 'cancelled'
         payment.reservation.save()
         return Response(serializer.data, status=status.HTTP_200_OK)
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Exemplo n.º 22
0
def pay_view(request, cart_pk):
    iamport = Iamport(imp_key=settings.IAMPORT_KEY,
                      imp_secret=settings.IAMPORT_SECRET)
    order = Cart.objects.get(pk=cart_pk)
    context = {
        'order': order,
    }
    if request.method == 'POST' and request.is_ajax():
        imp_uid = request.POST.get('imp_uid')
        print(imp_uid)
        product_price = order.number * order.product.price
        if iamport.is_paid(product_price, imp_uid=imp_uid):
            # return JsonResponse({'message': "일반 결제 성공"},json_dumps_params = {'status': "success"})
            order.order_id = imp_uid
            order.save()
            return JsonResponse({'status': "success", 'message': "일반 결제 성공"})
        else:
            # return JsonResponse({'message': "위조된 결제시도"},json_dumps_params = {'status': "forgery"})
            order.delete()
            return JsonResponse({'status': "forgery", 'message': "위조된 결제시도"})

    return render(request, 'users/pay.html', context)
Exemplo n.º 23
0
 def post(self, request, pk):
     reservation = get_object_or_404(Reservation, pk=pk)
     iamport = Iamport(imp_key=settings.IMP_KEY,
                       imp_secret=settings.IMP_SECRET)
     # 입력한 imp_uid로부터 결제정보를 가져옴
     payment = iamport.find(imp_uid=request.data.get('imp_uid'))
     # 주문 해야할 금액과 실제 결제 금액이 일치하는지 검증 후 일치하지 않으면 자동으로 취소
     # 취소 되었을 경우에는 취소 되어진 결제정보로 데이터베이스에 저장
     # 또한, 취소 되었을 경우 취소되었다는 메일 보냄(celery로 비동기 처리, celery config dev로 바꾸고 배포 관련 처리 하고 주석 빼야 함)
     if not iamport.is_paid(int(request.data.get('price')),
                            imp_uid=request.data.get('imp_uid')):
         cancel = iamport.cancel(u'가격 불일치',
                                 imp_uid=request.data.get('imp_uid'))
         # send_mail_task.delay('Test', 'Test', '*****@*****.**')
         serializer = PaymentSerializer(data=cancel)
     else:
         serializer = PaymentSerializer(data=payment)
     if serializer.is_valid(raise_exception=True):
         try:
             serializer.save(reservation=reservation)
         except IntegrityError:
             raise exceptions.ValidationError
         return Response(serializer.data, status=status.HTTP_201_CREATED)
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Exemplo n.º 24
0
def payment_callback(request):
    merchant_uid = request.POST.get('merchant_uid')
    registration = Registration.objects.filter(merchant_uid=merchant_uid)

    if not registration.exists():
        return HttpResponse(status=404)

    try:
        iamport = Iamport(config.IMP_DOM_API_KEY, config.IMP_DOM_API_SECRET)
        result = iamport.find_by_merchant_uid(merchant_uid)
        registration = registration.first()

        if result['status'] == 'paid':
            registration.confirmed = datetime.datetime.now()
        elif result['status'] == 'cancelled':
            registration.canceled = datetime.datetime.now()

        registration.payment_status = result['status']
        registration.save()
        return HttpResponse()
    except Iamport.ResponseError as iamport_error:
        if iamport_error.code == 401 or iamport_error.code == 404:
            iamport = Iamport(config.IMP_INTL_API_KEY,
                              config.IMP_INTL_API_SECRET)
            result = iamport.find_by_merchant_uid(merchant_uid)
            registration = registration.first()

            if result['status'] == 'paid':
                registration.confirmed = datetime.datetime.now()
            elif result['status'] == 'cancelled':
                registration.canceled = datetime.datetime.now()

            registration.payment_status = result['status']
            registration.save()
            return HttpResponse()

    return HttpResponse(status=404)
Exemplo n.º 25
0
 def api(self):
     'Iamport Client 인스턴스'
     return Iamport(settings.IAMPORT_API_KEY, settings.IAMPORT_API_SECRET)
Exemplo n.º 26
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.º 27
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.º 28
0
 def api(self):
     return Iamport(settings.IAMPORT_API_KEY, settings.IAMPORT_SECRET_KEY)
Exemplo n.º 29
0
def create_iamport(is_domestic_card):
    if is_domestic_card:
        return Iamport(imp_key=config.IMP_DOM_API_KEY,
                       imp_secret=config.IMP_DOM_API_SECRET)
    return Iamport(imp_key=config.IMP_INTL_API_KEY,
                   imp_secret=config.IMP_INTL_API_SECRET)
Exemplo n.º 30
0
def test_find():
    iamport = Iamport()
    result = iamport.find(imp_uid='test')
    assert dict == type(result)
    result = iamport.find(merchant_uid='test')
    assert dict == type(result)
Exemplo n.º 31
0
def iamport(request):
    imp_key = request.config.getoption('--imp-key')
    imp_secret = request.config.getoption('--imp-secret')
    return Iamport(imp_key=imp_key, imp_secret=imp_secret)