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
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))
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 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)
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)
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)
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
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