无法在Play商店中访问应用内商品

时间:2014-05-29 23:13:15

标签: android titanium-mobile in-app-billing titanium-modules google-play

我正在使用在Titanium SDK 3.2.0.GA上开发的Android应用程序,我正在使用In-App Billing module by Appcelerator

我对模块的实现如下(省略仅用于显示日志信息的功能):

var IdentifierProduct = '';
var InAppBilling = require('ti.inappbilling');
var publicKey = Alloy.Globals.Android.publicKey_1 + Alloy.Globals.Android.publicKey_2 + Alloy.Globals.Android.publicKey_3 + Alloy.Globals.Android.publicKey_4;
InAppBilling.setPublicKey(publicKey);

function initializeBilling()
{           
    var synchronousResponse = InAppBilling.checkBillingSupported();
    displaySynchronousResponseCodes(synchronousResponse);
}

function requestPurchase(identifier, item_type)
{

    // Check if billing for current product type is supported before sending purchase request
    var checkBillingResponse = InAppBilling.checkBillingSupported(item_type);
    if (checkBillingResponse.responseCode == InAppBilling.RESULT_OK)
    {
        Ti.API.info('Current product type supported, continuing with request');

        var tmpArgs = {
            productId: identifier,
            productType: item_type,
            developerPayload: 'devPayload'
        };

        Ti.API.info('args for product request\n' + JSON.stringify(tmpArgs));
        var synchronousResponse = InAppBilling.requestPurchase({
            // productId: 'android.test.purchased',
            // productId: 'android.test.canceled',
            // productId: 'android.test.refunded',
            // productId: 'android.test.item_unavailable',
            productId: identifier,
            productType: item_type,
            developerPayload: 'devPayload'
        });
        displaySynchronousResponseCodes(synchronousResponse);
    } 
    else 
    {
        Ti.API.info('Current product type not supported, aborting request');
        displaySynchronousResponseCodes(checkBillingResponse);
    }
}

function ON_BIND_EVENT(e)
{
    if (e.result == InAppBilling.SUCCESS) {
        NotifyMe('Billing Service Bound');
        enableInAppPurchases(true);


        //Call 
    } else {
        NotifyMe('Billing Service Bind Failed');
        enableInAppPurchases(false);
    }
}
InAppBilling.addEventListener(InAppBilling.ON_BIND_EVENT, ON_BIND_EVENT);

function ON_CONNECT_EVENT(e)
{
    NotifyMe('CONNECT CALLED');
    if(Ti.App.Properties.getBool('transactionsRestores') === null)
    {
        Ti.API.info('fresh install, lets restore the transactions');
        try
        {
            InAppBilling.restoreTransactions();
        }
        catch(err)
        {
            Ti.API.info('Error');
            Ti.API.info(JSON.stringify(err));
        }
    }
}
InAppBilling.addEventListener(InAppBilling.ON_CONNECT_EVENT, ON_CONNECT_EVENT);

function RESPONSE_EVENT(e)
{
    // Events with (e.sync == true) are deprecated and will be removed. Use the event object that the methods return.
    if(!e.sync){
        NotifyMe('RESPONSE CALLED ' + e.requestId + ' ' + e.responseCode);
        Ti.API.info('RESPONSE CALLED \n' + 'Request Id:\n' + e.requestId + ' ' + '\nResponse Code:' + ResponseString(e.responseCode));
        if(e.responseCode === InAppBilling.RESULT_ERROR)
        {                       
            // Error in request
            Ti.API.info('Response event error');
            Ti.API.info(JSON.stringify(e));

        }
        else if(e.responseCode === InAppBilling.RESULT_ITEM_UNAVAILABLE)
        {

            // Item unavailable in request
            Ti.API.info('Response event item unavailable');
            Ti.API.info(JSON.stringify(e));
        }

    }
}
InAppBilling.addEventListener(InAppBilling.RESPONSE_EVENT, RESPONSE_EVENT);


function PURCHASE_STATE_CHANGED_EVENT(e)
{
    Ti.API.info('PURCHASE_STATE_CHANGED_EVENT Parameters:\n' + JSON.stringify(e) );
    NotifyMe('PURCHASE STATE CHANGED CALLED ' + e.signedData + ' ' + e.signature+'\n'+ 'SECURITY RESULT ' + e.result);

    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);

    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.
         */
        for(var i = 0; i < response.orders.length; i++)
        {
            if(typeof response.orders[i] !== 'undefined')
            {
                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);
            }
        }
    }
}
InAppBilling.addEventListener(InAppBilling.PURCHASE_STATE_CHANGED_EVENT, PURCHASE_STATE_CHANGED_EVENT);

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);

InAppBilling.startBillingService();

以下列出了我为查找错误而审核的步骤:

  • 我已检查过我的软件包名称与Play商店中的应用程序草稿中的名称相同
  • 我检查了我的许可证密钥是否正确
  • 我的所有应用内商品都处于有效状态
  • 发送到Play商店的请求包含与我的应用内商品相对应的产品ID。
  • 我的设备帐户已注册为测试帐户,因此应该让我进行购买。

我在两周前添加了应用内商品,每当我尝试请求购买时,所有这些产品都会返回未找到的响应,Play商店无法用这么长的时间来激活,对吧?

然而,我得到的回答是“找不到您试图购买的商品”。

我得到的响应代码是2,我认为这意味着 RESULT_SERVICE_UNAVAILABLE ,但是显示的对话框清楚地说明找不到该项目,我是否错误地解释了响应代码?或者我应该调查服务不可用的原因?

我跟着guide to test In-App purchases,我没有明确原因收到此错误。

修改

我一直在搜索并发现一些问题(herehere)开发人员在制作太多 restoreTransactions()时 RESULT_SERVICE_UNAVAILABLE 电话。我检查了我的代码,发现每次启动应用程序时,我都在进行 restoreTransactions()调用。

现在我已经在 ON_CONNECT_EVENT 上添加了验证,以确保是否有要恢复的事务,如果没有,那么我设置一个标志,阻止应用程序进行< em> restoreTransactions()调用它启动的下一个。

问题仍然存在,我是否可以通过某种方式与Google联系,要求再次启用我的应用内服务?我需要等多久?这些问题的用户提到它可能需要长达3周的时间,我们能否加快这一过程?

不幸的是,如果没有应用内购买,我们无法发布我们的应用。

2 个答案:

答案 0 :(得分:2)

尝试以alpha或beta版发布您的应用。他们改变了测试的方式,现在这是必需的。

干杯

答案 1 :(得分:0)

我自己是新手,但您使用的方法,属性和事件未出现在当前文档中 - 也许您的代码需要早期版本的InAppBilling。