룸톤 Roomtone 29
오늘 한 일
- 웹 결제를 한 바퀴 돌렸다. 결제 → 구독 켜짐 → 앱에서 전곡 → 해지 → 해지 예정 전환까지 끊긴 데가 없었다.
- 서버 기록도 맞았다. 상태·상품·다음 결제일·고객 번호까지 다 들어왔다.
- 제일 걱정한 자리는 결제 자체가 아니라 「결제했다는 소식이 우리 서버에 닿는가」였는데 그게 통과했다.
- 판매 페이지에 로그인한 계정 이메일을 띄웠다.
- 이유: 전에는 「로그인됨」만 떠서 계정을 여럿 쓰면 어느 계정으로 결제하는지 알 수 없었다. 결제 직전에 그걸 모르는 건 위험하다.
- 어디서 결제했는지 같이 띄웠다. 웹 카드·스토어·무료 체험을 가른다.
- 이유: 해지하는 곳이 결제한 곳마다 다르다. 모르면 「해지가 안 된다」고 여기게 된다.
- 해지 확인 메일을 보내게 했다.
- 이유: 결제사는 구독 시작 메일만 보내고 해지 메일은 안 보낸다. 돈이 걸린 일이라 확인이 없으면 불안하다.
- 언제까지 들을 수 있는지를 본문에 넣었다.
- 「구독 관리 · 해지」 버튼을 달았다. 손님이 직접 해지할 수 있다.
- 이유: 전에는 결제 메일 속 링크가 유일한 길이라, 메일을 잃어버리면 우리에게 연락해야 했다.
- 약관의 해지 경로가 웹과 스토어로 갈려 적혔다. 앱·판매 페이지에 띄운 안내와 같은 기준이다.
- 판매 페이지 검색 노출은 차단하지 않기로 했다. 결제 경로가 검증됐으니 막을 이유가 없다.
막힌 부분
- Creem에서 즉시 취소를 눌렀는데 기간 끝까지 계속 들렸다.
- 원인: 버그가 아니라 우리 방침이다. 해지해도 남은 기간은 듣게 해 준다고 적어 뒀고 그대로 돌았다. 결제사의 「즉시」는 자기네 과금을 끊는다는 뜻이지 우리 서비스를 끊으라는 지시가 아니다.
- 해결: 고칠 게 없었다. 대신 해지 확인 메일에 「언제까지 들을 수 있다」를 넣어 같은 혼동이 안 나게 했다.
손님에게 보여야 할 오류가 플랫폼 오류에 덮였다
구독 관리 버튼을 눌렀더니 요청이 실패했다. 우리가 준비해 둔 안내 문구가 아니라 플랫폼이 만든 기본 오류 화면이 떴다.
외부 서비스를 부르는 코드를 감싸 두지 않아서였다. 그쪽이 거절하면 예외가 그대로 올라가고, 그러면 플랫폼이 「서버가 응답하지 못했다」는 자기 화면을 대신 내보낸다. 우리가 뭘 안내하려 했든 거기까지 가지 못한다.
감싸고 나니 진짜 이유가 보였다. 결제사가 「이 API 키에는 그 일을 할 권한이 없다」고 거절하고 있었다. API 키는 우리 서버가 결제사에 자기를 증명하는 값인데, 만들 때 그 키로 무엇까지 할 수 있는지를 함께 정한다.
- 해결: 외부 호출을 감싸고, 사유는 서버 기록에만 남기고 손님에게는 평범한 안내를 준다.
- 교훈: 손님에게 보여 줄 오류를 준비해 두는 것과 그게 실제로 손님에게 닿는 것은 다른 일이다.
해지 메일이 첫 줄만 도착했다
해지 확인 메일을 붙이고 실제로 받아 봤는데 첫 줄만 와 있었다. 「해지되었습니다」까지만 있고 언제까지 들을 수 있는지가 없었다.
Claude가 메일 접힘인 줄 알고 펼쳐 보라고 했는데 접힌 게 아니었다. 같은 경로로 세 줄짜리를 보내 봤더니 역시 한 줄만 왔다. 텍스트만 보내면 줄바꿈이 살아남지 못한다.
여기서 더 나쁜 걸 알았다. 인증번호 메일도 같은 경로로 나간다. 번호가 셋째 줄에 있어서 똑같이 잘리고 있었다. 손님이 비밀번호를 잊어 메일을 받아도 번호를 못 보는 상태였다.
- 해결: 텍스트와 함께 HTML 본문을 같이 보내게 했다. 줄바꿈이 유지된다. 인증번호 메일로 운영에서 확인했다.
- 교훈: 보냈다는 것과 읽히는 것은 다르다. 메일은 보낸 쪽 기록만 보면 성공으로 남는다.
- 남은 한계: 9월 말에 인증번호를 시험했을 때는 번호가 보였다. 받는 쪽 사정에 따라 달라지는 것이라 그때 통과한 게 지금도 통과라는 보장이 없었다.
권한을 좁혀 둔 것이 나중에 걸렸다
결제사에 쓰는 API 키를 만들 때 「결제 만들기」 권한만 줬다. 필요한 만큼만 주는 게 맞아서 그렇게 했다.
결제사의 고객 포털(손님이 자기 구독을 직접 관리하는 결제사 쪽 페이지)을 부르려니 그게 모자랐다. 고객을 다루는 권한이 따로 있었고, 우리 API 키에는 없었다.
게다가 만든 API 키의 권한은 나중에 고칠 수 없었다. 새로 만들어 바꿔 끼워야 했다.
- 해결: 두 권한을 다 가진 API 키를 새로 만들어 교체했다. 옛 키는 새것이 도는 걸 확인한 뒤에 버렸다.
- 교훈: 권한을 좁게 주는 건 맞다. 다만 그 키로 할 일이 늘어날 수 있다는 것과, 좁힌 걸 나중에 못 넓힐 수도 있다는 것은 알고 좁혀야 한다.
- 남은 한계: API 키를 바꿔 끼우는 동안은 결제가 잠깐 끊긴다. 손님이 있을 때 하려면 순서를 정해 둬야 한다.
다음에 할 일
- 첫 알리기 — 제품 페이지·쇼츠·매장 지인
- 구독이 끝나 미리듣기로 바뀔 때 로딩이 한참 걸리는 것 — 테스트 구독 만료(5분)로 재현
- 「이 달의 신곡」 자리 — 매달 곡이 는다고 써 놓고 앱에 보여 줄 화면이 없다
- 자동 분류가 안 된 5곡 에너지를 귀로 확정 — 빠르기로 초기값만 넣어 둔 상태다
- 얇은 조합 채우기 — 앰비언트·보사노바 분위기 확장, 봄 23곡. 생성 계획으로
- 한 달 뒤 요금제를 계속 둘지 정하기 — 읽기를 줄였으니 실측으로 판단
- 12월에 스토어 외부 결제 정책 확인 — 한국 적용 약관과 표기 요건. 그때 앱에도 구독 관리 버튼을 둘지 다시 본다
- 로그스톤 샵 룸톤 상품 페이지에 스토어 이미지 올리기
- 구글 계정으로 로그인 — 붙일 때 데이터 보안 답과 개인정보처리방침도 함께
- 웹에서 듣기 — PC만 쓰는 매장이 나오면 웹판과 윈도우 앱을 비교해 정하기
- 로그스톤 샵의 개인정보처리방침·환불 조항 회신을 받아 웹 페이지 문구 맞추기
- 우리 쪽 장애로 못 들은 기간 이용 기간 늘려 주기 — 구현 뒤 로그스톤 샵에 회신
- 다음 곡 주소 미리 받기 검토 — 재생 횟수 기록을 떼는 것과 같이
- 안드로이드 패키지에 딸려 오는 윈도우용 재생 엔진 빼기 검토(다운로드 6MB 남짓)
- 매장 안내방송 — 지정 시각에 한 번 끼어들고 복귀. 음원은 서버에 올리지 않고 기기의 로컬 파일을 고른다
- 휴지통 30일 자동 정리 붙일지 검토
- 곡 풀은 분위기별 깊이로 보강, 곡 하나로 만드는 스테이션(출시 후)
- 록·메탈 곡 마스터링 — 할지 말지 미정
- 스케줄 화면 쪼개기 — 651줄에 상태·타임라인·격자·시트가 한 파일에