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()를 하라고 되어있다. 그래서 붙여주었더니 되더라~ 라는 이야기

좋은 웹페이지 즐겨찾기