code

Android : 인앱 구매 영수증 확인 Google Play

codestyles 2020. 10. 28. 08:07
반응형

Android : 인앱 구매 영수증 확인 Google Play


결제 게이트웨이로 Google 지갑을 사용하고 있습니다. 제품을 구매 한 후 Google에서 다음과 같은 응답을 받았습니다.

{ 
 "orderId":"12999763169054705758.1371079406387615", 
 "packageName":"com.example.app",
 "productId":"exampleSku",
 "purchaseTime":1345678900000,
 "purchaseState":0,
 "developerPayload":"bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ",
 "purchaseToken":"rojeslcdyyiapnqcynkjyyjh"
 }

구글 플레이에서 새로 도입 한 영수증 검증활용하려고하는데 구글 개발자 콘솔 에서 Permission에 서비스 계정 으로 인증서 키만들었습니다 . 하지만 Google Play 스토어에서 상품을 구매 한 후 영수증 확인 기능을 사용하는 방법이 헷갈립니다.

캔 누구 그래서 어떻게 수행하는 저를 도와주세요 영수증 검증InApp구매를.


Google은 Google Play 개발자 API를 통해 영수증 확인을 제공합니다. API 내에서 가장 관심을 가질만한 두 가지 엔드 포인트는 Purchases.products : getPurchases.subscriptions : get 입니다.

Purchases.products: get비 자동 갱신 제품 구매를 확인하는 데 사용할 수 있습니다. 여기서는 Purchases.subscriptions: get자동 갱신 제품 구독을 확인하고 다시 확인합니다.

당신이를 알고 있어야 하나 엔드 포인트를 사용하려면 packageName, productId, purchaseToken이 모든 당신이 구입받은 페이로드에서 찾을 수 있습니다. 또한 access_tokenGoogle API 서비스 계정을 만들어 얻을 수 있는 필요 합니다.

서비스 계정을 시작하려면 먼저 Google Play 개발자 콘솔 API 액세스 설정 페이지 로 이동하여 새 프로젝트 만들기 버튼을 클릭합니다.

새 Google API 프로젝트 만들기

이제 새로운 연결된 프로젝트와 몇 가지 새로운 섹션이 표시되어야합니다. 서비스 계정 섹션에서 서비스 계정 만들기 버튼을 클릭합니다.

새 서비스 계정 생성

서비스 계정을 만드는 방법이있는 정보 상자가 표시됩니다. Google Developers Console 링크를 클릭하면 새 탭이 나타납니다.

Google Developers Console을 엽니 다.

이제 새 클라이언트 ID 만들기를 클릭하고 옵션에서 서비스 계정을 선택한 다음 클라이언트 ID 만들기를 클릭합니다.

새 클라이언트 ID 생성

JSON 파일이 다운로드됩니다. 이것은 교환에 사용할 JSON 웹 토큰 access_token이므로 안전하게 보관하십시오.

그런 다음 탭을 Google Play 개발자 콘솔로 다시 전환하고 정보 상자에서 완료를 클릭합니다. 목록에 새 서비스 계정이 표시되어야합니다. 서비스 계정 이메일 옆에있는 액세스 권한 부여를 클릭합니다.

액세스 권한 부여

다음으로이 사용자의 역할 선택에서 재무를 선택하고 사용자 추가를 클릭합니다.

역할을 재무로 설정

You have now set up your service account and it has all the necessary access to perform receipt validations. Next up is exchanging your JWT for an access_token.

The access_token expires after one hour of exchange you so need some server code to handle this and Google have provided several libraries in many languages to handle this (list not exhaustive):

I won't go into detail because there is plenty of documentation on how to use these libraries, but I will mention you want to use the https://www.googleapis.com/auth/androidpublisher as the OAuth2 scope, the client_email from the JWT as the issuer and the public key you can get from the private_key and the passphrase notasecret will be used for the signing_key.

Once you have the access_token you're good to go (at least for the next hour at which point you will want to request a new one following the same process in the above paragraph).

To check the status of a consumable (non-auto-renewing) purchase make a http get request to: https://www.googleapis.com/androidpublisher/v2/applications/com.example.app/purchases/products/exampleSku/tokens/rojeslcdyyiapnqcynkjyyjh?access_token=your_access_token

If you get a 200 http response code, everything went as planed and your purchase was valid. A 404 will mean your token is invalid so the purchase was most likely a fraud attempt. A 401 will mean your access token is invalid and a 403 will mean your service account has insufficient access, check that you have enabled Finance for the access account in the Google Play Developer console.

The response from a 200 will look similar to this:

{
  "kind": "androidpublisher#productPurchase",
  "purchaseTimeMillis": long,
  "purchaseState": integer,
  "consumptionState": integer,
  "developerPayload": string
}

For an explanation of each property see https://developers.google.com/android-publisher/api-ref/purchases/products.

Subscriptions are similar however the endpoint looks like this:

https://www.googleapis.com/androidpublisher/v2/applications/packageName/purchases/subscriptions/subscriptionId/tokens/token?access_token=you_access_token

And the response should contain these properties:

{
  "kind": "androidpublisher#subscriptionPurchase",
  "startTimeMillis": long,
  "expiryTimeMillis": long,
  "autoRenewing": boolean
}

See https://developers.google.com/android-publisher/api-ref/purchases/subscriptions for the property descriptions and note that startTimeMillis and expiryTimeMillis will be subject to change depending on the duration of the subscription.

Happy validating!


Marc's answer is excellent. I will only add that the Google Play Developer API Client Library for Java makes it much simpler when connecting from your server to the Google Play servers. The library automatically handles refreshing the auth token and also provides a typesafe API so you don't have to muck around with URLs.

Here's how you setup the Publisher singleton:

httpTransport = GoogleNetHttpTransport.newTrustedTransport();
jsonFactory = JacksonFactory.getDefaultInstance();      
credential = GoogleCredential.fromStream(getClass().getResourceAsStream("/path/to/your/key.json")).createScoped(Collections.singleton(AndroidPublisherScopes.ANDROIDPUBLISHER));
publisher = new AndroidPublisher.Builder(httpTransport, jsonFactory, credential).setApplicationName(APP_NAME).build();

The following code queries a product purchase:

ProductPurchase product = publisher.purchases().products().get(PACKAGE_NAME, sku, token).execute();
Integer purchaseState = product.getPurchaseState();
product.getPurchaseTimeMillis();
product.getConsumptionState();
product.getDeveloperPayload();

You can similarly query for subscriptions:

SubscriptionPurchase sub = publisher.purchases().subscriptions().get(PACKAGE_NAME, sku, token).execute();
sub.getAutoRenewing();
sub.getCancelReason();
...

이 대답은 훌륭합니다. 지침을 따르는 동안 발생한 또 하나의 문제는 서비스 계정이 Google Play Console에 표시되지 않는다는 것입니다. 이 솔루션을 찾아서 도움을주었습니다. 서비스 계정은 생성 후 Google 콘솔에 표시되지 않습니다.

기본적으로 Google API 콘솔의 IAM으로 이동하여 새 서비스 계정을 추가하면 Google Play Console에 표시됩니다. 스크린 샷

참고 URL : https://stackoverflow.com/questions/35127086/android-inapp-purchase-receipt-validation-google-play

반응형