1. Google Console 설정
서비스 계정 생성 및 키 등록:
- Google Cloud Console에서 프로젝트 생성
- "API 및 서비스" > "사용자 인증 정보" > "+ 자격 증명 만들기" > "서비스 계정"
- 서비스 계정 생성 후 "키 추가" > "JSON" 선택하여 키 다운로드
- 이 JSON 파일은 서버에서 사용하므로 안전하게 보관
2. Google Play 콘솔 설정
앱 사용자 및 권한 등록:
- Google Play 콘솔에 접속
- "설정" > "사용자 및 권한" > "사용자 초대"
- 서비스 계정 이메일 추가
- 권한 설정:
- 재무 데이터 관련 항목 전체 체크
- 앱 액세스 권한에서 관리자 제외 나머지 항목 체크
3. 인앱 상품 및 구독 검증 API
Google Play의 결제 검증은 두 가지 API를 통해 이루어집니다.
구독 검증 API:
https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{package_name}/purchases/subscriptions/{product_id}/tokens/{token}
인앱 상품 검증 API:
https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{package_name}/purchases/products/{product_id}/tokens/{token}
- package_name: 앱의 패키지명 (예: com.example.app)
- product_id: 상품 또는 구독 ID
- token: 결제 완료 후 Flutter 앱에서 전달받은 구매 토큰
4. FastAPI 서버에서 검증 로직
토큰 발행:
- 서버에서는 Google API에 요청을 보낼 때 액세스 토큰이 필요합니다.
- 아래는 FastAPI 예제 코드입니다.
import requests
from fastapi import FastAPI
app = FastAPI()
@app.post("/verify_purchase/")
def verify_purchase(package_name: str, product_id: str, token: str, is_subscription: bool):
# Google API 토큰 발급
with open('path/to/your/json/key.json') as f:
key_data = json.load(f)
auth_url = "https://oauth2.googleapis.com/token"
payload = {
"grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
"assertion": generate_jwt(key_data)
}
response = requests.post(auth_url, data=payload)
access_token = response.json().get("access_token")
# 검증 API 호출
api_url = (f"https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{package_name}/purchases/"
f"{'subscriptions' if is_subscription else 'products'}/{product_id}/tokens/{token}")
headers = {"Authorization": f"Bearer {access_token}"}
result = requests.get(api_url, headers=headers)
return result.json()
설명:
- generate_jwt(): Google 서비스 계정 JSON 파일을 사용하여 JWT 생성 (구현 필요)
- is_subscription: 구독 여부에 따라 API URL 변경
- Google API 요청에는 반드시 Bearer 토큰 포함
5. 문제 발생 시 체크 리스트
- 서비스 계정 JSON 파일 정확히 등록했는가?
- Google Play 콘솔에서 권한 설정이 올바른가?
- API 요청 시 올바른 패키지명, 상품/구독 ID, 토큰을 사용했는가?
- 액세스 토큰이 유효한가?
- 오류가 발생하면 Google API 응답의 에러 메시지를 참고
- 401 오류가 나오면 다음 두 가지 원인을 우선 체크:
- 토큰 오류: Google Play, Google Console에 권한 및 등록이 제대로 안 되었을 가능성
- API URL 오류: 잘못된 URL 사용
- 물론 위 두 가지 외에도 다양한 원인이 있을 수 있으므로, 에러 메시지를 주의 깊게 살펴보자.