《Android》『In-app Billing V3 API』- 應用程式內購買的基本 ...
文章推薦指數: 80 %
當虛擬貨品消耗成功以後,我們就可以去執行我們要做的動作,像是為使用者增加汽油或者魔法石…等等。
《程式測試》. 要測試透過IAB 所寫的金流服務程式碼,有兩種方式, ...
《AndroidDevelopers參考文獻》
➥In-appBilling
➥SellingIn-appProducts
➥ImplementingIn-appBilling
《簡單介紹》
In-appBilling(應用程式內購買),這個功能是現在幾乎所有免費的手機應用程式,都會使用到的一種金流服務,在Android中,GooglePlay提供了一個稱為InAppBillingV3的API,讓程式開發者可以透過這個API,不用直接處理任何交易,而是將訂單需求傳給Googleplay,由GooglePlay 幫忙處理所有交易結帳的細節並提供反饋,透過這種方式,可以確保使用者的購買體驗都是熟悉且一致的流程。
InAppBillingV3API支援了所有Android2.2以上的版本。
我們可以透過GooglePlay所提供的內購服務來購買很多東西,像是可以提供下載的影音檔案或者是相片;虛擬道具像是遊戲裡的等級或點數等等。
所有透過GooglePlay發布的程式都可以使用其所提供的應用程式內購買流程,只要有開發者帳戶以及商家電子錢包即可,這些都可以在開發者管理後台設定。
《特性》
在GooglePlay所提供的金流服務中,應用程式內購買的商品有分兩種類型–
1.一次性購買的產品(消耗性商品、買斷型商品)
2.經常性、自動計費的產品(訂閱)
In-appBilling只能用來販賣數位的內容,不能販賣實體商品、實體服務或者任何需透過寄送才能取得的商品。
若是購買訂閱類型的商品,使用者可以在購買後的『試用時間』內由使用者自己取消購買;值得注意的一點是,當使用者付費購買內購商品時,是沒有退款的機制讓使用者自己取消購買的(但可寫信給開發者,由開發者決定是否取消該次付款)。
在GooglePlay的規範中,所有的購買行為都是受到管理的,意思是GooglePlay持續追蹤所有內購商品的擁有權,也就是說,當一件一次性購買的商品被使用者所購買以後,該商品儲存在GooglePlayServer中的狀態,會被改成『已被使用者擁有』的狀態,當商品處於這個狀態的時候,使用者是無法重複做購買的,因此,若是販賣一次性的商品,開發者必須額外去定義這個商品是消耗性的商品或者是買斷型的商品,若是消耗性的商品(像是神魔之塔裡面的魔法石),則在使用者完成購買此商品後,應用程式必須送出一個consumePurchase()的指令給GooglePlayServer,告知這件商品已被消耗,GooglePlay便會將該商品的擁有權改成為『未被擁有』的狀態,使用者方能再次購買該商品。
相關的流程圖如下–
ConsumableIn-appProducts
《In-appBillingV3API的購買商品流程》
在In-appBillingV3API(以下簡稱IAB)的購買商品流程中,主要分為四個步驟,圖示如下–
PurchasingItemsFlow
Step1–isBillingSupported()
在執行購買流程的時候,首先,應用程式會送出一個isBillingSupported()的請求,向GooglePlay確認目前這個程式所使用的In-appBillingAPI的版本是否支援付款。
Step2–getPurchases()
接著,當應用程式被啟動或者使用者登入以後,就是檢查使用者擁有哪些購買項目的時候。
要查詢使用者購買過哪些內購式商品,應用程式可以送出getPurchases()的請求。
如果請求成功,會回傳一個Bundle,此Bundle包含了以下資訊:
已購買商品的ID清單
個人的購買明細清單
為購買簽名的清單。
Step3–getSkuDetails()
檢查完成以後,通常來說,開發者會想要告訴使用者,目前有哪些商品可以購買,要查詢開發者在GooglePlay定義的可內購式商品的細節,應用程式可以送出getSkuDetails()的請求,在查詢請求中必須指定產品的SKUID(也就是ProductID),查詢成功則會回傳一個Bundle,此Bundle包含了指定ID產品的相關細節,像是產品名稱、產品描述、產品定價…等等。
Step4.1–getBuyIntent()、startIntentSenderForResult()
假如某個內購式商品尚未屬於使用者,開發者就可以對使用者顯示購買提示(像是購買按鈕),當使用者按下按鈕送出購買請求後,應用程式就會送出getBuyIntent()的請求,指定該項商品的SKUID及其他參數來購買。
當使用者送出購買請求後,GooglePlay會回傳一個內含PendingIntent的Bundle,可以讓使用者開始付款結帳的界面。
應用程式會呼叫startIntentSenderForResult來啟動這個PendingIntent。
當整個結帳流程結束(指使用者成功購買或取消購買),GooglePlay會回傳一個Intent到應用程式的onActivityResult()方法,onActivityResult()帶有三個回傳參數,第一個是請求碼(requestcode),這個請求碼可以用來辨別是誰送出的購買請求,第二個是結果碼(resultcode),用來告知這次的購買是成功(-1)的或被取消(0),第三個參數則是資料(data),此資料中包含了所購買商品的相關資訊(此商品的SKU ID、此商品的購買明細、此商品的簽名)。
《程式實作》
在要使用IAB之前,首先我們必須透過AndroidSDKManager下載安裝GooglePlayBillingLibrary,接著在專案中加入IInAppBillingService.aidl檔,透過它來和GooglePlay服務溝通。
這個檔案可以在所下載的Library中找到。
在Google文件中的建議是,我們可以直接改寫它所提供的SampleCode,或者是在已有的專案中,將所需的檔案從SampleCode抓過去用即可,很貼心的一點是,在SampleCode中,Google不僅安置好了IInAppBillingService.aidl,更寫了一個名為IabHelper的類別,來處理並控管IInAppBillingService.aidl所提供的介面服務,因此我們不用再去自己寫一個類別控管與GooglePlay溝通的介面,只要知道如何使用Google所提供的IapHelper類別即可。
設定好所需的檔案後,我們必須在AndroidManifests.xml加入以下權限–
接著,我們首先透過IabHelper類別,宣告一個需要傳入在開發者後台所取得的金鑰的物件,此開發金鑰是開發者將應用程式上傳到GooglePlay後,GooglePlay在後台所提供的專屬於這個應用程式的金鑰,要使用金流服務販賣內購式商品,必須用到此金鑰,且開發者必須先在後台設定好所要販賣的商品名稱以及SKUID,相關細節不在此篇討論範圍,可以上網搜尋關於內購式商品的上架流程查看。
宣告mHelper物件
Step1–isBillingSupported()
呼應前面所提到的購買商品流程,這邊我們對照到IabHelper的方法,一個步驟一個步驟來說明,我們在宣告mHelper物件以後,透過其所提供的startSetup()方法,執行與GooglePlay綁定的初始化動作,在這個startSetup()方法中,便會去執行上面流程所提到的isBillingSupported()方法。
startSetup()方法
在結束Activity時,要記得去釋放mHelper物件。
Step2–getPurchases()
在startSetup()之後,我們首先必須檢查目前使用者擁有哪些商品,更進一步的,檢查是否有消耗性的商品尚未向Googleplay告知此商品已被消耗,將所有權從使用者身上歸還給Googleplay。
透過mHelper物件所提供的queryInventoryAsync(QueryInventoryFinishedListener)方法,我們可以向GooglePlay發出getPurchases()的請求。
查詢使用者擁有哪些內購式商品
在此方法中,我們傳入了一個監聽器,叫做QueryInventoryFinishedListener,透過這個監聽器,我們可以接收從GooglePlayServer所傳回來的結果。
QueryInventoryFinishedListener監聽器
Step3–getSkuDetails()
接著,當我們要找尋特定ID的內購式商品時,透過mHelper物件所提供的queryInventoryAsync(boolean,List,QueryInventoryFinishedListener)方法,我們可以向GooglePlay發出getSkuDetails()的請求。
查詢指定ID的產品資訊
第一個參數式告知是否可以檢索產品資料,基本都設為true,第二個參數是一個存有SKUID的清單,告知我要查詢哪些SKUID的產品資訊,第三個參數則是監聽器,偵聽查詢完成以後回傳的事件。
QueryInventoryFinishedListener監聽器
如果查詢成功,查詢結果會儲存在Inventory物件中回傳給偵聽器。
以上程式碼展示如何從結果中取得產品的價格,我們可以透過回傳的inventory物件得知不同SKUID的產品名稱、產品價格、產品描述…等資訊。
Step4.1–getBuyIntent()、startIntentSenderForResult()
當使用者購買某件內購式商品時,我們透過mHelper物件所提供的launchPurchaseFlow(Activity,String,int,OnIabPurchaseFinishedListener,String)方法,向GooglePlay發出getBuyIntent()的請求,最後並會透過其內部的startIntentSenderForResult()將結果傳回到應用程式的onActivityResult()中。
(需注意的一點,此方法只能在Activity主執行緒中呼叫。
)
執行購買請求
相關參數說明如下–
參數1:目前這個Activity本身。
參數2:產品ID(SKUID)。
參數3:請求碼,任意正整數。
GooglePlay會回傳這個請求碼給Activity的onActivityResult()。
參數4:監聽器。
參數5:用來附加其他資訊的字串,可以是空的。
好的做法是傳送一組字串,增加安全性。
我們可以透過 purchase.getDeveloperPayload() 來取得此字串。
OnIabPurchaseFinishedListener監聽器
如果購買成功,GooglePlay會將資料儲存在Purchase物件中回傳,然後監聽器就會收到,我們透過分辨Purchase中所帶的 SKU_ID 參數,就可以知道使用者購買了哪樣產品,進一步定義所要執行的操作。
若是可以重複購買的消耗品(例如神魔之塔的魔法石),則必需在購買之後,將虛擬貨品提供給使用者之前,告知GooglePlay此商品已被消耗,將來使用者才可以再次執行購買的動作。
向GooglePlay告知商品已被消耗
透過 mHelper物件所提供的consumeAsync(Purchase,OnConsumeFinishedListener) 方法,我們可以將一件產品設定為已消耗的狀態。
執行取消所有權請求
第一個參數為所要設定的內購式商品,第二個參數則為監聽器。
當虛擬貨品消耗成功以後,我們就可以去執行我們要做的動作,像是為使用者增加汽油或者魔法石…等等。
《程式測試》
要測試透過IAB所寫的金流服務程式碼,有兩種方式,一種是透過GooglePlay所預留的ProductID,在執行購買的時候,將這些ID傳進去,當GooglePlay收到這些ID後,就會根據所傳的ID來回傳假的流程訊息,我們可以透過這種方式,在程式還未正式上架前,測試整個程式的流程有沒有問題。
預留的ProductID如下:
android.test.purchased
android.test.canceled
android.test.refunded
android.test.item_unavailable
另一種方式,則是將應用程式發佈到Alpha版或Beta版,設定好測試人員後,進行內部測試,這種環境下的測試所花費的金錢都不會列入收費,要注意的是測試人員的帳號不能跟開發者的帳號一樣,否則會有商品無法購買的錯誤。
相關文章
乾癬的原因是什麼?原來你一直吃錯東西讓它復發!
《Android》『ToolBar』-ToolBar之基本用法及如何取代ActionBar
《Android》『NumberPicker』-數字滾輪介面元件
《Android》『Parcelable』-Parcelable序列化的基本用法
《Android》『Socket』-如何透過Socket連線連接用戶端與伺服端程式
《Android》『Serializable、Parcelable』-兩種序列化介面的基本介紹
《Android》『呼叫外部App』-透過Messager與Service執行外部App並互相溝通(IPC)的基本方法
《Android》『Singleton』-單一物件模式
《Android》『EventBus』-EventBus套件的基本用法
賽肥膩膩
我們是低調到不行的肥膩夫妻檔,一路上一邊吵鬧一邊記錄著生活大小事,最近迷上了宅在家追劇,希望能透過文字將所有看過的影集好好紀錄,整理成屬於我們自己的回憶資料庫。
Facebook|個人網站|更多文章»
上一篇文章
《遊記》『加利利旅行社–捷克蜜月十天七夜之旅』-跟團心得甘苦談、如何挑選旅行社
下一篇文章
《美體美容》『AYURA』-全效防脫粧控油精華
同分類上一篇《Android》『RecyclerView』–在RecyclerView中實現多種不同Item布局的方法同分類下一篇《Android》『DrawerLayout』-左側開合選單佈局模式
您可能也喜歡Youmayalsolike
臉書留言
一般留言
發佈留言取消回覆發佈留言必須填寫的電子郵件地址不會公開。
必填欄位標示為*留言*顯示名稱*
電子郵件地址*
個人網站網址
在瀏覽器中儲存顯示名稱、電子郵件地址及個人網站網址,以供下次發佈留言時使用。
這個網站採用GooglereCAPTCHA保護機制,這項服務遵循Google隱私權政策及服務條款。
2022串流平台懶人包
2022影劇分類懶人包
Netflix月卡超值購($250~$330)
近期文章
《韓劇》『迷網追兇』第10集(最終回)詳細圖文劇情、線上看–結束
2022-04-20
《韓劇》『瘋狂愛上你』第14集詳細圖文劇情、線上看–作戰日
2022-04-20
《韓劇》『瘋狂愛上你』第13集詳細圖文劇情、線上看–危機
2022-04-20
關於斷更疑雲 在這裡的每一篇劇透心得文,都是賽肥膩膩看完後再一字一句寫下的,所以如果有發現某篇文章更新到一半斷更了,那就表示這部作品不符合我們的口味,看到一半就棄追啦…
還請見諒^^”
網站人氣統計
今日人氣:
累計人氣:
關鍵字廣告 《鏡架》《產後護理之家》《顯微注射》《婚紗照》《汽車報廢》《聲寶服務站》《淋浴拉門》《新年禮盒推薦》
延伸文章資訊
- 1《Android》『In-app Billing V3 API』- 應用程式內購買的基本 ...
當虛擬貨品消耗成功以後,我們就可以去執行我們要做的動作,像是為使用者增加汽油或者魔法石…等等。 《程式測試》. 要測試透過IAB 所寫的金流服務程式碼,有兩種方式, ...
- 2Google In App Billing串接學習筆記(Android+Nodejs) - iT 邦幫忙
最近有需求用到應用程式內購買,距離上一次串內購已經好幾年,Code都不知道丟哪去了 ... 應用程式-> 商店發布-> 應用程式內商品-> 受管理商品-> 建立要納入管理的產品
- 3[Android] In-App Billing/Purchases 實作與測試 - 一日工程師
前往Google Play Developer Console建立一個新的應用程式. 點擊"新增應用程式"; 填入標題; 倘若您無法進入此頁面,代表您沒有支付25美金的上架費.
- 4PnSDK - Android SDK接入文档
请在文档的引导下,进行必要的编码,SDK开发包请与技术人员联系后获取。 接入准备. 工程必须使用Android 最新SDK 编译. APK包必须签名,提交Google ...
- 5Android 實作IAP 內購式商品(Selling In-app Products)(2/2)
本篇為實戰篇,概念篇請看In-app Billing(App內付款) 概念。 ... 點選"新增應用程式"; 輸入應用程式名稱; 點選"準備商店資訊".