如何通过Ruby服务器验证Android In-app Billing?

时间:2011-05-11 21:48:38

标签: java android ruby-on-rails ruby in-app-billing

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

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

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

这是对的吗?有谁知道验证收据的另一种方式?

2 个答案:

答案 0 :(得分:25)

我只是想出来了。

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

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

我在我的应用程序中所做的只是添加安全类中的服务器通信内容'验证功能代替现有的验证功能。

真正的诀窍是在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 )

答案 1 :(得分:5)

只有在对签名进行双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)