본문 바로가기

프로그래밍/Java

인앱결제

728x90
반응형

결제 Flow

1. 인증

구글 클라우드 플랫폼에서 서비스 계정 우측의 서비스 계정 관리를 누른 후 키 관리 > 키 추가 > 새 키 만들기

            GoogleCredentials credentials = GoogleCredentials
                .fromStream(new FileInputStream("C:\\study\\inapp\\src\\main\\resources\\credentials.json"))
                .createScoped(AndroidPublisherScopes.ANDROIDPUBLISHER);
            credentials.refreshIfExpired();

            AccessToken token = credentials.refreshAccessToken();
            System.out.println(token.toString());

인증 결과

AccessToken{tokenValue=ya29, expirationTimeMillis=1651537806287}

2. 영수증 검증

https://developers.google.com/android-publisher/api-ref/rest/v3/purchases.products/get

	AndroidPublisher publisher = new AndroidPublisher.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                GsonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credentials)
            ).setApplicationName("example").build();

            AndroidPublisher.Purchases.Products.Get get = publisher.purchases().products().get(packageName, productId, purchaseToken);
            ProductPurchase productPurchase = get.execute();
            System.out.println(productPurchase.toPrettyString());
            // 인앱 상품의 소비 상태. 0 아직 소비 안됨(Yet to be consumed) / 1 소비됨(Consumed)
            Integer consumptionState = productPurchase.getConsumptionState();

            // 개발자가 지정한 임의 문자열 정보
            String developerPayload = productPurchase.getDeveloperPayload();

            // 구매 상태. 0 구매완료 / 1 취소됨
            Integer purchaseState = productPurchase.getPurchaseState();

            // 상품이 구매된 시각. 타임스탬프 형태
            Long purchaseTimeMillis = productPurchase.getPurchaseTimeMillis();

검증 결과

{
  "acknowledgementState": 1,
  "consumptionState": 1,
  "developerPayload": "",
  "kind": "androidpublisher#productPurchase",
  "orderId": "GPA.3338-0568-9500-67910",
  "purchaseState": 1,
  "purchaseTimeMillis": "1650347811376",
  "purchaseType": 0,
  "regionCode": "KR"
}

3. 결재 취소

https://developers.google.com/android-publisher/api-ref/rest/v3/orders/refund

            Void refund = publisher.orders().refund(packageName, "GPA.3338-0568-9500-67910").execute();
            System.out.println(refund);

4. 무효화된 결재내역

https://developers.google.com/android-publisher/api-ref/rest/v3/purchases.voidedpurchases/list

            VoidedPurchasesListResponse voidedPurchasesListResponse = publisher.purchases()
                .voidedpurchases()
                .list(packageName)
                .execute();
            System.out.println(voidedPurchasesListResponse.toPrettyString());

무효화된 결재내역 결과

{
  "voidedPurchases": [
    {
      "kind": "androidpublisher#voidedPurchase",
      "orderId": "GPA.3308-4116-2515-42303",
      "purchaseTimeMillis": "1651123458478",
      "purchaseToken": "kakeidmecebghakcdjbihlfe.AO-J1OzI-2qmFvN78_QxyYuRWRhyoq0NAwIMDvET3nk9hGm-bqPZMmkVmckRc5OvQ5M7dGv5TXOaJEMU5UNcNrtSTgageabDImZyp1OyTccceCldPf5X2ow",
      "voidedReason": 1,
      "voidedSource": 1,
      "voidedTimeMillis": "1651124870903"
    }
  ]
}

Google Play 결제 시스템 주요 기능 소개 및 도입 가이드

개발자 제공 결제 시스템 시작 가이드

Google Play 커머스 세미나 영상 다시보기 

728x90
반응형