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


问题内容

我在弄清楚如何用我的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。

这样对吗?有人知道验证收据的另一种方法吗?


问题答案:

我只是想通了。

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

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

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

真正的窍门是用ruby编写签名验证代码。这是有效的方法:

base64_encoded_public_key是用户配置文件中的密钥sig是传递到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 )