Django에서 toss 결제 연동하기
이번 프로젝트를 하며 기존 이니시스 결제를 탈피하고 카카오페이와 토스를 붙여달라는 요청을 받았다. 공식문서에는 분명 30분만에 된다고 했으나 나는 왜 이틀이 걸렸는지에 대한 후기. 여기를 들어가면 모든 에러코드를 볼 수 있지만 어떻게 해결해야 하는지에 대한 이야기는 없다. 내가 마주한 에러와 해결방법을 정리해봤다.
참고: 이 문서는 django를 활용한 백엔드 관점에서 작성되었습니다.
내가 마주한 에러
1. 필수 파라미터가 누락되었습니다.
해결방법 1: 딕셔너리 형태의 바디를 스트링으로 파싱해서 리퀘스트를 전송해야 한다. 딕셔너리에 str()을 써서 보내려고 했는데 str은 문자와 숫자의 변환만을 지원한다는 사실을 잊고 있었다. json.dumps를 사용해서 보내니 성공.
2. 403 - UNAUTHORIZED_KEY 인증되지 않은 시크릿 키 혹은 클라이언트 키입니다.
해결방법 1: base64로 인코딩한다.
def encode_key(secret_key: str) -> str:
secret_key_bytes = secret_key.encode('ascii')
secret_key_base64 = base64.b64encode(secret_key_bytes)
secret_key_base64_str = secret_key_base64.decode('ascii')
return secret_key_base64_str
3. 'code':'INVALID_API_KEY', 'message': 잘못된 시크릿키 연동 정보 입니다.'
해결방법 1: 시크릿 키에 콜론을 붙인다.
해결방법 2: 해당 결제건을 시행한 클라이언트 키와 짝이 맞는 시크릿 키를 쓴다. 해당 결제건에는 고유의 paymentKey가 생기는데 여기에 어떤 클라이언트 키가 사용되었는지 정보도 담겨 있는 것 같다. 그러니까 테스트 클라이언트 키로 결제건을 생성했으면 테스트 시크릿키로 결제를 완료하고, 라이브 클라이언트 키로 결제건을 생성했으면 라이브 시크릿키로 결제를 완료한다.
4: Remote end closed connection without response site
해결방법:
- 약간... 이것 때문에 굉장히 속상했었다. 실서버에서는 문제 없이 결제가 되는데 스테이징에서만 나왔던 에러..
- 알고 보니 http.client에서는 커넥션을 직접 닫아주어야 한다. 아래는 토스에서 직접 준 예제:
import http.client
conn = http.client.HTTPSConnection("api.tosspayments.com")
payload = "{\"amount\":15000,\"orderId\":\"JAL3FBfXGCHIZnczb0whc\"}"
headers = {
'Authorization': "Basic dGVzdF9za19YakV4UGVKV1lWUWJkV0d6YlpvcjQ5UjVndk5MOg==",
'Content-Type': "application/json"
}
conn.request("POST", "/v1/payments/5zJ4xY7m0kODnyRpQWGrN2xqGlNvLrKwv1M9ENjbeoPaZdL6", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
공식문서를 보면 res.read() 다음에 conn.close()를 하라고 되어있다. 그래서 붙여주었더니 되더라~ 라는 이야기
Author And Source
이 문제에 관하여(Django에서 toss 결제 연동하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sylee0427/Django에서-toss-결제-연동하기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)