JAVA 인앱 결제 ( 안드로이드 구글 구매 확정 호출 )

성난호랑이 시니철 ㅣ 2024. 4. 19. 18:03

안드로이드 구독 상품을 만들면서 구매가 취소되는 이슈를 확인했다. 

 

안드로이드 인앱 결제는 구매완료후 인앱결제 서버에 구매확정을 전송해야 하는데, 이 부분을 처리하지 않으면 3일이내 결제가 취소처리되도록 되어 있다.

. 구글이 위와 같이 권장하는 이유는 아래와 같습니다.
     - 단말의 네트워크 상태 불안정 또는 사용자 단말의 불안정성이 발생하는 경우
     - acknowledgePurchase를 호출했더라도, 구글 인앱서버에서 정상처리가 되지 않을 수 있는 경우

 

이때 구글에서는 서버에서도 구매확정을 한번더 호출 하라고 권고? 추천 하고있다.

 

단말에서 구매확정 요청을 했을때  인터넷문제나 다른문제로 호출이 안될수있다고 한다.

 

구성

 JAVA 1.8

 Maven

 Spring Boot 2.0.2

 

지금 서버 프로젝트는 Maven으로 작업 되어있어 Maven 기준으로 작성 합니다.

 

pom.xml 

    <!-- https://mvnrepository.com/artifact/com.google.api-client/google-api-client -->
        <dependency>
            <groupId>com.google.api-client</groupId>
            <artifactId>google-api-client</artifactId>
            <version>2.2.0</version>
        </dependency>
        <!-- Google Play Developer API -->
        <dependency>
            <groupId>com.google.apis</groupId>
            <artifactId>google-api-services-androidpublisher</artifactId>
            <version>v3-rev20230313-2.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.auth</groupId>
            <artifactId>google-auth-library-oauth2-http</artifactId>
            <version>1.20.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.google.http-client/google-http-client-jackson2 -->
        <dependency>
            <groupId>com.google.http-client</groupId>
            <artifactId>google-http-client-jackson2</artifactId>
            <version>1.43.1</version>
        </dependency>

 

 order.java

/*구매 확정 호출 aos*/
try {

    ClassPathResource resource = new ClassPathResource("키파일_위치.json");
    InputStream inputStream = resource.getInputStream();

    GoogleCredentials credentials = GoogleCredentials.fromStream(inputStream)
            .createScoped(AndroidPublisherScopes.ANDROIDPUBLISHER);

    AndroidPublisher publisher = new AndroidPublisher.Builder(
            GoogleNetHttpTransport.newTrustedTransport(),
            GsonFactory.getDefaultInstance(),
            new HttpCredentialsAdapter(credentials)
    ).setApplicationName("앱패키지 이름").build();

    AccessToken accessToken = credentials.refreshAccessToken();

    AndroidPublisher.Purchases.Subscriptions.Get get1 = publisher.purchases().subscriptions().get("패키지명", "구매상품아이디", "구매자 토큰값");
    get1.setAccessToken(accessToken.getTokenValue());
    SubscriptionPurchase subscriptionPurchase =  get1.execute();
    log.info("subscriptionPurchase :: "+subscriptionPurchase);
    /* 구매 확정 */
    if(subscriptionPurchase != null && !"0".equals(subscriptionPurchase.getAcknowledgementState())){
        AndroidPublisher.Purchases.Subscriptions.Acknowledge post = publisher.purchases().subscriptions().acknowledge("com.mobile.android", "구매상품아이디", "구매자 토큰값", new SubscriptionPurchasesAcknowledgeRequest());
        post.setAccessToken(accessToken.getTokenValue());
        post.execute();
    }

} catch (IOException e) {
    log.error(e.toString());
} catch (Exception e) {
    log.error(e.toString());
}

 

우선 get으로 조회 해와서 상태 확인하고 구매확정 호출하는 로직입니다.

 

구독 상품이라 purchases.subscriptions 구현 하였습니다.

구독 상품은 정해진 기간안에 재결제가 있어 배치로 항상 결제 체크를 하고 계약을 확인합니다. ( 1개월, 3개월, 6개월 마다 결제 )

※ 키 구글 AccessToken 가져오기 위함 키 json 

Google Paly Console
설정 > API 엑세스 > 서비스 계정 > 새 서비스 계정 만들기

Google Cloud Platform
키 관리 > 키 추가 > 새 키 만들기 (JSON)

 

{
  "type": "service_account",
  "project_id": "PROJECT_ID",
  "private_key_id": "KEY_ID",
  "private_key": "-----BEGIN PRIVATE KEY-----\nPRIVATE_KEY\n-----END PRIVATE KEY-----\n",
  "client_email": "SERVICE_ACCOUNT_EMAIL",
  "client_id": "CLIENT_ID",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://accounts.google.com/o/oauth2/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/SERVICE_ACCOUNT_EMAIL"
}

 

키 참조 : https://cloud.google.com/iam/docs/keys-create-delete?hl=ko

 

서비스 계정 키 생성 및 삭제  |  IAM 문서  |  Google Cloud

서비스 계정 키를 만들고 삭제하는 방법입니다.

cloud.google.com

 

아직 위 현상( 결제 후 취소 ) 재현이 안되서 잘되는지 확인은 못했습니다. 

위 소스가 잘못된거면 댓글 부탁드립니다.

감사합니다.

 

참조 : https://developer.android.com/google/play/billing/integrate?hl=ko&authuser=1#process

 

앱에 Google Play 결제 라이브러리 통합  |  Google Play's billing system  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 앱에 Google Play 결제 라이브러리 통합 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 참고: 이 주제를

developer.android.com

 

참조 : https://developers.google.com/android-publisher/api-ref/rest/v3/purchases.subscriptions?hl=ko

 

REST Resource: purchases.subscriptions  |  Google Play Developer API  |  Google for Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. REST Resource: purchases.subscriptions 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 리소스: SubscriptionPurchase S

developers.google.com

참조 : https://support.google.com/googleplay/android-developer/answer/12154973?hl=ko

 

정기 결제 이해하기 - Play Console 고객센터

도움이 되었나요? 어떻게 하면 개선할 수 있을까요? 예아니요

support.google.com

 

'공부 > JAVA' 카테고리의 다른 글

JAVA 문자열 뒤집기  (0) 2024.03.04
String 기능 모음  (0) 2024.03.04
Java AES-256 양방향 암호화  (0) 2024.02.16
for 문 종류 및 방법  (0) 2024.02.12
java 특정 날짜 요일 구하기, 날짜 하루 더하기 뺴기  (2) 2017.01.11