Как проверить биллинг Android в приложении на сервере с Ruby? - PullRequest
18 голосов
/ 12 мая 2011

У меня возникают проблемы с выяснением того, как проверять покупки Androind In-app Billing с моим сервером Ruby on Rails.

http://developer.android.com/guide/market/billing/billing_integrate.html

Я думаю, что Android предоставляет Security.javaимеет какой-то метод проверки на физическом устройстве.Из моего исследования кажется, что (1) мне нужно выяснить, как использовать этот класс Security.java с моим сервером Ruby on Rails, или (2) мне нужно перенести Security.java на Ruby.

Isэто правильно?Кто-нибудь знает другой способ проверки чека?

Ответы [ 2 ]

25 голосов
/ 16 мая 2011

Я только что понял это.

По сути, это работает так, что при успешной покупке рынок Android отправляет обратно сообщение (отформатированное в JSON) с деталями заказа и криптографической подписью. В классе Security.java функция verify проверяет подлинность сообщения из приложения Android Market, проверяя подпись с помощью вашего открытого ключа.

Если вы хотите использовать свой собственный сервер в миксе, вам просто нужно передать сигнатуру и полезную нагрузку json на ваш сервер и проверить полезную нагрузку json на вашем сервере. Если вы можете проверить, что данные json поступили из рыночного приложения, вы можете использовать их для создания объектов заказа на стороне сервера. Затем вы можете ответить клиентскому приложению, что заказ был обработан, и обновить ваш пользовательский интерфейс.

То, что я сделал в своем приложении, это просто добавил коммуникацию с сервером в функцию проверки класса Security вместо существующей функции проверки.

Настоящий трюк - написание кода проверки подписи в ruby. Вот что работает:

base64_encoded_public_key - ваш ключ в вашем профиле пользователя. sig - это свойство подписи, передаваемое в примере безопасности Dungeons data - строка json, отправленная обратно рынком.

require 'rubygems'
require 'openssl'
require 'base64'

base64_encoded_public_key = "YOUR KEY HERE"
data = "JSON_DATA_HERE"
sig = "SIGNATURE HERE"

key = OpenSSL::PKey::RSA.new(Base64.decode64(base64_encoded_public_key))

verified = key.verify( OpenSSL::Digest::SHA1.new, Base64.decode64(sig), data )
5 голосов
/ 29 сентября 2011

Это сработало для меня только после двойного Base64 декодирования подписи.

  public_key = Base64.decode64(public_key_b64)
  signature = Base64.decode64(Base64.decode64(signature_b64))
  signed_data = Base64.decode64(signed_data_b64)

  key = OpenSSL::PKey::RSA.new(public_key)
  verified = key.verify(OpenSSL::Digest::SHA1.new, signature, signed_data)
...