Git Product home page Git Product logo

iamport-rest-client-python's Introduction

I'mport; REST Client Python

Python Versions PyPI Release (latest by date) GitHub Workflow Status (Build) GitHub LICENSE Lines of Code

소개

Python 개발자를 위한 아임포트 REST API 연동 패키지입니다.

주의 사항

  • 이용 중 발생한 문제에 대해 책임지지 않습니다.
  • lexifdev님의 도움을 받아 작성되었습니다`lexifdev's iamport 모듈
  • 최초 작성은 [핑크퐁 북스토어](https://store.pinkfong.com)에서 쓰기 위해 만들었습니다.

주요 기능

  1. 결제 정보 찾기
  2. 가격 확인
  3. 취소
  4. 비 인증 결제
  5. 정기 예약 결제
  6. 본인인증결과 조회 및 삭제

설치

# mac, linux
pip install iamport-rest-client

# 아나콘다
conda create --name iamport python=3.6
conda activate iamport
python -m pip install iamport-rest-client --upgrade

# 개발버전
pip install git+https://github.com/iamport/iamport-rest-client-python.git@master --upgrade  # master
pip install git+https://github.com/iamport/[email protected] --upgrade  # 특정 버전

개발 환경

# venv 등 환경 준비 및 활성화
pip install -e .[dev]
pytest  # 테스트 실행

기여하기

iamport-rest-client-python 프로젝트 보드To do 탭을 참고해주세요.

사용법

설정

from iamport import Iamport

# 아임포트 객체를 테스트용 키와 시크릿을 사용하여 생성합니다 (테스트시 지출된 금액은 매일 자정 이전 환불됩니다).
iamport = Iamport(
    imp_key='imp_apikey',
    imp_secret=(
        'ekKoeW8RyKuT0zgaZsUtXXTLQ4AhPFW3ZGseDA6b'
        'kA5lamv9OqDMnxyeB9wqOsuO9W3Mx9YSJ4dTqJ3f'
    )
)

# 아임포트 객체를 각자 발급받으신 실제 키와 시크릿을 사용하여 생성합니다.
iamport = Iamport(imp_key='{발급받은 키}', imp_secret='{발급받은 시크릿}')

예제

결제를 진행한 상품 아이디나, 전달받은 IMP 아이디를 이용해 결제 정보를 찾습니다.

# 상품 아이디로 조회
response = iamport.find(merchant_uid='{상품 아이디}')

# I'mport; 아이디로 조회
response = iamport.find(imp_uid='{IMP UID}')

실제 제품 가격과 결제된 가격이 같은지 확인합니다.

# 상품 아이디로 확인
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)

결제를 취소합니다.

# 상품 아이디로 취소
response = iamport.cancel('취소하는 이유', merchant_uid='{상품 아이디}')

# I'mport; 아이디로 취소
response = iamport.cancel('취소하는 이유', imp_uid='{IMP UID}')

# 취소시 오류 예외처리(이미 취소된 결제는 에러가 발생함)
try:
    response = iamport.cancel('취소하는 이유', 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회성 비인증 결제를 진행합니다.

# 테스트용 값
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

저장된 빌링키로 재결제합니다.

# 테스트용 값
payload = {
    'customer_uid': '{고객 아이디}',
    'merchant_uid': '00000000',
    'amount': 5000,
    'name' : '제품명',
}
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

정기 결제를 예약합니다.

# 테스트용 값
payload = {
    'customer_uid': '{고객 아이디}',
    'schedules': [
        {
            'merchant_uid': 'test_merchant_01',
            'schedule_at': 1478150985,  # UNIX timestamp
            'amount': 1004
        },
        {
            'merhcant_uid': 'test_merchant_02',
            'schedule_at': 1478150985,  # UNIX timestamp
            'amount': 5000,
            'name': '{주문명}',
            'buyer_name': '{주문자명}',
            'buyer_email': '{주문자 이메일}',
            'buyer_tel': '{주문자 전화번호}',
            'buyer_addr': '{주문자 주소}',
            'buyer_postcode': '{주문자 우편번호}',
        },
    ]
}
try:
    response = iamport.pay_schedule(**payload)
except KeyError:
    # 필수 값이 없을때 에러 처리
    pass
except Iamport.ResponseError as e:
    # 응답 에러 처리
    pass
except Iamport.HttpError as http_error:
    # HTTP not 200 응답 에러 처리
    pass

정기 결제 예약을 취소합니다.

# 테스트용 값 (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

결제될 내역에 대한 사전정보를 등록합니다

# 테스트용 값
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

등록된 사전정보를 확인합니다.

# 테스트용 값
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

본인인증결과를 조회합니다.

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

본인인증결과를 아임포트에서 삭제합니다.

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      

iamport-rest-client-python's People

Contributors

94929 avatar dahlia avatar elijah74 avatar hrxorxm avatar item4 avatar james-song avatar jangbora avatar kwonsunhyun avatar moonseoklee avatar myungseokang avatar pcompassion avatar perhapsspy avatar posquit0 avatar psy2848048 avatar scari avatar sehonoh avatar smc0210 avatar sonnyson17 avatar urangurang avatar woojing avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

iamport-rest-client-python's Issues

선언된 부분과 사용하는 부분의 함수 내 인자가 다름

해당 부분params=params가 아닌 payload=params로 변경되어야 하는 것이 아닐까 생각해 이슈 작성합니다!
이와 같이 생각한 이유는 def _get(self, url, payload=None):와 같이 선언되어 있는데, 78번 라인에서는 return self._get(url, params=params)로 값을 _get 함수로 전달하고 있어 에러가 나지 않을까 싶어서 입니다! (아직 테스트해보지는 못했습니다 ㅠ)

감사합니다!

테스트 실패, test_pay_again.py

안녕하세요. 유용한 툴 만들어 주셔서 감사합니다.
혹시 테스트할 때, 아래와 같은 오류 발생하시는 분 계신가요?

$ pip list --format=columns  | grep -i iamp 
iamport-rest-client          0.5.2
$ pytest test_pay_again.py 
test_pay_again.py F

============================================================================================== FAILURES ===============================================================================================
___________________________________________________________________________________________ test_pay_again ____________________________________________________________________________________________

iamport = <iamport.client.Iamport object at 0x7f2c7aa31050>

    def test_pay_again(iamport):
        # Without 'customer_uid'
        payload_notEnough = {
            'merchant_uid': '00000000',
            'amount': 5000,
        }
    
        try:
            iamport.pay_again(**payload_notEnough)
        except KeyError as e:
            assert "Essential parameter is missing!: customer_uid" in str(e)
    
        payload_full = {
            'customer_uid': '00000000',
            'merchant_uid': '00000000',
            'amount': 5000,
        }
    
        try:
            iamport.pay_again(**payload_full)
        except iamport.ResponseError as e:
>           assert e.code == 1
E           assert -1 == 1
E            +  where -1 = ResponseError().code

test_pay_again.py:25: AssertionError
---------------------------------------------------------------------------------------- Captured stderr call -----------------------------------------------------------------------------------------
/home/harry/.virt_env/anything/local/lib/python2.7/site-packages/requests/packages/urllib3/util/ssl_.py:315: SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#snimissingwarning.
  SNIMissingWarning
/home/harry/.virt_env/anything/local/lib/python2.7/site-packages/requests/packages/urllib3/util/ssl_.py:120: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
====================================================================================== 1 failed in 0.15 seconds =======================================================================================

ResponseError에서는 이런 메시지를 보여줍니다.

(Pdb) print e.message
이미 주문이 이루어진 건입니다. (동일한 merchant_uid로 결제 또는 취소된 기록이 있습니다)

iamport에서 api가 변경이 있었던게 아닐까 추측해 봅니다.

아임포트 설치시 encoding 에러

안녕하세요.

아래 첨부한 이미지와 같은 환경에서 파이썬을 이용시 pip install iamport-rest-client를 실행하였을때 encoding error가 나게 됩니다. 일단 이 문제에 대해 해결책을 알아보면 좋을꺼 같습니다.

이 문제에 대한 직접적인 솔루션은 아니지만 간접적인 솔루이 있어 함께 공유드립니다. pip install을 사용하지 않고도 github내 iamport/client.py 파일만 불러와서 기업 서비스에 맞게 수정하면 아임포트 서비스를 모두 사용 가능합니다. 따라서 pip install이 encoding문제 뿐만 아니라 다른 여러 문제로 인해 작동을 안하시는 개발자 분들은 위 방법을 이용하시면 신속하게 아임포트 서비스를 이용하실 수 있습니다.

_modified1

2

HTTP status code가 200 OK가 아닐 경우 debug에 어려움이 있음

https://github.com/iamport/iamport-rest-client-python/blob/master/iamport/client.py#L28 쪽에서 HTTP request는 성공적으로 진행되는데, status code가 200 OK가 아닐 경우 빈 딕셔너리만 반환해서 디버깅하는데 꽤 시간이 오래 걸렸습니다 ㅠㅠ

다른 분들께서 같은 실수를 하지 않으려면 저 부분에 대해서 requests에서 넘어오는 status code, reason을 같이 반환하면 좋을 것 같습니다.

생각하고 있는 작업이 있는데, 제가 PR 생성해서 작업해도 괜찮을까요?

메인테이너 구합니다.

이 프로젝트에 제가 충분히 시간을 쓰기 어렵습니다.
추가적인 메인테이너가 이 프로젝트를 관리하는게 좋겠다고 생각합니다.
@jangbora 회사 내부에서 pypi 에 업로드 할 수 있는 계정을 하나 연동해주셔서 관리할 수 있는 상태로 두셔야 할 것 같습니다. 제가 어쩌다 보고 올리려니 거의 2년간 손을 안댄 상태가 되네요.

POST 요청시 nested 데이터 전송 필요

application/x-www-form-urlencoded 타입으로 POST전송이 기본으로 되어있습니다.

네이버페이(결제형) 환불시에 extra : {requester : "customer"} 과 같이 nested 데이터 전송이 필요합니다.
application/x-www-form-urlencoded 에서는 extra[requester]=customer 와 같이 전송되어야하는데,
iamport.cancel('test', imp_uid='nothing', extra={'requester': 'customer'})
와 같이 호출되었을 때, 실제로는 extra=requester 로 의도하지 않은 값으로 전송되는 현상이 있습니다.

application/x-www-form-urlencoded 방식으로는 명확한 해결방법을 찾기 어려워 모든 POST요청은 Content-Type: application/json 으로 변경할 것을 제안합니다.

결제 도중, 결제결과를 받지 못하면 어떻게 처리를 하나요?

javascript 로 iamport 에 결제를 요청하고 redirect_url 로 결과를 받기 전에, 서버에 이상이 있어, 결제 결과를 전달 받지 못하는 경우.

vs

결제 진행중, 결제를 마무리 하지 않고 결제 프로세스를 취소함.

두가지 case 를 어떻게 구별하나요?
status == 'paid' 로 구별하나요?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.