Scroll to top

App Store Server Notifications

이번 포스팅은 지난 모바일 앱 개발의 여정의 연장이라고 볼 수 있습니다.

지금 개발팀은 비디어스 BM과 필름업 앱 개발로 바쁜 시기를 보내고 있습니다. 그 중, 필름업 앱 얘기를 조금 해볼까 합니다.

필름업 앱은 영화를 구매하고 볼 수 있어야 하기 때문에, 인앱결제가 포함되어 있습니다.
인앱결제 중 iOS 환경에 대한 얘기를 해보려고 합니다. iOS에는 환불기능이 생긴지 얼마 되지 않습니다.

기본적으로 iOS에서의 환불은 애플에 환불을 직접 요청해야 하는 구조였습니다. 환불을 위한 API를 제공하지 않기 때문에 앱 내에 환불을 포함시킬 수 없었죠.
물론 지금은 방법이 생겼다고는 합니다. 물론 여전히 직접 API를 호출하여 Response를 받을 수 있는 구조는 아니고, 애플이 제공하는 환불 폼을 띄우는 형태입니다.

즉, 환불의 경우 무조건 애플이 제공하는 인터페이스로 제공해야 하고, 이를 서버 사이드에서 별도로 개발해야 합니다.
이 과정에서 구현을 위해 문서를 살펴보면, 꽤 불편합니다. (개인적으로 애플 개발자 문서 중 App Store Server Notifications이 보기 굉장히 불편했습니다.)

이번 포스팅에서는 이 App Store Server Notifications을 구현하고 테스트하는 과정 중 놓치기 쉬운 부분을 설명하려고 합니다.

먼저 사전에 App Store Connect에 구성해야 하는 것들이 있습니다.

  1. 앱 내 구입 용 키 생성 (사용자 및 액세스 항목에 있습니다)
  2. 앱 정보에 인앱결제 항목 추가
  3. 앱 정보에 “App Store 서버 알림”항목에 요청받을 URL 등록

상단에 쓰여진 Issuer ID와 키 ID, 그리고 p8키 파일을 다운받을 수 있는데 이 3개의 정보를 통해 API 토큰을 만들 수 있습니다.
이 토큰으로 테스트 API를 요청할 수 있습니다. 파이썬으로 테스트하기 위한 간단한 코드입니다.

pip install pyjwt cryptography
import jwt
import time

a = {}
a["alg"] = "ES256"
a["kid"] = "키 ID"
a["typ"] = "JWT"

b = {}
b["iss"] = "Issuer ID"
b["iat"] = int(time.time())
b["exp"] = int(time.time()) + 30 * 60
b["aud"] = "appstoreconnect-v1"
b["bid"] = "APP ID"

with open("KEY FILE PATH", "r") as f:
    pkey = f.read()

encode = jwt.encode(b, key=pkey, headers=a)
print(encode)

이 코드를 실행하면 토큰을 확인할 수 있고, 이 토큰을 활용하여 다양한 API를 호출할 수 있습니다. 주의해야 할 점은 exp 항목인데, 토큰의 만료시간은 현재 시간보다 30분이 넘게 설정한 채로 토큰을 생성하면 해당 토큰은 정상적으로 동작하지 않습니다.

토큰을 생성한 후 Request a Test Notification 를 참고하여 API를 호출하면 응답이 전달됩니다.
이 응답을 첫 부분만 보면 단순 토큰이나, BASE64 문자열로 생각할 수 있지만, 문서에서 알 수 있듯이 총 3개 항목으로 나뉘어져 있습니다.
3개의 항목은 점(.)으로 구분되어 있습니다. 따라서 바로 디코딩하게 되면 디코딩할 수 없다는 에러가 발생합니다.
따라서 Response가 포함되어 있는 2번째 값을 base64로 디코딩하여 원하는 결과를 가져올 수 있습니다.

import base64

token = "Response 데이터"

spl = token.split(".")
t = base64.b64decode(spl[1])
print(t.decode())

구현하고 나면 굉장히 단순했습니다. 다만 애플의 문서는 튜토리얼처럼 하나의 기능을 위한 모든 내용이 문서화 되어있지 않고, 모든 것들이 링크로 분산되어 있다 보니 우여곡절이 있었습니다.
더군다나 의외로 이와 관련된 포스팅을 찾기도 어려웠습니다.
이러한 환경의 입문자 입장에서는 자료가 많이 없어서, 개발하기 까다로웠는데 이번 포스팅으로 도움이 되길 바랍니다 😀


LAH의 소식

🦁 LAH의 블로그 LAHibrary는 매주 수요일 업데이트 됩니다.
더 많은 라이브러리 읽으러 가기


🏞 LAH의 일상이 궁금하시다면?
LAH 인스타그램 둘러보기

LAH의 서비스

내 포트폴리오도 만들고 구인구직까지 가능한, 영상 창작자 매칭 플랫폼
비디어스(Vidius) 둘러보기


🗓 한국 영화제 일정 및 정보를 한눈에 보고 싶으시다면?
🎞 내 영화를 온라인에서 판매하고 싶다면?
🍿 그동안 만나보지 못했던 나만의 영화를 디깅하고 싶다면?
필름업(FILMUP) 둘러보기


📷 촬영장비 렌탈, 한 번에 검색하고 싶으시다면?
장비모아 둘러보기