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]' })
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)
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
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
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 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 test_find(): iamport = Iamport() result = iamport.find(imp_uid='test') assert dict == type(result) result = iamport.find(merchant_uid='test') assert dict == type(result)