【问题标题】:How does IN_APP_NOTIFY works when a refund is performed with Android's In-App Billing?使用 Android 的应用内结算执行退款时,IN_APP_NOTIFY 如何工作?
【发布时间】:2014-06-03 22:22:17
【问题描述】:

我们使用 Titanium Studio 开发了我们的应用程序,Appcelerator 为 In-App Billing which only support API v2 提供了一个免费模块(我知道我们应该使用 v3,但我们是一个独立团体,所以 100 美元用于支持 API v3 的模块暂时是不允许的)。

我已经阅读了In-App Billing workflow for API v2 上的文档,到目前为止,购买逻辑就像一个魅力。

直到我们得到退款部分。我们在我们的应用中管理了产品和订阅。

根据文档,退款时会触发 IN_APP_NOTIFY 事件,这需要我们进行 getPurchaseInformation 调用。我们怀疑的是在我们调用 getPurchaseInformation 之后会发生什么。是否触发了 PURCHASE_STATE_CHANGED 事件?如果是,那么更新后返回带有订单的签名数据?

例如,假设用户 Uriel 购买了托管产品 A,然后 Uriel 要求退款。这将触发 IN_APP_NOTIFY 事件并进行 getPurchaseInformation 调用。

将触发什么事件,以便我可以更新应用程序以锁定用户以前可用的内容? PURCHASE_STATE_CHANGED 会被触发吗?如果是,那么带有订单信息的签名数据会返回空吗?在我的 PURCHASE_STATE_CHANGED 中,我验证是否有订单,如果没有找到订单,则所有内容都被阻止。

总之,我的猜测是对的还是退款的工作流程不同?

作为参考,这里是我的 PURCHASE_STATE_CHANGED 函数:

function PURCHASE_STATE_CHANGED_EVENT(e)
{
    Ti.API.info('PURCHASE STATE CHANGED CALLED');
    Ti.API.info('Signature Verification Result:\n' + VerificationString(e.result));
    Ti.API.info('Signed Data:\n' + e.signedData);
    /*
     * We receive an object that might look like this
     * {
     *  "nonce":-2458019374247073515,
     *  "orders":[
     *   {
     *    "notificationId":"notificationId",
     *    "orderId":"transactionId",
     *    "packageName":"my.package",
     *    "productId":"in_app_identifier",
     *    "purchaseTime":1394062412214,
     *    "purchaseState":0
     *   }
     *  ]
     * }
     */

    if (e.signedData != null) {
        var response = JSON.parse(e.signedData);
        /*
         * We are not guaranteed to have any orders returned so 
         * we need to make sure that this one exists before using it.
         * 
         * If there is no notificationId then there is no need to confirmNotifications().
         * This happens when restoreTransactions() triggers a PURCHASE_STATE_CHANGED_EVENT.
         */
        if(response.orders.length === 0)
        {
            Ti.API.info('nothing to restore');
            setNoTransactionsToRestore();
            return;
        }
        for(var i = 0; i < response.orders.length; i++)
        {
            if(typeof response.orders[i] !== 'undefined')
            {
                Ti.API.info('set purchase flag');
                setPurchaseFlag(response.orders[i].productId);
            }
            if (response.orders[i] && response.orders[i].notificationId) 
            {

                Ti.API.info('confirming notification for order ' + JSON.stringify(response.orders[i]));
                var synchronousResponse = InAppBilling.confirmNotifications({
                    notificationIds: [response.orders[i].notificationId]
                });
                displaySynchronousResponseCodes(synchronousResponse);
            }
        }
    }
    else
    {
        Ti.API.info('signed data was null');
    }
}

InAppBilling.addEventListener(InAppBilling.PURCHASE_STATE_CHANGED_EVENT, PURCHASE_STATE_CHANGED_EVENT);

还有我的 IN_APP_NOTIFY 函数:

function NOTIFY_EVENT(e)
{
    Ti.API.info('NOTIFY CALLED \n' + 'Notify Id:\n' + e.notifyId);

    var synchronousResponse = InAppBilling.getPurchaseInformation({
        notificationIds: [e.notifyId]
    });
    displaySynchronousResponseCodes(synchronousResponse);
}
InAppBilling.addEventListener(InAppBilling.NOTIFY_EVENT, NOTIFY_EVENT);

【问题讨论】:

    标签: android in-app-purchase in-app-billing titanium-modules


    【解决方案1】:

    我阅读了一份文档,其中提供了有关工作流程的更多详细信息,尤其是 IN_APP_NOTIFY 事件。 Here 是我发现的:

    处理退款和其他未经请求的 IN_APP_NOTIFY 消息

    在两种情况下,您的应用程序可能会收到 IN_APP_NOTIFY 即使您的应用程序尚未发送 REQUEST_PURCHASE 消息。图 5 显示了消息传递序列 这两种情况。每个 sendBillingRequest() 的请求类型 方法以粗体显示,广播意图以斜体显示。为了 清晰,图 5 没有显示 RESPONSE_CODE 广播意图 为每个请求发送。

    图 5. 退款和其他不请自来的消息序列 IN_APP_NOTIFY 消息。

    在第一种情况下,您的应用程序可能会收到 IN_APP_NOTIFY 当用户将您的应用程序安装在两个(或 更多)设备,并且用户从其中一个进行应用内购买 设备。在这种情况下,Google Play 会发送一条 IN_APP_NOTIFY 消息到 第二个设备,通知应用程序有购买 状态变化。您的应用程序可以以相同的方式处理此消息 处理来自应用程序启动的 REQUEST_PURCHASE 的响应 消息,以便最终您的应用程序收到一个 PURCHASE_STATE_CHANGED 广播意图消息,包括 有关已购买商品的信息。这仅适用 将产品类型设置为“按用户管理”的项目 帐户。”

    在第二种情况下,您的应用程序可以收到 IN_APP_NOTIFY 当 Google Play 收到来自的退款通知时广播意图 谷歌钱包。在这种情况下,Google Play 会发送一个 IN_APP_NOTIFY 向您的应用程序发送消息。您的应用程序可以处理此消息 它处理来自应用程序启动的响应的方式相同 REQUEST_PURCHASE 消息,以便您的应用程序最终收到 一条 PURCHASE_STATE_CHANGED 消息,其中包含有关 已退款的商品。退款信息包含在 伴随 PURCHASE_STATE_CHANGED 广播的 JSON 字符串 意图。此外,JSON 字符串中的 purchaseState 字段设置为 2。

    这意味着从 Merchant Center 进行的任何退款都将触发 IN_APP_NOTIFY,当调用 getPurchaseInformation 时,将触发 PURCHASE_STATE_CHANGED 事件并且退款的订单将不再出现,这意味着我的无订单验证将触发并且内容将被阻止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-16
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 2012-02-26
      相关资源
      最近更新 更多