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
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 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 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()
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)
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)
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 _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)
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)
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))
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 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_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)
def makeimaport(): # 상점정보? iamport = Iamport( imp_key='4463657570405001', imp_secret= 'o6Ntie0KDH6fcTOXUh2tj4ELwyFmsq3QwRjP6jzJ0GZdANau5dYohDaOcQbEgeuN6NCc7cW8SVltJwXP' ) return iamport
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'취소할 결제건이 존재하지 않습니다.'
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)})
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 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='{발급받은 시크릿}')
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)
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 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)
def api(self): 'Iamport Client 인스턴스' return Iamport(settings.IAMPORT_API_KEY, settings.IAMPORT_API_SECRET)
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, })
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, })
def api(self): return Iamport(settings.IAMPORT_API_KEY, settings.IAMPORT_SECRET_KEY)
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)
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)
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)