Exemplo n.º 1
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.º 2
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.º 3
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')
Exemplo n.º 4
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.º 5
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.º 6
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.º 7
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.º 8
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