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


92

결제 게이트웨이로 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구매를.


안녕하세요 Binil, 구독 구매를 완료 하셨나요?
Anshul Tyagi 2016

그 관리 제품 @Anshul Tyag
Binil Surendran

@BinilSurendran .. 제 질문이 귀하의 질문과 다르지만 인앱 구매에 사용 된 이메일 ID를 알고 싶습니다. 당신은 내가 내 응용 프로그램에 더 참조 할 수 있도록 필요에 따라, 이메일을 얻을 수있는 방법에 도움을 기쁘게 할 수
팔라

@Pallavi. 죄송합니다. 구매자 이메일 ID를받을 생각이 없습니다. 구매 후 Google에서 제공 한 응답으로 email_id가 없습니다
Binil Surendran

답변:


216

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 개발자 콘솔로 다시 전환하고 정보 상자에서 완료를 클릭합니다. 목록에 새 서비스 계정이 표시되어야합니다. 서비스 계정 이메일 옆에있는 액세스 권한 부여를 클릭합니다.

액세스 권한 부여

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

역할을 재무로 설정

이제 서비스 계정을 설정했으며 영수증 확인을 수행하는 데 필요한 모든 액세스 권한이 있습니다. 다음은 JWT를 access_token으로 교환하는 것입니다.

access_token교환 한 시간이 그렇게 일부 서버 코드는이 문제를 처리하기 위해 구글이 (완전한되지 목록)이 문제를 처리하기 위해 여러 언어로 여러 라이브러리를 제공하고 필요 후에 만료 :

이 라이브러리를 사용하는 방법에 대한 문서가 많이 있기 때문에 나는 세부 사항으로 가지 않을 것이다,하지만 난 당신이 사용하려는 언급 할 것이다 https://www.googleapis.com/auth/androidpublisher는 OAuth2를 범위로 client_emailJWT에서와 같은 issuer공개 키 당신이에서 얻을 수있는 private_key및 암호 notasecretsigning_key.

일단 당신은 access_token갈 수 있습니다 (적어도 다음 시간 동안 위 단락의 동일한 프로세스에 따라 새로운 것을 요청하고 싶을 것입니다).

소모품 (자동 갱신 불가) 구매 상태를 확인하려면 다음 주소로 http get요청을하십시오.https://www.googleapis.com/androidpublisher/v2/applications/com.example.app/purchases/products/exampleSku/tokens/rojeslcdyyiapnqcynkjyyjh?access_token=your_access_token

200 http 응답 코드를 받으면 모든 것이 계획대로 진행되고 구매가 유효합니다. 404는 토큰이 유효하지 않음을 의미하므로 구매가 사기 시도 일 가능성이 높습니다. 401은 액세스 토큰이 유효하지 않음을 의미하고 403은 서비스 계정에 액세스 권한이 부족함을 의미합니다 . Google Play 개발자 콘솔에서 액세스 계정에 재무 를 사용 설정 했는지 확인 하세요.

200의 응답은 다음과 유사합니다.

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

각 속성에 대한 설명은 https://developers.google.com/android-publisher/api-ref/purchases/products를 참조 하세요 .

구독은 비슷하지만 끝점은 다음과 같습니다.

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

응답에는 다음 속성이 포함되어야합니다.

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

참조 https://developers.google.com/android-publisher/api-ref/purchases/subscriptions을 속성 설명 및 참고 startTimeMillisexpiryTimeMillis피사체가 가입 기간에 따라 변경 될 것입니다.

감사합니다!


나는 개발자 콘솔에서 새 사용자를 추가하고 난 당신이 나를 어떻게 다운로드 한 파일 @Marc 그린 스톡과 영수증 유효성 검사를 할 수 있도록 도와 주시기 바랍니다 console.Can에서 얻을 JSON 인증서를 가지고
Binil Surendran

@BinilS 좀 더 구체적이어야합니다. 코드를 작성할 서버 측 언어는 무엇입니까?
마크 그린 스톡

서버 측 @Marc 그린 스톡에 자바를 사용하고
Binil Surendran에게

3
검색 2 일 만에 서버 결제 유효성 검사를 구현하는 자세한 가이드를 본 것은 이번이 처음입니다. 엄지 손가락. 어딘가에 서버 코드를 사용할 준비가되어 있습니까? 나는 그 어느 곳과 같이 찾을 수없는 아주 이상한 찾을
익명

2
@MarcGreenstock 자세한 답변에 감사드립니다.
Lavakush

28

Marc의 대답은 훌륭합니다. 난 단지 것을 추가 할 것입니다 자바를위한 Google Play 개발자 API 클라이언트 라이브러리는 구글 플레이 서버로 서버에서 연결할 때 훨씬 간단합니다. 라이브러리는 자동으로 인증 토큰 새로 고침을 처리하고 형식이 안전한 API를 제공하므로 URL을 다룰 필요가 없습니다.

Publisher싱글 톤 을 설정하는 방법은 다음과 같습니다 .

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();

다음 코드는 제품 구매를 쿼리합니다.

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

유사하게 구독을 쿼리 할 수 ​​있습니다.

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

이것은 자바 서버의 코드입니까, 아니면 임의의 서버를 호출하기 전에 Android에서 실행됩니까?
사용자

2
@jeshurun ​​코드 주셔서 감사합니다. 다른 독자들에게 APP_NAME = APP_PACKAGE_NAME.
blizzard

1
파이썬은 어떻습니까?
Babken Vardanyan

1
감사합니다! 대신 나를 getClass().getResourceAsStream(...위해 new FileInputStream(....
António Almeida

감사. 매우 유용한. 그러나 credential.refreshToken();자격 증명과 게시자 사이 에 추가해야했습니다 .
grooble

5

@ marc-greenstock은 훌륭한 답변을 제공했지만 Google Play Android Developer API를 사용한 영수증 확인에 대해 매우 중요한 점이 있습니다.

이 API 사용에 문제가 있고 권한을 부여하거나 서비스 계정에 연결하기 전에 인앱 상품을 추가 한 경우 '인앱 상품'을 열고 몇 가지 업데이트를 수행해야합니다. 예를 들어 제품 설명을 편집하고 저장할 수 있습니다. 즉시 허가를 받아야합니다.

나는 내가 뭘 잘못했는지 생각하면서 몇 시간을 보냈다 ...


2

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

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


여기에 설명을 추가 할 수 있습니다. 그 밖에 한 번 링크가 취소 된 경우 대답은 무효집니다
써니 매튜스

1
추가 된 계정의 역할은 무엇입니까?
Adi '
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.