하튼 뭔가 딱 찾아지는 구석이 없다. 애도 적당히 태워야지. 아무리 검색하고 찾아봐야 고만고만한 놈들에 긴가민가해도 확인해보면 아닌 놈들 뿐이다.
애플, 그러니까 iOS 인앱 결재 영수증 확인 루틴은 간단하다.
주어진 URL이 있고, 거기에 HTTP-OVER-SSL로 JSON Body를 만들어서 던져주면 된다. 라이브러리 써서 빵빵빵 때리면 아주 간단한 문제다. 쓰기 싫다고 해도 그냥 cURL 정도는 쓰는걸로 하자. OpenSSL로 SSL 터널링 구현하다가 머리 다 빠지지 말고.
그런데 이걸 쓰려면 두가지 난관이 있다. 하나는 프로젝트를 만드는 것이고, 또 하나는 OAuth2 인증을 얻는 것이다. 일단 차례대로 해보면, Google Developer Console에서 저 API를 활성화 시켜야 한다. 가만 보자. Developer Console이라면..
요건 다들 알거다. 안드로이드 앱을 만들고 구글 플레이를 통해서 배포한다면, 당연히 이걸 써야 하거든. 그런데 이게 아니다.
요거다. Google Developers Console. 처음에 들어가면 아무것도 없고 프로젝트를 만들라고 한다. 잠깐. 우리는 이미 Google Play Developers Console에 프로젝트가 있다. 그런데 여기서 다시 만들면 그거 연동은 어떻게 되는거지?
결론부터 말하면 그런 연동같은거 없다. 앱은 앱대로 별개, 영수증 확인 API는 API 대로 별개다. 그래서 별도로 프로젝트를 만들어야 하는거다. 이 프로젝트 만들고 어떤 회사 어떤 게임 영수증이건 그냥 확인하면 된다. 사실 우리꺼 아니면 필요없으니 뻘짓이지만. 어떻게 보면 그것도 맞긴 하다. 굳이 우리 게임 영수증만 확인하는 API는 필요없지. 이게 어떤거든 안가리고 다 확인해준다면.
(추가 : Consent screen 항목에 들어가서 PRODUCT NAME 항목이 비어 있는지는 꼭 확인해야 한다. 이것이 비어 있으면 AuthCode 발급이 안된다.)
콘솔에 프로젝트를 만들면 위의 APIs라고 되어 있는 항목에 들어가서 Google Play Android Developer API 를 활성화 시켜준다. 기본값은 사용하지 않는 것이므로 무조건 필요하다. 그 다음에 위에 체크된 것 처럼 Credentials 탭에서 저기 보이지? 빨간 CREATE NEW CLIENT ID를 클릭한다.
인터넷 창을 열고, 주소창에 위 URL을 복사해서 넣는다. 요기서 ... 위치에 위에서 획득한 Client ID, Redirect URI를 입력한다. 잠깐. URI가 뭔가 URI 스타일이 아니라고? 일반적으로 http:// 요런게 있어야 하는데 아니라고? 괜찮다. 나도 똑같은 걱정 했었다. (...)
권한 수락 창이 뜨고, 확인을 누르면 드디어 AuthCode를 얻는다.
우리는 이제 AuthCode로 마지막 관문에 도달한거다.
https://accounts.google.com/o/oauth2/token (이것이 마지막 관문. OAuth2라고 부른다.)
여기에 HTTP-OVER-SSL로 POST 요청을 보내면 Access Token이라고 부르는 놈을 얻을 수 있다. 그리고 우리가 원하는 영수증 확인 절차를 거칠 수 있다. 그 방법은 두가지인데, 일단 위에서 AuthCode를 얻었으므로 그것으로 진행한다.
(1)은 AuthCode를 입력. (2)는 Client ID를 입력. (3)에는 Client Secret을 입력. (4)에는 Redirect URI를 입력. 뭔지 모르겠으면 위를 봐라. 그림에 다 있다.
그리고 요청을 보내면,
자 이제 우리가 쓸 수 있는 Access Token이 생겼다. 그건 좋은데, 위에 자세히 보면 expires_in 이라고 있다. 만료된다. 언제? 일반적으로 3600초 이후에. 고작 1시간 쓸 토큰 하나 만들자고 이 뻘짓을 한거다.
그러면 1시간 안에 Access Token이 만료되기 전에, 위의 예처럼 다시 POST 요청을 만들어서.. 안되지? 안된다니까. AuthCode는 1회용 인증코드다. 같은 인증 코드를 쓸 수가 없어. 권한 수락을 하고 다시 AuthCode를 얻어야 하는데 이러면 자동화가 안되지? 과감하게 버린다.
결론은 위 Body안에 있는 Refresh Token이다. 이걸 가지고 OAuth2에 다시 던져서 Access Token을 갱신할 수 있다. 이 경우에 쓰는 POST 요청은 Body가 조금 다른데,