最近做了amazon的內購買功能,這裏記錄一下。
首先去amazon官網去了解一下amazon的內購規則及需要使用的插件。我是用unity進行集成的,所以下載的是unity集成的插件。
實現amazon內購買功能,需要進行三個步驟:
一、下載所使用的的unity插件,下載地址:https://developer.amazon.com/zh/apps-and-games/sdk-download
二、編寫客戶端邏輯,這個很簡單,因爲裏面的所用調用的接口不多,總共有五個調用接口。
GetUserData();啓動一個請求來檢索當前登錄用戶的用戶ID和市場。具體使用如下:
using com.amazon.device.iap.cpt;
// Obtain object used to interact with plugin
IAmazonIapV2 iapService = AmazonIapV2Impl.Instance;
void AmazonGetUserInfo(){
// Call synchronous operation with no input
RequestOutput response = iapService.GetUserData();
// Get return value
string requestIdString = response.RequestId;
}
Purchase(SkuInput input) 啓動產品的購買流程。具體使用如下:
void AmazonPurchase(){
SkuInput request = new SkuInput();
// Set input value
request.Sku = "sku";//填寫你產品應用的內購sku
// Call synchronous operation with input object
RequestOutput response = iapService.Purchase(request);
// Get return value
string requestIdString = response.RequestId;
}
GetProductData(SkusInput input) 爲最多100個sku發起檢索項目數據的請求。具體使用如下:
void AmazonGetProductInfo(){
SkusInput request = new SkusInput();
// Create list of SKU strings
List<string> list = new List<string>();
list.Add("sku1");
list.Add("sku2");
list.Add("sku3");
// Set input value
request.Skus = list;
// Call synchronous operation with input object
RequestOutput response = iapService.GetProductData(request);
// Get return value
string requestIdString = response.RequestId;
}
GetPurchaseUpdates(ResetInput input) 啓動一個請求來檢索關於客戶已購買和/或取消的項目的更新.具體使用如下:
void AmazonGetPurchaseUpdates(){
ResetInput request = new ResetInput();
// Set input value
request.Reset = true;
// Call synchronous operation with input object
RequestOutput response = iapService.GetPurchaseUpdates(request);
// Get return value
string requestIdString = response.RequestId;
}
request.Reset = true;
設置爲true以獲得所有購買的列表。設置爲false以獲取自上次調用以來的所有購買的列表,這個可以通過返回的收據單進行恢復內購操作,但是建議把恢復內購操作再服務器進行。然後在向客戶端發送是否解鎖,給用戶購買的產品的回調。
NotifyFulfillment(NotifyFulfillmentInput input) 通知亞馬遜完成購買
void AmazonNotifyFulFillment(){
NotifyFulfillmentInput request = new NotifyFulfillmentInput();
// Set input values
request.ReceiptId = "receiptID";
request.FulfillmentResult = "FULFILLED";
// Call synchronous operation with input object
RequestOutput response = iapService.NotifyFulfillment(request);
}
最後一步添加監聽事件:
iapService.AddGetUserDataResponseListener((args)=>{
string requestId = args.RequestId;
string userId = args.AmazonUserData.UserId;
string marketplace = args.AmazonUserData.Marketplace;
string status = args.Status;
});
iapService.AddPurchaseResponseListener((args)=>{
string requestId = args.RequestId;
string userId = args.AmazonUserData.UserId;
string marketplace = args.AmazonUserData.Marketplace;
string receiptId = args.PurchaseReceipt.ReceiptId;
long cancelDate = args.PurchaseReceipt.CancelDate;
long purchaseDate = args.PurchaseReceipt.PurchaseDate;
string sku = args.PurchaseReceipt.Sku;
string productType = args.PurchaseReceipt.ProductType;
string status = args.Status;
});
iapService.AddGetProductDataResponseListener((args)=>{
string requestId = args.RequestId;
Dictionary<string, ProductData> productDataMap = args.ProductDataMap;
List<string> unavailableSkus = args.UnavailableSkus;
string status = args.Status;
// for each item in the productDataMap you can get the following values for a given
// SKU
// (replace "sku" with the actual SKU)
string sku = productDataMap["sku"].Sku;
string productType = productDataMap["sku"].ProductType;
string price = productDataMap["sku"].Price;
string title = productDataMap["sku"].Title;
string description = productDataMap["sku"].Description;
string smallIconUrl = productDataMap["sku"].SmallIconUrl;
});
iapService.AddGetPurchaseUpdatesResponseListener((args)=>{
string requestId = args.RequestId;
string userId = args.AmazonUserData.UserId;
string marketplace = args.AmazonUserData.Marketplace;
List<PurchaseReceipt> receipts = args.PurchaseReceipts;
string status = args.Status;
boolean hasMore = args.HasMore;
// for each purchase receipt you can get the following values
string receiptId = receipts[0].ReceiptId;
long cancelDate = receipts[0].CancelDate;
long purchaseDate = receipts[0].PurchaseDate;
string sku = receipts[0].Sku;
string productType = receipts[0].ProductType;
});
amazon官網iap介紹(英文版):https://developer.amazon.com/zh/docs/cross-platform-plugins/cpp-use-the-iap-plugin-for-unity.html
三、測試內購產品。客戶端寫完邏輯之後需要在真機上進行測試,最好使用amazon平板。
3.1測試工具:
App Tester
先使用 App Tester 測試您的 IAP API 代碼,然後再將您的應用提交到 Amazon Appstore。
- App Tester 在沙盒模式下運行以對您的應用中的 IAP API 方法調用執行單元測試
- App Tester 截取從您的應用發送的 IAP API 請求。
- App Tester 根據您提供的 JSON 數據文件生成 API 響應。
Receipt Verification Service
Receipt Verification Service (RVS) 驗證您上傳到應用服務器的購買收據。RVS 提供沙盒環境和生產環境。
- 結合使用 RVS 沙盒環境和 App Tester 測試工具來在沙盒模式下驗證您的收據。
- 使用 RVS 生產環境在生產模式下驗證您的收據並用於 Live App Testing。
Live App Testing
使用 Live App Testing (LAT) 來通過一組選定用戶對您的應用進行 Beta 測試。目的是讓您確信您的應用能夠在生產環境中正確 運行。
- 測試人員有權在亞馬遜生產環境中訪問全套亞馬遜服務
- 不會向測試人員收取他們所進行的任何購買的費用。
3.2 測試模式
在應用開發過程中,應用經過以下測試模式。
沙盒模式
在將您的應用發佈到開發者門戶之前,應用在沙盒模式下運行。
- IAP API 自動檢測此模式。API 請求不會發送到 Appstore;它們將在本地重定向到 App Tester。
- 您可使用 App Tester 對您的應用中的 IAP API 方法調用執行單元測試。
- 您還可以使用 RVS 沙盒環境測試收據驗證。
Live App Testing (LAT) 模式
在發佈應用之前,可以在生產環境中運行應用,但使用有限的一組測試人員。
- 不會向測試人員收取他們所進行的任何購買的費用。
- 您可以使用 RVS 生產環境來驗證收據。
- Live App Testing 是可選步驟。您可以跳過 LAT 並將您的應用直接發佈到生產模式。
生產模式
在發佈應用之後,該應用在生產模式下運行。
- 來自應用的 IAP API 請求將與真實的 Amazon Appstore 交互。
- 您可以使用 RVS 生產環境來驗證收據。
- 將向用戶收取任何應用內購買(非免費)的費用。
3.3 測試過程。
按以下順序使用亞馬遜測試工具和服務,以在您將應用發佈到 Amazon Appstore 之前確保 IAP 在應用中正確運行:
-
如果需要,請卸載 SDK Tester(適用於 IAP v1.0 的測試工具)。SDK Tester 和 App Tester 安裝在同一設備上時會不兼容。
-
下載並安裝 App Tester。請參閱安裝並配置 App Tester。
-
使用 App Tester 對您的應用中的 IAP API 方法調用執行單元測試。請參閱 App Tester 用戶指南和爲 IAP 設計並執行測試案例。
-
設置 Receipt Verification Service (RVS) 沙盒環境。請參閱 Receipt Verification Service (RVS)。
-
將您的服務器配置爲使用 RVS 沙盒環境。通過 App Tester 驗證您的應用生成的收據。請參閱 Receipt Verification Service (RVS)。
-
將您的應用內項目提交到 Amazon Appstore 以進行發佈。請參閱創建並提交 IAP 項目。
-
選擇一組用戶參加通過 Live App Testing 在生產環境中對您的應用進行的 Beta 測試。請參閱 Live App Testing。
-
在發佈您的應用之後,使用 RVS 生產環境驗證來自您的應用的購買收據。請參閱 Receipt Verification Service (RVS)。
詳情請翻閱amazon官網:https://developer.amazon.com/zh/docs/in-app-purchasing/iap-testing-overview.html
在測試過程中需要創建一個json數據文件,把後臺下載下來的json文件,複製到測試設備文件系統中的/mnt/sdcard/文件夾中,具體如下:
$ adb push [_Your_JSON_File_Folder_]/amazon.sdktester.json /mnt/sdcard/amazon.sdktester.json
等我操作之後我發現也可以直接把文件拖入到設備文件管理系統中的根目錄下。具體配置步驟請參考:https://developer.amazon.com/zh/docs/in-app-purchasing/iap-install-and-configure-app-tester.html
好了,亞馬遜內購買就寫到這了,如有其它疑問請留言,我們一同探討。