Android: перевірка квитанції про покупку inApp 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"
 }

Я намагаюся скористатися підтвердженням квитанції, що нещодавно введено в Google Play. У консолі розробника Google я зробив ключ сертифіката за обліковим записом служби в Дозволі. Але мене бентежить, як користуватися підтвердженням квитанції після придбання Продукту в магазині Google Play.

Тож будь-хто може допомогти мені, як зробити перевірку квитанції про InAppпокупку.


Привіт Бініле, ти заповнив його для придбання передплати?
Аншул Тягі

його продукт управління @Anshul Tyag
Binil Surendran

@BinilSurendran .. Моє запитання відрізняється від вашого запитання, але мені потрібно знати ідентифікатор електронної пошти, який використовувався для покупки в додатку. Ви можете допомогти, як я можу отримати цей електронний лист, оскільки він потрібен для подальшого використання в моєму додатку
Паллаві,

@Pallavi. вибачте, я не маю ідеї отримати ідентифікатор електронної пошти покупця. як відповідь, дану google після покупки, не має email_id
Binil Surendran

Відповіді:


216

Google забезпечує перевірку квитанцій через API розробника Google Play , в межах API є дві кінцеві точки, які вас найбільше зацікавлять: Purchases.products: get та Purchases.subscriptions: get .

Purchases.products: getможе використовуватися для перевірки придбання товару, що не поновлюється автоматично, де Purchases.subscriptions: getце для перевірки та повторної перевірки підписок на продукти, що поновлюються автоматично.

Для того, щоб використовувати будь-яку кінцеву точку ви повинні знати packageName, productId, purchaseTokenвсе це можна знайти в корисне навантаження ви отримали на покупку. Вам також потрібен такий, access_tokenякий ви можете отримати, створивши обліковий запис служби Google API.

Щоб розпочати роботу зі службовим обліковим записом, спочатку перейдіть на сторінку налаштувань доступу до API консолі розробника Google Play і натисніть кнопку Створити новий проект:

Створіть новий проект Google API

Тепер ви повинні побачити новий зв’язаний проект та кілька нових розділів, у розділі «Обліковий запис послуги» натисніть кнопку «Створити обліковий запис служби».

Створіть новий обліковий запис служби

Ви отримаєте інформаційне вікно з інструкціями щодо створення облікового запису служби. Натисніть посилання на Google Developers Console, і з’явиться нова вкладка.

Відкрийте Google Developers Console

Тепер натисніть Створити новий ідентифікатор клієнта, оберіть обліковий запис служби з опцій і натисніть Створити ідентифікатор клієнта.

Створіть новий ідентифікатор клієнта

Завантажиться файл JSON, це ваш веб-маркер JSON, який ви будете використовувати для обміну на, access_tokenтому захистіть його.

Потім поверніть вкладки назад на консоль розробника Google play і натисніть Готово в інформаційному полі. Ви повинні побачити свій новий обліковий запис служби у списку. Натисніть Надати доступ поруч із електронною адресою облікового запису служби.

Надати доступ

Далі в розділі Виберіть роль для цього користувача виберіть Фінанси та натисніть Додати користувача.

Встановіть роль Фінанси

Тепер ви створили свій обліковий запис служби, і він має весь необхідний доступ для перевірки квитанцій. Далі відбувається обмін вашого JWT на маркер доступу_.

access_tokenЗавершується через одну годину обміну ви так потрібні деякий код сервера впоратися з цим і Google представив кілька бібліотек на різних мовах , щоб впоратися з цим (перелік не є вичерпним):

Я не буду вдаватися в подробиці, тому що існує безліч документації про те, як користуватися цими бібліотеками, але я зазначу, що ви хочете використовувати https://www.googleapis.com/auth/androidpublisherяк область OAuth2, як client_emailіз JWT як issuerі відкритий ключ, який ви можете отримати з private_keyі парольна фраза notasecretбуде використана для signing_key.

Як тільки у вас буде все access_tokenготово (принаймні, протягом наступної години, після чого ви захочете запросити новий, виконуючи той самий процес, описаний у вищезазначеному абзаці).

Щоб перевірити статус покупки витратного матеріалу (що не поновлюється автоматично), зробіть getзапит http :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 та зауважте, що startTimeMillisіexpiryTimeMillis буде змінюватися в залежності від тривалості підписки.

Щасливого підтвердження!


Я додаю нового користувача на консолі розробника, і я отримав сертифікат JSON, який отримують із консолі. Чи можете ви допомогти мені, як зробити перевірку квитанції із завантаженим файлом @Marc Greenstock
Binil Surendran

@BinilS Вам потрібно буде бути більш конкретним, якою мовою на стороні сервера ви будете писати свій код?
Марк Грінсток

я використовую java на стороні сервера @Marc Greenstock
Binil Surendran

3
Це перший раз, коли я бачу докладний посібник із впровадження перевірки платіжності сервера за 2 дні пошуку. Пальці вгору. Чи є десь готовий до використання серверний код? Мені здається дуже дивним, що я ніде не можу знайти щось подібне
Анонім,

2
@MarcGreenstock Дякую за детальну відповідь.
Лавакуш

28

Відповідь Марка відмінна. Я лише додам, що клієнтська бібліотека API розробника Google Play для Java значно спрощує підключення з вашого сервера до серверів Google Play. Бібліотека автоматично обробляє оновлення маркера автентифікації, а також надає безпечний 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();
...

Це код на сервері Java або виконується на Android перед викликом довільного сервера?
користувач

2
@jeshurun ​​Дякую за код. Іншим читачам APP_NAME = APP_PACKAGE_NAME.
хуртовина

1
Як щодо Python?
Бабкен Варданян

1
Дякую! Для мене замість getClass().getResourceAsStream(...я використовував new FileInputStream(....
Антоніо Альмейда,

Дякую. Дуже корисний. Однак мені також потрібно було додати: credential.refreshToken();між отриманням облікових даних та видавцем.
бурчання

5

@ marc-greenstock дав чудову відповідь, однак є дуже важлива річ щодо перевірки квитанцій за допомогою API розробника Google Play для Android.

Якщо у вас виникли проблеми з використанням цього API, і ви додали продукт, що продається через програму, ДО надання дозволу або прив’язки до вашого облікового запису служби, вам потрібно відкрити "Продукти, що продаються через додаток" і виконати певне оновлення. Наприклад, ви можете редагувати опис товару та зберігати. Ви повинні негайно отримати дозвіл.

Я витратив кілька годин на роздуми, що я зробив неправильно ...


2

Ця відповідь відмінна. Ще одна проблема, з якою ми зіткнулися, дотримуючись вказівок, полягала в тому, що обліковий запис служби не відображався в Google Play Console. У підсумку ми знайшли це рішення для допомоги: обліковий запис служби не відображається в Google Console після створення

По суті, перейдіть до IAM на Google API Console і додайте новий обліковий запис служби, тоді він з’явиться на Google Play Console. скріншот


Ви можете додати тут опис. В іншому випадку, якщо посилання скасовано, ваша відповідь стає недійсною
Метьюз Сонячний

1
Якою повинна бути роль облікового запису?
Аді,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.