[Spring Boot] Google In App Purchase 인앱결제

benjamin·2023년 5월 2일

springBoot

목록 보기
1/1

ios 앱과 마찬가지로 andorid 인앱결제에 대한 서버 작업에 대해 정리


andorid 인앱결제 상품에 대해 파악해야 합니다.
소모성 상품인 일회용 상품이 있고, 정기 결제(매 월 결제) 하는 정기 결제 상품이 존재하니
해당 프로젝트의 설계에 맞는 상품을 google 에 등록하여 해당 상품을 준비하면 됩니다.

자세한 내용은 google play에서 확인 가능합니다.

google 정기결제 상품
google play console 에서 실제 상품을 등록한 내용

인앱결제에 대해 서버에서 구현해야 할 비즈니스 로직은 ios와 마찬가지로 간단합니다.
앱내 결제가 이루어지고 해당 결제 건에 대한 영수증(receipt) 데이터를 서버에 던져 검증(verify)만 통과한다면 그 이후
db에 데이터를 저장하고 해당 상품 구입에 대한 권한? 만 사용자에게 부여하면 됩니다.

google cloud console 에서 oauth2 클라이언트 등록 후 api 사용 key(json) 다운로드
해당 key(json)파일을 프로젝트 res 폴더에 복사

{
  "type": "service_account",
  "project_id": "---",
  "private_key_id": "---",
  "private_key": "-----BEGIN PRIVATE KEY-----\nMblahblah=\n-----END PRIVATE KEY-----\n",
  "client_email": "email",
  "client_id": "123",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "?"
}

해당 json key 를 이용하여 google iap(in app purchase) api 호출

gradle dependency 추가

implementation 'com.google.apis:google-api-services-androidpublisher:v3-rev20230313-2.0.0'

영수증 데이터(purchaseToken) 검증

    /**
     * 영수증 데이터(purchase token)으로 api 호출하여 정상적인 응답이 내려올 경우 responseDto에 매핑
     * @param token
     * @return
     */
    public GoogleIAPResponseDto verifyReceipt(String token) {

        AndroidPublisher publisher = null;
        GoogleIAPResponseDto googleIAPResponseDto;
        try {
            publisher = googleCredentialsConfig.androidPublisher();
            AccessToken accessToken = googleCredentialsConfig.getAccessToken();
            AndroidPublisher.Purchases.Subscriptionsv2.Get get = publisher.purchases().subscriptionsv2()
                    .get(packageName, token);
            get.setAccessToken(accessToken.getTokenValue());
            SubscriptionPurchaseV2 subscriptionPurchaseV2 = get.execute();
			
            /*
            	subscriptionPurchaseV2 객체를 dto에 매핑하는 작업 각자의 db 설계에 맞도록
            */

        } catch (IOException | GeneralSecurityException e) {
            throw new InternalServerErrorException("IAP.VALIDATE_RECEIPT_FAIL");
        }
        return googleIAPResponseDto;
    }

이후 정상적인 영수증 데이터일 경우 해당 상품의 정보를 db에 저장했습니다. (결제일, 금액, 상품에 대한 내용 등)

저 같은 경우 정기 결제(30일 이용권)을 등록하여 결제를 진행 했고 해당 상품의 내용도 api에 잘 담겨서 내려왔습니다.

ios, android 인앱결제에 대한 구현을 처음 경험했지만 생각보다 서버에서 처리할 작업이 많지는 않아 쉽게 해결했고

다음 포스팅은 ios, android 인앱결제 상품에 대해 환불(refund)에 대한 내용을 공유하겠습니다.

해당 내용은 git에 올렸습니다.

profile
긍정적이고 항상 즐겁게

1개의 댓글

comment-user-thumbnail
2023년 10월 25일

혹시 Google Play Console에서 키를 받아와도 계속 401 Unauthorization이 뜨는데 Json key를 받아오는 과정을 설명해 주실 수 있나요? API Access페이지는 deprecated됬는데 공식독스는 계속 deprecated된 방법만 알려줘서요..

답글 달기