使用Android的应用内结算功能进行退款时,IN_APP_NOTIFY如何运作?

时间:2014-06-03 22:22:17

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

我们使用Titanium Studio开发了我们的应用程序,Appcelerator为In-App Billing which only support API v2提供了一个免费模块(我知道我们应该使用v3,但我们是一个独立组,因此支持API v3的模块的100美元是否定的暂时)。

我已经阅读了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);

1 个答案:

答案 0 :(得分:0)

我阅读了一段文档,其中提供了有关工作流程的更多详细信息,尤其是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广播意图消息   有关已购买商品的信息。这仅适用   将产品类型设置为&#34;对每个用户进行管理的项目   。帐户&#34;

     

在第二种情况下,您的应用程序可以收到IN_APP_NOTIFY   Google Play收到退款通知时的广播意图   Google电子钱包。在这种情况下,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 事件,退款订单将不再出现,这意味着我的无订单验证将触发,内容将被阻止。