From c3348ef7fd77f974dfe3b3150a053ee207b298c1 Mon Sep 17 00:00:00 2001 From: Kyoungup Jung Date: Wed, 17 Nov 2021 18:55:44 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B2=84=EC=A0=84=200.9.0=20=EC=9E=91=EC=97=85?= =?UTF-8?q?,=20=ED=8C=A8=ED=82=A4=EC=A7=95=20=EB=B0=A9=EC=8B=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 8 +- README.md | 41 +++-- README.rst | 336 ------------------------------------ pyproject.toml | 6 + requirements.txt | 4 +- setup.cfg | 42 ++++- setup.py | 65 ------- tests/__init__.py | 0 tests/conftest.py | 7 +- 9 files changed, 74 insertions(+), 435 deletions(-) delete mode 100644 README.rst create mode 100644 pyproject.toml delete mode 100644 setup.py create mode 100644 tests/__init__.py diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 96f7030..cc67d24 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,13 +21,13 @@ jobs: pip install -r requirements.txt - name: Run unit tests run: | - python -m pytest --cov=iamport tests + python -m pytest --cov=iamport - name: Run convention tests run: | - python -m flake8 iamport tests --ignore E203,W503,W504 + python -m flake8 iamport tests - name: Run type check run: | - python -m mypy iamport + python -m mypy iamport tests - name: Run import sort check run: | - python -m isort iamport tests --diff \ No newline at end of file + python -m isort iamport tests --diff diff --git a/README.md b/README.md index a27dc18..0bbba93 100644 --- a/README.md +++ b/README.md @@ -55,12 +55,13 @@ python -m pip install git+https://github.com/iamport/iamport-rest-client-python. 사용 준비 ------- + ```python from iamport import Iamport # 아임포트 객체를 테스트용 키와 시크릿을 사용하여 생성합니다 (테스트시 지출된 금액은 매일 자정 이전 환불됩니다). iamport = Iamport( - imp_key='imp_apikey', + imp_key='imp_apikey', imp_secret=( 'ekKoeW8RyKuT0zgaZsUtXXTLQ4AhPFW3ZGseDA6b' 'kA5lamv9OqDMnxyeB9wqOsuO9W3Mx9YSJ4dTqJ3f' @@ -102,20 +103,20 @@ iamport.is_paid(product_price, response=response) ```python # 상품 아이디로 취소 -response = iamport.cancel(u'취소하는 이유', merchant_uid='{상품 아이디}') +response = iamport.cancel('취소하는 이유', merchant_uid='{상품 아이디}') # I'mport; 아이디로 취소 -response = iamport.cancel(u'취소하는 이유', imp_uid='{IMP UID}') +response = iamport.cancel('취소하는 이유', imp_uid='{IMP UID}') # 취소시 오류 예외처리(이미 취소된 결제는 에러가 발생함) try: - response = iamport.cancel(u'취소하는 이유', imp_uid='{IMP UID}') + response = iamport.cancel('취소하는 이유', imp_uid='{IMP UID}') except Iamport.ResponseError as e: - print e.code - print e.message # 에러난 이유를 알 수 있음 + print(e.code) + print(e.message) # 에러난 이유를 알 수 있음 except Iamport.HttpError as http_error: - print http_error.code - print http_error.reason # HTTP not 200 에러난 이유를 알 수 있음 + print(http_error.code) + print(http_error.reason) # HTTP not 200 에러난 이유를 알 수 있음 ``` 1회성 비인증 결제를 진행합니다. @@ -174,26 +175,24 @@ payload = { 'schedules': [ { 'merchant_uid': 'test_merchant_01', - # UNIX timestamp - 'schedule_at': 1478150985, - 'amount': 1004 + 'schedule_at': 1478150985, # UNIX timestamp + 'amount': 1004 }, { 'merhcant_uid': 'test_merchant_02', - # UNIX timestamp - 'schedule_at': 1478150985, - 'amount': 5000, - 'name': '{주문명}', - 'buyer_name': '{주문자명}', - 'buyer_email': '{주문자 이메일}', - 'buyer_tel': '{주문자 전화번호}', - 'buyer_addr': '{주문자 주소}', - 'buyer_postcode': '{주문자 우편번호}', + 'schedule_at': 1478150985, # UNIX timestamp + 'amount': 5000, + 'name': '{주문명}', + 'buyer_name': '{주문자명}', + 'buyer_email': '{주문자 이메일}', + 'buyer_tel': '{주문자 전화번호}', + 'buyer_addr': '{주문자 주소}', + 'buyer_postcode': '{주문자 우편번호}', }, ] } try: - reponse = iamport.pay_schedule(**payload) + response = iamport.pay_schedule(**payload) except KeyError: # 필수 값이 없을때 에러 처리 pass diff --git a/README.rst b/README.rst deleted file mode 100644 index abca49b..0000000 --- a/README.rst +++ /dev/null @@ -1,336 +0,0 @@ -===================== -I'mport; REST Client -===================== - -.. image:: https://travis-ci.org/iamport/iamport-rest-client-python.svg?branch=master - :target: https://travis-ci.org/iamport/iamport-rest-client-python - -.. image:: https://codecov.io/gh/iamport/iamport-rest-client-python/branch/master/graph/badge.svg -   :target: https://codecov.io/gh/iamport/iamport-rest-client-python - - -Python 사용자를 위한 아임포트 REST API 연동 모듈입니다. - -* 이용 중 발생한 문제에 대해 책임지지 않습니다. -* lexifdev님의 도움을 받아 작성되었습니다(`lexifdev's iamport 모듈 `_) -* 최초 작성은 `핑크퐁 북스토어 `_ 에서 쓰기 위해 만들었습니다. - -설치 -======= - -.. code-block:: shell - - pip install iamport-rest-client - - -기능 -====== -1. 결제 정보 찾기 -2. 가격 확인 -3. 취소 -4. 비 인증 결제 -5. 정기 예약 결제 -6. 본인인증결과 조회 및 삭제 - - -사용법 -======= - -준비 ------- - -사용하기 위해 객체를 만듭니다. - -.. code-block:: python - - from iamport import Iamport - - # 테스트 용 - iamport = Iamport(imp_key='{테스트용 키}', imp_secret='{테스트 시크릿}') - # 테스트용 키와 시크릿은 tests/conftest.py 파일에 DEFAULT_TEST_IMP_KEY, DEFAULT_TEST_IMP_SECRET를 참고하세요. - - # 실제 상점 정보 - iamport = Iamport(imp_key='{발급받은 키}', imp_secret='{발급받은 시크릿}') - - - -찾기 ------- - -결제를 진행한 상품 아이디나, 전달받은 IMP 아이디를 이용해 결제 정보를 찾습니다. - -.. code-block:: python - - # 상품 아이디로 조회 - response = iamport.find(merchant_uid='{상품 아이디}') - - # I'mport; 아이디로 조회 - response = iamport.find(imp_uid='{IMP UID}') - - -가격 확인 ----------- - -실제 제품 가격과 결제된 가격이 같은지 확인합니다. - -.. code-block:: python - - # 상품 아이디로 확인 - iamport.is_paid(product_price, merchant_uid='{상품 아이디}') - - # I'mport; 아이디로 확인 - iamport.is_paid(product_price, imp_uid='{IMP UID}') - - # 이미 찾은 response 재활용하여 확인 - iamport.is_paid(product_price, response=response) - - -취소 ------- - -결제를 취소합니다. - -.. code-block:: python - - # 상품 아이디로 취소 - response = iamport.cancel(u'취소하는 이유', merchant_uid='{상품 아이디}') - - # I'mport; 아이디로 취소 - response = iamport.cancel(u'취소하는 이유', imp_uid='{IMP UID}') - - # 취소시 오류 예외처리(이미 취소된 결제는 에러가 발생함) - try: - response = iamport.cancel(u'취소하는 이유', imp_uid='{IMP 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 에러난 이유를 알 수 있음 - -비인증 결제 -------------- - -1회성 비인증 결제를 진행합니다. - -.. code-block:: python - - # 테스트용 값 - payload = { - 'merchant_uid': '00000000', - 'amount': 5000, - '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 - -저장된 빌링키로 재결제합니다. - -.. code-block:: python - - # 테스트용 값 - payload = { - 'customer_uid': '{고객 아이디}', - 'merchant_uid': '00000000', - 'amount': 5000, - } - try: - response = iamport.pay_again(**payload) - except KeyError: - # 필수 값이 없을때 에러 처리 - pass - except Iamport.ResponseError as e: - # 응답 에러 처리 - pass - except Iamport.HttpError as http_error: - # HTTP not 200 응답 에러 처리 - pass - -정기 예약 결제 ----------------- - -정기 결제를 예약합니다. - -.. code-block:: python - - # 테스트용 값 - payload = { - 'customer_uid': '{고객 아이디}', - 'schedules': [ - { - 'merchant_uid': 'test_merchant_01', - # UNIX timestamp - 'schedule_at': 1478150985, - 'amount': 1004 - }, - { - 'merhcant_uid': 'test_merchant_02', - # UNIX timestamp - 'schedule_at': 1478150985, - 'amount': 5000, - 'name': '{주문명}', - 'buyer_name': '{주문자명}', - 'buyer_email': '{주문자 이메일}', - 'buyer_tel': '{주문자 전화번호}', - 'buyer_addr': '{주문자 주소}', - 'buyer_postcode': '{주문자 우편번호}', - }, - ] - } - try: - reponse = iamport.pay_schedule(**payload) - except KeyError: - # 필수 값이 없을때 에러 처리 - pass - except Iamport.ResponseError as e: - # 응답 에러 처리 - pass - except Iamport.HttpError as http_error: - # HTTP not 200 응답 에러 처리 - pass - -정기 결제 예약을 취소합니다. - -.. code-block:: python - - # 테스트용 값 (merchant_uid 가 누락되면 customer_uid 에 대한 결제예약정보 일괄취소) - payload = { - 'customer_uid': '{고객 아이디}', - 'merchant_uid': 'test_merchant_01', - } - try: - response = iamport.pay_unschedule(**payload) - except KeyError: - # 필수 값이 없을때 에러 처리 - pass - except Iamport.ResponseError as e: - # 응답 에러 처리 - pass - except Iamport.HttpError as http_error: - # HTTP not 200 응답 에러 처리 - pass - -결제 사전 검증 ----------------- - -결제될 내역에 대한 사전정보를 등록합니다 - -.. code-block:: python - - # 테스트용 값 - amount = 12000 - mid = 'merchant_test' - try: - response = iamport.prepare(amount=amount, merchant_uid=mid) - except Iamport.ResponseError as e: - # 응답 에러 처리 - pass - except Iamport.HttpError as http_error: - # HTTP not 200 응답 에러 처리 - pass - -등록된 사전정보를 확인합니다 - -.. code-block:: python - - # 테스트용 값 - amount = 12000 - mid = 'merchant_test' - try: - result = iamport.prepare_validate(merchant_uid=mid, amount=amount) - except Iamport.ResponseError as e: - # 응답 에러 처리 - pass - except Iamport.HttpError as http_error: - # HTTP not 200 응답 에러 처리 - pass - -본인인증 결과 조회 및 관리 --------------------------- - -본인인증결과를 조회합니다. - -.. code-block:: python - - try: - response = iamport.find_certification(imp_uid='{IMP UID}') - except Iamport.ResponseError as e: - # 응답 에러 처리 - pass - except Iamport.HttpError as http_error: - # HTTP not 200 응답 에러 처리 - pass - -본인인증결과를 아임포트에서 삭제합니다. - -.. code-block:: python - - try: - response = iamport.cancel_certification(imp_uid='{IMP UID}') - except Iamport.ResponseError as e: - # 응답 에러 처리 - pass - except Iamport.HttpError as http_error: - # HTTP not 200 응답 에러 처리 - pass - -개발환경 및 테스트 설정 -========================== -macOS 기준 pyenv 설치 권장 - -:: - - # pyenv 준비 - brew install pyenv - pyenv install -s 2.7.17 - pyenv install -s 3.5.8 - pyenv install -s 3.6.9 - pyenv install -s 3.7.5 - pyenv install -s 3.8.0 - pyenv install -s pypy-5.7.1 - pyenv local 2.7.17 3.5.8 3.6.9 3.7.5 3.8.0 pypy-5.7.1 - pip install pytest pytest-cov collective.checkdocs Pygments tox-pyenv - - # tox - tox - - # 커버리지 확인 - python -m pytest tests/ --cov=./ - - # 문서 확인 - python setup.py checkdocs - -기여 -====== -- 파이썬 3 지원, 테스트: `dahlia `_ `#4 `_ -- 비인증 결제(onetime) 지원: `psy2848048 `_ `#8 `_ -- 부분 취소 지원: `pcompassion `_ `#10 `_ -- 재결제 지원: `Leop0ld `_ `#13 `_ -- 결제사전검증 지원: `Bumsoo Kim `_ `#17 `_ -- 비인증 결제예약 및 취소 지원: - - `forybm `_ `#18 `_ - - `Leop0ld `_ `#21 `_ -- http 200 응답 개선:`Noh Seho `_ `#24 `_ -- 빌링키 조회 함수 추가 - - `james-song `_ `#30 `_ - - `pcompassion `_ `#20 `_ - - `UrangUrang `_ `#14 `_ - -할 일 -====== -- 결제 목록 읽기 -- 비인증 결제 세부 기능 지원 -- 문서화 -- 기타 등등 diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..4789c9a --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,6 @@ +[build-system] +requires = [ + "setuptools >= 42", + "wheel", +] +build-backend = "setuptools.build_meta" diff --git a/requirements.txt b/requirements.txt index 62ecff5..a663aa3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ requests==2.26.0 pytest==6.2.4 pytest-cov==2.12.1 -flake8==3.9.2 +flake8==4.0.1 isort==5.9.3 mypy==0.910 -types-requests==2.25.6 \ No newline at end of file +types-requests==2.25.6 diff --git a/setup.cfg b/setup.cfg index 2a9acf1..4e84e71 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,2 +1,40 @@ -[bdist_wheel] -universal = 1 +[metadata] +name = iamport-rest-client +version = 0.9.0 +author = PerhapsSPY +author_email = perhapsspy@gmail.com +description = REST client for I'mport;(http://www.iamport.kr) +long_description = file: README.md +long_description_content_type = text/markdown +license = MIT +url = https://github.com/iamport/iamport-rest-client-python +project_urls = + Bug Tracker = https://github.com/iamport/iamport-rest-client-python/issues +classifiers = + Programming Language :: Python :: 3 + License :: OSI Approved :: MIT License + Operating System :: OS Independent + Programming Language :: Python + Programming Language :: Python :: 3.6 + Programming Language :: Python :: 3.7 + Programming Language :: Python :: 3.8 + Programming Language :: Python :: 3.9 + Programming Language :: Python :: Implementation :: CPython + Programming Language :: Python :: Implementation :: PyPy + Topic :: Software Development :: Libraries :: Python Modules + +[options] +zip_safe = False +packages = find: +python_requires = >=3.6 + +[options.packages.find] +exclude = tests + +[options.package_data] +* = *.pyi + +[flake8] +max-line-length = 79 +exclude = .git,__pycache__,docs,build,dist,*.egg-info,*_cache,venv +max-complexity = 10 diff --git a/setup.py b/setup.py deleted file mode 100644 index 96beb5f..0000000 --- a/setup.py +++ /dev/null @@ -1,65 +0,0 @@ -import io -import os - -from setuptools import setup, find_packages - - -def get_spec(filename): - def wrapper(): - here = os.path.dirname(__file__) - result = {} - with io.open(os.path.join(here, filename), encoding='utf-8') as src_file: - result = src_file.read() - return result - return wrapper - - -get_readme = get_spec('README.rst') -get_requirements = get_spec('requirements.txt') -setup( - name='iamport-rest-client', - version='0.8.2', - description="REST client for I'mport;(http://www.iamport.kr)", - long_description=get_readme(), - url='https://github.com/iamport/iamport-rest-client-python', - packages=find_packages(), - author='PerhapsSPY', - author_email='perhapsspy@gmail.com', - include_package_data=True, - install_requires=get_requirements(), - license='MIT', - zip_safe=False, - data_files=[ - ( - 'shared/typehints/python3.6', - ['iamport/client.pyi'], - ), - ( - 'shared/typehints/python3.7', - ['iamport/client.pyi'], - ), - ( - 'shared/typehints/python3.8', - ['iamport/client.pyi'], - ), - ( - 'shared/typehints/python3.9', - ['iamport/client.pyi'], - ), - ], - classifiers=[ - 'Development Status :: 2 - Pre-Alpha', - 'Environment :: Web Environment', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: MIT License', - 'Operating System :: OS Independent', - 'Programming Language :: Python', - 'Programming Language :: Python :: 3.6', - 'Programming Language :: Python :: 3.7', - 'Programming Language :: Python :: 3.8', - 'Programming Language :: Python :: 3.9', - 'Programming Language :: Python :: Implementation :: CPython', - 'Programming Language :: Python :: Implementation :: PyPy', - 'Topic :: Software Development :: Libraries :: Python Modules', - ] -) diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/conftest.py b/tests/conftest.py index 8700ab5..a55b79d 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2,7 +2,6 @@ from iamport import Iamport - DEFAULT_TEST_IMP_KEY = 'imp_apikey' DEFAULT_TEST_IMP_SECRET = ( 'ekKoeW8RyKuT0zgaZsUtXXTLQ4AhPFW3ZGseDA6b' @@ -14,14 +13,12 @@ def pytest_addoption(parser): parser.addoption( '--imp-key', default=DEFAULT_TEST_IMP_KEY, - help='iamport client key for testing ' - '[default: %(default)s]' + help='iamport client key for testing [default: %(default)s]' ) parser.addoption( '--imp-secret', default=DEFAULT_TEST_IMP_SECRET, - help='iamport secret key for testing ' - '[default: %(default)s]' + help='iamport secret key for testing [default: %(default)s]' )