|
| 1 | +I'mport; REST Client Python |
| 2 | +--------------------------- |
| 3 | + |
| 4 | +[](https://pypi.org/project/iamport-rest-client/) |
| 5 | +[](https://pypi.org/project/iamport-rest-client/) |
| 6 | +[](https://github.com/iamport/iamport-rest-client-python/actions) |
| 7 | +[](https://github.com/iamport/iamport-rest-client-python/blob/master/LICENSE) |
| 8 | +[](https://github.com/iamport/iamport-rest-client-python/tree/master/iamport) |
| 9 | + |
| 10 | + |
| 11 | +설명 |
| 12 | +--- |
| 13 | +> Python 개발자를 위한 [아임포트 REST API](https://api.iamport.kr/) 연동 패키지입니다. |
| 14 | +
|
| 15 | +주의 사항 |
| 16 | +------- |
| 17 | +* 이용 중 발생한 문제에 대해 책임지지 않습니다. |
| 18 | +* `lexifdev`님의 도움을 받아 작성되었습니다[`lexifdev's iamport 모듈](https://github.com/lexifdev/iamport) |
| 19 | +* 최초 작성은 `[핑크퐁 북스토어](https://store.pinkfong.com)`에서 쓰기 위해 만들었습니다. |
| 20 | + |
| 21 | +주요 기능 |
| 22 | +--- |
| 23 | +1. 결제 정보 찾기 |
| 24 | +2. 가격 확인 |
| 25 | +3. 취소 |
| 26 | +4. 비 인증 결제 |
| 27 | +5. 정기 예약 결제 |
| 28 | +6. 본인인증결과 조회 및 삭제 |
| 29 | + |
| 30 | +설치 |
| 31 | +--- |
| 32 | +[추천 사항] 아나콘다 환경에서 작업하신다면, 우선 아래의 절차를 진행해주세요. |
| 33 | +```bash |
| 34 | +# 아임포트 패키지를 위한 새로운 파이썬 가상환경을 생성해주세요. 이 때, 파이썬 버전은 최소 3.6 이상을 선택해주세요. |
| 35 | +conda create --name iamport python=3.6 |
| 36 | + |
| 37 | +# 위에서 파이썬 가상환경이 정상적으로 설치되었다면, 해당 가상환경을 활성화해주세요. |
| 38 | +conda activate pymodi |
| 39 | +``` |
| 40 | + |
| 41 | +다음 커맨드를 실행하여 최신버전의 아임포트 패키지를 설치해주세요. |
| 42 | +```bash |
| 43 | +python -m pip install iamport-rest-client --upgrade |
| 44 | +``` |
| 45 | + |
| 46 | +현재 개발중인 버전의 아임포트 패키지를 아래의 커맨드로 설치하실 수 있습니다. |
| 47 | +```bash |
| 48 | +python -m pip install git+https://github.com/iamport/iamport-rest-client-python.git@develop --upgrade |
| 49 | +``` |
| 50 | + |
| 51 | +혹은, 특정 버전의 아임포트 패키지를 다음과 같이 설치하실 수 있습니다. |
| 52 | +```bash |
| 53 | +python -m pip install git+https://github.com/iamport/ [email protected] --upgrade |
| 54 | +``` |
| 55 | + |
| 56 | +사용 준비 |
| 57 | +------- |
| 58 | +```python |
| 59 | +from iamport import Iamport |
| 60 | + |
| 61 | +# 아임포트 객체를 테스트용 키와 시크릿을 사용하여 생성합니다 (테스트시 지출된 금액은 매일 밤 환불됩니다). |
| 62 | +iamport = Iamport( |
| 63 | + imp_key='imp_apikey', |
| 64 | + imp_secret=( |
| 65 | + 'ekKoeW8RyKuT0zgaZsUtXXTLQ4AhPFW3ZGseDA6b' |
| 66 | + 'kA5lamv9OqDMnxyeB9wqOsuO9W3Mx9YSJ4dTqJ3f' |
| 67 | + ) |
| 68 | +) |
| 69 | + |
| 70 | +# 아임포트 객체를 각자 발급받으신 실제 키와 시크릿을 사용하여 생성합니다. |
| 71 | +iamport = Iamport(imp_key='{발급받은 키}', imp_secret='{발급받은 시크릿}') |
| 72 | +``` |
| 73 | + |
| 74 | +사용 예제 |
| 75 | +------- |
| 76 | + |
| 77 | +결제를 진행한 상품 아이디나, 전달받은 IMP 아이디를 이용해 결제 정보를 찾습니다. |
| 78 | + |
| 79 | +```python |
| 80 | +# 상품 아이디로 조회 |
| 81 | +response = iamport.find(merchant_uid='{상품 아이디}') |
| 82 | + |
| 83 | +# I'mport; 아이디로 조회 |
| 84 | +response = iamport.find(imp_uid='{IMP UID}') |
| 85 | +``` |
| 86 | + |
| 87 | +실제 제품 가격과 결제된 가격이 같은지 확인합니다. |
| 88 | + |
| 89 | +```python |
| 90 | +# 상품 아이디로 확인 |
| 91 | +iamport.is_paid(product_price, merchant_uid='{상품 아이디}') |
| 92 | + |
| 93 | +# I'mport; 아이디로 확인 |
| 94 | +iamport.is_paid(product_price, imp_uid='{IMP UID}') |
| 95 | + |
| 96 | +# 이미 찾은 response 재활용하여 확인 |
| 97 | +iamport.is_paid(product_price, response=response) |
| 98 | +``` |
| 99 | + |
| 100 | + |
| 101 | +결제를 취소합니다. |
| 102 | + |
| 103 | +```python |
| 104 | +# 상품 아이디로 취소 |
| 105 | +response = iamport.cancel(u'취소하는 이유', merchant_uid='{상품 아이디}') |
| 106 | + |
| 107 | +# I'mport; 아이디로 취소 |
| 108 | +response = iamport.cancel(u'취소하는 이유', imp_uid='{IMP UID}') |
| 109 | + |
| 110 | +# 취소시 오류 예외처리(이미 취소된 결제는 에러가 발생함) |
| 111 | +try: |
| 112 | + response = iamport.cancel(u'취소하는 이유', imp_uid='{IMP UID}') |
| 113 | +except Iamport.ResponseError as e: |
| 114 | + print e.code |
| 115 | + print e.message # 에러난 이유를 알 수 있음 |
| 116 | +except Iamport.HttpError as http_error: |
| 117 | + print http_error.code |
| 118 | + print http_error.reason # HTTP not 200 에러난 이유를 알 수 있음 |
| 119 | +``` |
| 120 | + |
| 121 | +1회성 비인증 결제를 진행합니다. |
| 122 | + |
| 123 | +```python |
| 124 | +# 테스트용 값 |
| 125 | +payload = { |
| 126 | + 'merchant_uid': '00000000', |
| 127 | + 'amount': 5000, |
| 128 | + 'card_number': '4092-0230-1234-1234', |
| 129 | + 'expiry': '2019-03', |
| 130 | + 'birth': '500203', |
| 131 | + 'pwd_2digit': '19' |
| 132 | +} |
| 133 | +try: |
| 134 | + response = iamport.pay_onetime(**payload) |
| 135 | +except KeyError: |
| 136 | + # 필수 값이 없을때 에러 처리 |
| 137 | + pass |
| 138 | +except Iamport.ResponseError as e: |
| 139 | + # 응답 에러 처리 |
| 140 | + pass |
| 141 | +except Iamport.HttpError as http_error: |
| 142 | + # HTTP not 200 응답 에러 처리 |
| 143 | + pass |
| 144 | +``` |
| 145 | + |
| 146 | +저장된 빌링키로 재결제합니다. |
| 147 | + |
| 148 | +```python |
| 149 | +# 테스트용 값 |
| 150 | +payload = { |
| 151 | + 'customer_uid': '{고객 아이디}', |
| 152 | + 'merchant_uid': '00000000', |
| 153 | + 'amount': 5000, |
| 154 | +} |
| 155 | +try: |
| 156 | + response = iamport.pay_again(**payload) |
| 157 | +except KeyError: |
| 158 | + # 필수 값이 없을때 에러 처리 |
| 159 | + pass |
| 160 | +except Iamport.ResponseError as e: |
| 161 | + # 응답 에러 처리 |
| 162 | + pass |
| 163 | +except Iamport.HttpError as http_error: |
| 164 | + # HTTP not 200 응답 에러 처리 |
| 165 | + pass |
| 166 | +``` |
| 167 | + |
| 168 | +정기 결제를 예약합니다. |
| 169 | + |
| 170 | +```python |
| 171 | +# 테스트용 값 |
| 172 | +payload = { |
| 173 | + 'customer_uid': '{고객 아이디}', |
| 174 | + 'schedules': [ |
| 175 | + { |
| 176 | + 'merchant_uid': 'test_merchant_01', |
| 177 | + # UNIX timestamp |
| 178 | + 'schedule_at': 1478150985, |
| 179 | + 'amount': 1004 |
| 180 | + }, |
| 181 | + { |
| 182 | + 'merhcant_uid': 'test_merchant_02', |
| 183 | + # UNIX timestamp |
| 184 | + 'schedule_at': 1478150985, |
| 185 | + 'amount': 5000, |
| 186 | + 'name': '{주문명}', |
| 187 | + 'buyer_name': '{주문자명}', |
| 188 | + 'buyer_email': '{주문자 이메일}', |
| 189 | + 'buyer_tel': '{주문자 전화번호}', |
| 190 | + 'buyer_addr': '{주문자 주소}', |
| 191 | + 'buyer_postcode': '{주문자 우편번호}', |
| 192 | + }, |
| 193 | + ] |
| 194 | +} |
| 195 | +try: |
| 196 | + reponse = iamport.pay_schedule(**payload) |
| 197 | +except KeyError: |
| 198 | + # 필수 값이 없을때 에러 처리 |
| 199 | + pass |
| 200 | +except Iamport.ResponseError as e: |
| 201 | + # 응답 에러 처리 |
| 202 | + pass |
| 203 | +except Iamport.HttpError as http_error: |
| 204 | + # HTTP not 200 응답 에러 처리 |
| 205 | + pass |
| 206 | +``` |
| 207 | + |
| 208 | +정기 결제 예약을 취소합니다. |
| 209 | + |
| 210 | +```python |
| 211 | +# 테스트용 값 (merchant_uid 가 누락되면 customer_uid 에 대한 결제예약정보 일괄취소) |
| 212 | +payload = { |
| 213 | + 'customer_uid': '{고객 아이디}', |
| 214 | + 'merchant_uid': 'test_merchant_01', |
| 215 | +} |
| 216 | +try: |
| 217 | + response = iamport.pay_unschedule(**payload) |
| 218 | +except KeyError: |
| 219 | + # 필수 값이 없을때 에러 처리 |
| 220 | + pass |
| 221 | +except Iamport.ResponseError as e: |
| 222 | + # 응답 에러 처리 |
| 223 | + pass |
| 224 | +except Iamport.HttpError as http_error: |
| 225 | + # HTTP not 200 응답 에러 처리 |
| 226 | + pass |
| 227 | +``` |
| 228 | + |
| 229 | +결제될 내역에 대한 사전정보를 등록합니다 |
| 230 | + |
| 231 | +```python |
| 232 | +# 테스트용 값 |
| 233 | +amount = 12000 |
| 234 | +mid = 'merchant_test' |
| 235 | +try: |
| 236 | + response = iamport.prepare(amount=amount, merchant_uid=mid) |
| 237 | +except Iamport.ResponseError as e: |
| 238 | + # 응답 에러 처리 |
| 239 | + pass |
| 240 | +except Iamport.HttpError as http_error: |
| 241 | + # HTTP not 200 응답 에러 처리 |
| 242 | + pass |
| 243 | +``` |
| 244 | + |
| 245 | +등록된 사전정보를 확인합니다. |
| 246 | + |
| 247 | +```python |
| 248 | +# 테스트용 값 |
| 249 | +amount = 12000 |
| 250 | +mid = 'merchant_test' |
| 251 | +try: |
| 252 | + result = iamport.prepare_validate(merchant_uid=mid, amount=amount) |
| 253 | +except Iamport.ResponseError as e: |
| 254 | + # 응답 에러 처리 |
| 255 | + pass |
| 256 | +except Iamport.HttpError as http_error: |
| 257 | + # HTTP not 200 응답 에러 처리 |
| 258 | + pass |
| 259 | +``` |
| 260 | + |
| 261 | +본인인증결과를 조회합니다. |
| 262 | + |
| 263 | +```python |
| 264 | +try: |
| 265 | + response = iamport.find_certification(imp_uid='{IMP UID}') |
| 266 | +except Iamport.ResponseError as e: |
| 267 | + # 응답 에러 처리 |
| 268 | + pass |
| 269 | +except Iamport.HttpError as http_error: |
| 270 | + # HTTP not 200 응답 에러 처리 |
| 271 | + pass |
| 272 | +``` |
| 273 | + |
| 274 | +본인인증결과를 아임포트에서 삭제합니다. |
| 275 | + |
| 276 | +```python |
| 277 | +try: |
| 278 | + response = iamport.cancel_certification(imp_uid='{IMP UID}') |
| 279 | +except Iamport.ResponseError as e: |
| 280 | + # 응답 에러 처리 |
| 281 | + pass |
| 282 | +except Iamport.HttpError as http_error: |
| 283 | + # HTTP not 200 응답 에러 처리 |
| 284 | + pass |
| 285 | +``` |
| 286 | + |
| 287 | +기여하기 |
| 288 | +------ |
| 289 | +[iamport-rest-client-python 프로젝트 보드](https://github.com/iamport/iamport-rest-client-python/projects/1)의 `To do` 탭을 참고해주세요. |
0 commit comments