我们使用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);
答案 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 事件,退款订单将不再出现,这意味着我的无订单验证将触发,内容将被阻止。