IAP v2.0 示例 Web 应用


IAP v2.0 示例 Web 应用

Web SDK 下载中的 IAP Web 应用示例代码使用了已弃用的 IAP v1.0。

使用此 IAP v2.0 Web 应用示例链接下载 IAP v2.0 Web 应用示例。

要访问该示例,请在您的本地计算机上启动 HTTP 服务器。如果已安装 python,则可以使用 python HTTP 服务器:

  1. 解压缩下载文件。
  2. 在终端窗口中,导航至新解压缩的文件夹 (IAPv2-web-app-sample)。
  3. 输入 python -m SimpleHTTPServer 以启动 python 服务器。

有关其他服务器选项,请查看 Mozilla 文章

运行示例:

  1. 在浏览器中打开地址 http://localhost:8000。​
  2. 按照页面上的说明使用该应用

示例描述

示例中的 index.html 文件包含以下内容:

  1. 用于包含 Amazon Services 库和测试库的脚本标签。Amazon Services 库提供了 IAP v2.0 功能。
  2. 用于包含按 buttonclicker.js 文件的脚本标签。
  3. 用于三个按钮的 HTML。Button Clicker JavaScript 文件会将方法绑定到按钮操作。

Button Clicker JavaScript 文件包含以下内容:


// 这是一个简单的模型-视图-控制器设置,用于应对
// “onPurchaseResponse 可以随时被调用”这一
// 事实。
//
// 在使用 API 时,了解“响应可能随时出现”
// 这一事实非常重要。例如,在传送收据之前,
// 您的 Web 应用可能已被关闭。
// 在这种情况下,在应用程序下次运行时,
// 将在初始化 API 后传送收据。

// 模型数据
var state = {
    clicksLeft: 10,
    activeButton: "",
    hasRedButton: false,
    hasGreenButton: false,
    hasBlueButton: false,
    lastPurchaseCheckTime: null
}

// 使视图 (HTML) 看起来像模型

function refreshPageState() {
    $("#clicksLeft").text(state.clicksLeft);

    var button = $("#theButton");
    var redButton = $("#redButton");
    var greenButton = $("#greenButton");
    var blueButton = $("#blueButton");

    setClass(redButton, "locked", !state.hasRedButton);
    setClass(greenButton, "locked", !state.hasGreenButton);
    setClass(blueButton, "locked", !state.hasBlueButton);

    setClass(redButton, "active", state.activeButton == "red");
    setClass(greenButton, "active", state.activeButton == "green");
    setClass(blueButton, "active", state.activeButton == "blue");

    if (state.activeButton != "") {
        button.css("background-color", state.activeButton);
    } else {
        button.css("background-color", "gray");
    }
    persistPageState();
}

// 将状态保存到 localStorage,以使应用
// 在下次运行时与上次运行时相同。最重要的
// 是记住它的 IAP 状态,包括传递给 getPurchaseUpdates 的
// lastPurchaseCheckTime。
function persistPageState() {
    localStorage.setItem("state", JSON.stringify(state));
}

// 从 localStorage 还原状态
function loadPageState() {
    if ("state" in localStorage) {
        // 如果这是首次运行,那么我们之前设置的
        // 默认值就是我们运行时使用的默认值。
        state = JSON.parse(localStorage.getItem("state"));
    }
}

function setClass(element, className, condition) {
    if (condition) {
        element.addClass(className);
    } else {
        element.removeClass(className);
    }
}

// 控制器

// 运用消费品
function buttonPressed() {
    if (state.clicksLeft > 0) {
        state.clicksLeft--;
    } else {
        buyClicks();
    }
    refreshPageState();
}

// 运用权利
function redButtonPressed() {
    if (state.hasRedButton) {
        state.activeButton = "red";
    } else {
        buyButton("sample.redbutton");
    }
    refreshPageState();
}

// 运用权利
function greenButtonPressed() {
    if (state.hasGreenButton) {
        state.activeButton = "green";
    } else {
        buyButton("sample.greenbutton");
    }
    refreshPageState();
}

// 运用订阅
function blueButtonPressed() {
    if (state.hasBlueButton) {
        state.activeButton = "blue";
    } else {
        // 您需要购买特定订阅(连同期限)
        buyButton("sample.bluebutton.subscription.1mo");
    }
    refreshPageState();
}

function buyClicks() {
    if (window.AmazonIapV2 == null) {
        alert("You are out of clicks, however Amazon In-App-Purchasing works only with Apps from the Appstore.");
    } else if (confirm("Buy more clicks?")) {
        //window.AmazonIapV2.purchase('sample.clicks');
        var requestOptions = {
            sku: 'sample.clicks'
        };
        window.AmazonIapV2.purchase(
            function(operationResponse) {
                console.debug(operationResponse.requestId);
            },
            function(errorResponse) {
                console.debug(errorResponse);
            },
            [requestOptions]
        );
    }
}

