- PVSM.RU - https://www.pvsm.ru -
Я думаю многие знают что такое Freedom. Для тех кто не знает — это приложение под Android, позволяющее делать внутриигровые покупки в других приложениях без траты денег.
Описание:
Вам надоели предложения в играх и программах что-то купить(расширения, монетки и т.п.)? Покупайте их бесплатно с помощью Freedom!
Пользоваться очень просто: устанавливаете, запускаете (первый запуск может занять какое-то время — до нескольких минут), тапаете по приложению — оно запускается. После этого оно возможно пройдёт проверку лицензии, а при покупке из приложения Вы сможете расплачиваться фэйковой карточкой.
Ссылка на статью автора: habrahabr.ru/post/163547/ [1]
Я до определенной поры игнорировал этот прискорбный факт, тем более что я в какой-то степени согласен с автором, что те кто пользуются этим софтом и так врядли бы купили что-то у меня в игре. Но новый проект над которым мы работаем должен стать мультиплеерным. А это значит, что читеры получат реальное преимущество перед обычными игроками, что меня не особо радует.
Покурив вечером мануалы по Google API я решил соорудить собственную проверку валидности покупок. Т.к. мы используем Unity3D + Prime31 IAP, пришлось их немного обработать напильником, чтобы они начали выдавать purchase token.
Для меня архитектура этого дела выглядит вот так:

Два веб-сервера нужны для того чтобы отделить логику работы конкретной игры от проверки валидности покупки, которая общая для всех игр.
Алгоритм такой:
Про веб сервер игры я писать не буду, так как это выходит за рамки этой статьи.
Сервер лицензий написан на Django. Для тех кто желает написать велосипед самостоятельно — в конце статьи есть куски кода на питоне.
GitHub source: github.com/Agasper/django-google-play-check-payment [2]
Создаем виртуальное окружение, клонируем проект и устанавливаем зависимости
virtualenv .
git clone https://github.com/Agasper/django-google-play-check-payment.git project
source ./bin/activate
pip install -r ./project/req.txt
Project -> APIS & AUTH -> APIs и включаем Google Play Android Developer APIProject -> APIS & AUTH -> Credentials, нажимаем Create new Client ID и создаем новый Service Accountkeys в корне проектаНастройки -> Аккаунты и права доступаПригласить пользователя и введите e-mail сервисного аккаунта, который вы создали в пункте 4-5ФинансыВсе что написано ниже запускается в тестовом режиме, если вы хотите использовать Django в боевых условиях, то есть отдельные статьи как это настроить. Например вот: habrahabr.ru/post/226419/ [5]
./manage.py runserver 0.0.0.0:8000
Пример запроса:
http://host:8000/license?package=<package_name>&sku=<product_id>&service=<account>&key=<key>&token=<token>
, где:
Ответ в случае успешной покупки:
<?xml version="1.0" encoding="UTF-8"?><result consumptionState="1" purchaseState="0" purchaseTime="1405003881937" status="0" />
и если кто-то подсунул неверный токен
<?xml version="1.0" encoding="UTF-8"?><result message="Invalid Value" status="1" />
отличаются статусом, в случае успеха он равен нулю.
Для работы требуется Google API Python Client, для удобства я статично добавил его в проект.
Линк: code.google.com/p/google-api-python-client/source/browse/ [6]
Вся магия содержится в одной маленькой функции:
from oauth2client.client import SignedJwtAssertionCredentials
from apiclient.discovery import build
credentials = SignedJwtAssertionCredentials(
service,
key_content,
scope='https://www.googleapis.com/auth/androidpublisher')
http = httplib2.Http()
http = credentials.authorize(http)
service = build("androidpublisher", "v1.1", http=http)
result = service.inapppurchases().get(packageName=package, productId=sku, token=token).execute(http=http)
Внутри result лежит dict с параметрами покупки. В случае ошибки возникнет Exception с довольно скудным описанием проблемы
Автор: agasper
Источник [7]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/android/65901
Ссылки в тексте:
[1] habrahabr.ru/post/163547/: http://habrahabr.ru/post/163547/
[2] github.com/Agasper/django-google-play-check-payment: https://github.com/Agasper/django-google-play-check-payment
[3] console.developers.google.com/project: https://console.developers.google.com/project
[4] play.google.com/apps/publish/: https://play.google.com/apps/publish/
[5] habrahabr.ru/post/226419/: http://habrahabr.ru/post/226419/
[6] code.google.com/p/google-api-python-client/source/browse/: https://code.google.com/p/google-api-python-client/source/browse/
[7] Источник: http://habrahabr.ru/post/229461/
Нажмите здесь для печати.