如何验证 Android 应用内结算与使用 Ruby 的服务器?

我无法弄清楚如何使用我的Ruby on Rails服务器验证Androind应用内计费购买。

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

我认为Android提供了一种安全.java,它具有某种在物理设备上进行验证的方法。从我的研究中,似乎(1)我需要弄清楚如何将这个安全.java类与我的Ruby on Rails服务器一起使用,或者(2)我需要将Security.java移植到Ruby。

这是正确的吗?有谁知道验证收据的另一种方法吗?


答案 1

我刚刚想通了这一点。

基本上,它的工作方式是,当购买成功时,Android市场会发回一条消息(格式化为JSON),其中包含订单详细信息和加密签名。在 Security.java 类中,verify 函数通过使用您的公钥验证签名来确保消息确实来自 Android 市场应用程序。

如果要在组合中使用自己的服务器,只需将签名和 json 有效负载传递到服务器,并验证服务器上的 json 有效负载。如果可以验证 json 数据是否来自市场应用程序,则可以使用它来创建服务器端订单对象。然后,你可以响应客户端应用程序已处理订单并更新 UI。

我在应用中所做的只是在 Security 类的 verify 函数中添加服务器通信内容,而不是现有的 verify 函数。

真正的诀窍是用ruby编写签名验证码。以下是有效的方法:

base64_encoded_public_key是您在用户配置文件中的密钥,则签名属性被传递到Dungeons安全示例数据中,是市场发回的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 )

答案 2

这仅在签名的双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)

推荐