function buyButton(buttonName) {
    if (window.AmazonIapV2 == null) {
        alert("You cannot buy this button, Amazon In-App-Purchasing works only with Apps from the Appstore.");
    } else {
        //window.AmazonIapV2.purchase(buttonName);
        var requestOptions = {
            sku: buttonName
        };
        window.AmazonIapV2.purchase(
            function(operationResponse) {
                console.debug(operationResponse.requestId);
            },
            function(errorResponse) {
                console.debug(errorResponse);
            },
            [requestOptions]
        );
    }
}

// 从回调 purchaseItem 调用的

// 处理程序函数将产生包含一个收据的购买响应
function onPurchaseResponse(e) {
    var response = e.response;
    if (response.status === 'SUCCESSFUL') {
        handleReceipt(response.purchaseReceipt);
    } else if (response.status === 'ALREADY_PURCHASED') {
        // 我们与服务器失去同步,让我们从
        // 一开始就刷新。
        var requestOptions = {
            reset: true
        };
        window.AmazonIapV2.getPurchaseUpdates(
            function(operationResponse) {
                // 处理操作响应
                var requestId = operationResponse.requestId;
                console.debug(requestId);
            },
            function(errorResponse) {
                // 处理错误响应
                console.debug(errorResponse);
            },
            [requestOptions]
        );
    } else if (response.status === 'FAILED') {
        alert('Purchase request is interrupted.Please try again later');
    } else if (response.status === 'INVALID_SKU') {
        alert('Invalid SKU.Please make sure of SKUS configuration.');
    }

    refreshPageState();
}

// getPurchaseUpdates 将返回一个收据数组
function onPurchaseUpdatesResponse(e) {
    var response = e.response;
    for (var i = 0; i < response.receipts.length; i++) {
        handleReceipt(response.receipts[i]);
    }
    state.lastPurchaseCheckTime = response.offset;
    refreshPageState();
    if (response.hasMore) {
        // 如果还有未利用此响应
        // 发送的更新,请确保
        // 我们获得了剩余的更新。
        var requestOptions = {
            reset: false
        };
        window.AmazonIapV2.getPurchaseUpdates(
            function(operationResponse) {
                // 处理操作响应
                var requestId = operationResponse.requestId;
                console.debug(requestId);
            },
            function(errorResponse) {
                // 处理错误响应
                console.debug(errorResponse);
            },
            [requestOptions]
        );
    }
}

// 在任一情况下,收据的内容都以相同的方式处理
function handleReceipt(receipt) {
    if (receipt.sku == "sample.redbutton") {
        // 权利
        state.hasRedButton = true;
    } else if (receipt.sku == "sample.greenbutton") {
        // 权利
        state.hasGreenButton = true;
    } else if (receipt.sku.substring(0, 30) == "sample.bluebutton.subscription") {
        // 订阅有时会返回父级的 ID,因此我们会与父级的 ID 进行
        // 比较
        if (receipt.cancelDate == null) {
            // 如果我们在当前期间,则 cancelDate 为 null
            state.hasBlueButton = true;
        }

    } else if (receipt.sku == "sample.clicks") {
        // 消费品
        state.clicksLeft += 10;
    }
    // 如果尚未履行,请履行收据。
    //存储 receiptId 以跟踪已履行的项目,
    //然后为状态为 FULFILLED 的 receiptId 调用 notifyFulfillment()。
    //如果该履行由于该项目针对的是之前的
    //游戏状态或由于游戏不支持该项目而无法进行,则
    //
    notifyFulfillment(receipt.receiptId);
}

/**
* @function notifyFulfillment
* @description NotifyFulfillment notifies Amazon about the purchase fulfillment.
* @param {String} receiptId receipt id
*/
function notifyFulfillment(receiptId) {
    //fulfillmentResult 的状态不能为 FULFILLED 或 UNAVAILABLE
    var requestOptions = {
        'receiptId': receiptId,
        'fulfillmentResult': 'FULFILLED'
    };
    window.AmazonIapV2.notifyFulfillment(
        function(operationResponse) {
            // 处理操作响应
            console.debug(operationResponse);
        },
        function(errorResponse) {
            // 处理错误响应
            console.debug(errorResponse);
        },
        [requestOptions]
    );

}

// 设置

function initialize() {
    loadPageState();
    amzn_wa.enableApiTester(amzn_wa_tester);
    refreshPageState();

    // “设置”按钮按下处理程序
    $("#theButton").click(function() { buttonPressed(); });
    $("#redButton").click(function() { redButtonPressed(); });
    $("#greenButton").click(function() { greenButtonPressed(); });
    $("#blueButton").click(function() { blueButtonPressed(); });

    document.addEventListener('amazonPlatformReady', function() {
        // 确保我们可以调用 IAP API
        if (window.AmazonIapV2 === null) {
            console.debug('Amazon In-App-Purchasing only works with Apps from the Appstore');
        } else {
            window.AmazonIapV2.addListener('getUserDataResponse', function(resp) {});
            window.AmazonIapV2.addListener('getProductDataResponse', function(data) {});
            window.AmazonIapV2.addListener('purchaseResponse', this.onPurchaseResponse);
            window.AmazonIapV2.addListener('getPurchaseUpdatesResponse', this.onPurchaseUpdatesResponse);
        }
    }.bind(this));
}

$(function() {
    initialize();
});