3

我正在尝试在我的 android 应用程序中实现应用程序购买。我正在使用应用内计费 API v3 来实现 IAP(应用内购买)。作为参考,我正在关注 Google 提供的 trivialdrive 示例。在launchPurchaseFlow方法

public void launchPurchaseFlow(Activity act, String sku, String itemType, int requestCode,
                        OnIabPurchaseFinishedListener listener, String extraData) {
        checkSetupDone("launchPurchaseFlow");
        flagStartAsync("launchPurchaseFlow");
        IabResult result;

        if (itemType.equals(ITEM_TYPE_SUBS) && !mSubscriptionsSupported) {
            IabResult r = new IabResult(IABHELPER_SUBSCRIPTIONS_NOT_AVAILABLE, 
                    "Subscriptions are not available.");
            if (listener != null) listener.onIabPurchaseFinished(r, null);
            return;
        }

        try {
            logDebug("Constructing buy intent for " + sku + ", item type: " + itemType);
            Bundle buyIntentBundle = mService.getBuyIntent(3, mContext.getPackageName(), sku, itemType, extraData);
            int response = getResponseCodeFromBundle(buyIntentBundle);
            if (response != BILLING_RESPONSE_RESULT_OK) {
                logError("Unable to buy item, Error response: " + getResponseDesc(response));

                result = new IabResult(response, "Unable to buy item");
                if (listener != null) listener.onIabPurchaseFinished(result, null);
                return;
            }

            PendingIntent pendingIntent = buyIntentBundle.getParcelable(RESPONSE_BUY_INTENT);
            logDebug("Launching buy intent for " + sku + ". Request code: " + requestCode);
            mRequestCode = requestCode;
            mPurchaseListener = listener;
            mPurchasingItemType = itemType;
            act.startIntentSenderForResult(pendingIntent.getIntentSender(),
                                           requestCode, new Intent(),
                                           Integer.valueOf(0), Integer.valueOf(0),
                                           Integer.valueOf(0));
        }
        catch (SendIntentException e) {
            logError("SendIntentException while launching purchase flow for sku " + sku);
            e.printStackTrace();

            result = new IabResult(IABHELPER_SEND_INTENT_FAILED, "Failed to send intent.");
            if (listener != null) listener.onIabPurchaseFinished(result, null);
        }
        catch (RemoteException e) {
            logError("RemoteException while launching purchase flow for sku " + sku);
            e.printStackTrace();

            result = new IabResult(IABHELPER_REMOTE_EXCEPTION, "Remote exception while starting purchase flow");
            if (listener != null) listener.onIabPurchaseFinished(result, null);
        }
    }

在上面的代码getBuyIntent中并不期望nonce,我们有额外的数据,我们在其中传递 developerpayload(特定于每个购买项目)。在这里,我无法弄清楚如何传递 nonce,因为它是在 API V2 中传递并作为成功购买的响应而收到的。nonceV3中不需要吗?

谢谢

4

2 回答 2

3

使用 IAB API v3 时,只需使用您从 Google Play 收到的原始 JSON 响应,并使用签名和公共 RSA 对其执行 OpenSSL 验证。

最好通过自己的 API 执行此检查,因为在应用程序中捆绑公共 RSA 密钥是不安全的。这是此 OpenSSL 验证的 PHP 示例。

如该示例所示,它只是从请求中获取参数:响应数据和签名,并使用公钥对其进行验证。

您只需要篡改您的应用程序和 API 中的原始 JSON 数据,以便了解用户购买了什么,而不是验证购买本身的有效性。

简而言之:不要担心随机数。IAB API v3 删除了它,您不必担心它的缺失。

于 2013-05-27T15:45:16.197 回答
0

APIv3 返回 orderId,可以作为 nonce 来避免重放攻击。

于 2016-09-29T14:45:39.537 回答