如何使用Java(Servlet)验证针对应用内结算Android Market的签名数据

时间:2011-11-03 13:47:29

标签: java android servlets in-app-billing

在实施针对Android应用的应用内结算时,我遇到了一个问题。

让我先解释一下情景 我们有一个内容服务器(数据服务器),其中包含产品列表 当用户从列表中选择一个时,他就可以购买它 在我使用我的测试帐户输入信用卡详细信息后,购买逻辑运行完美 在回报中,我在Android设备中获得了签名数据。

我的问题是 1.我是否必须验证Android设备中签名的数据,然后将一些信息或数据发送到内容服务器,然后发送产品(我认为这可能不太好,因为没有在服务器端流动以验证请求是否有效或更准确;签名数据是否由谷歌市场生成)?
2.如果我必须在服务器端验证数据,我该怎么做?我是否必须将其发送到 Google市场(如果是,使用哪种网络服务或API)?

请帮我纠正这个问题 提前谢谢。

2 个答案:

答案 0 :(得分:3)

对于第二个问题,哈希(例如:MD5,SHA)数据并将哈希与数据一起发送到服务器。在服务器上,创建数据的哈希并比较哈希以验证它们。

答案 1 :(得分:2)

要回答您的问题,您必须先使用某种ID创建应用内商品,然后将其绑定到服务器上的数据库中。使用webservices,然后查询数据库并查看应用程序内ID是否与产品数据库中的ID匹配。另外,您可以使用安全Nonces和签名进行验证。大多数情况下,您让谷歌处理这些产品,因此您需要在数据库之后对应用内产品进行建模。如果您的产品太多,那么您将不得不以创建移动网站的标准方式处理它......

编辑: 那么当您提出请求(即购买)时,首先执行REQUEST_PURCHASE,然后启动Market返回的PendingIntent。然后你就可以处理Market发送的广播意图了。您在请求中指定了四个密钥,然后发出购买请求:

  Bundle request = makeRequestBundle("REQUEST_PURCHASE");
  request.putString(ITEM_ID, mProductId);

  // Note that the developer payload is optional.
  if (mDeveloperPayload != null) {
      request.putString(DEVELOPER_PAYLOAD, mDeveloperPayload);
      Bundle response = mService.sendBillingRequest(request);
      // Do something with this response.
  }

然后你必须使用PendingIntent来启动checkoutUI(小心1.6到2.0的差异,其中1.6要求它与Activity分开启动)。看一下Google示例中的PurchaseObserver.java。

“Android Market应用程序发送RESPONSE_CODE广播意图,提供有关请求的错误信息。如果请求未生成错误,则RESPONSE_CODE广播意图返回RESULT_OK,表示请求已成功发送。(要成为清除,RESULT_OK响应并不表示请求的购买成功;它表示请求已成功发送到Android Market。)“