###### tags: `Android` # In-App-Billing 俗稱內購,意思是在應用程式內進行商品購買,那它與其他付款方式有什麼不同呢? 政策上有規定,如果是進行數位(虛擬)的商品購買,必須使用內購 只有實體商品才可使用其他付款方式,例如:網購 APP 使用 Google Pay <details> <summary>付款政策說明</summary>  </details> ## 內購實作 應用程式需要加入權限,Play Console 上的版本要有此權限才能建立商品 所以建議加入權限後,先發布一個內部測試版本,然後再繼續後面的流程 ```xml <uses-permission android:name="com.android.vending.BILLING"/> ``` gradle 加入套件 ``` implementation 'com.android.billingclient:billing:3.0.0' implementation 'com.android.billingclient:billing-ktx:3.0.0' ``` ### 新增商品 Play Console 上的版本有加入權限後,接下來需要在 Play Console 上架商品 上架商品分成兩種: 1. 受管理的產品:意指 Google Play 會紀錄每一筆交易資料 2. 訂閱項目:跟受管理產品一樣,只是多了一段時間週期,並且有續訂功能 以前有未受管理的產品選項,但 v3 版本已經沒有此選項 接著我們用受管理的產品來實作 #### 受管理的產品 在 Play Console 選擇應用程式後,點擊 ==商店發布==,開啟 ==應用程式內商品==,選擇 ==受管理的產品== | |-|-| 這時候點擊右邊的 ==建立要納入管理的產品==,並輸入相關資料 產品 ID 必須唯一,用來辨識商品,標題、說明會呈現給使用者看,狀態要改成訂閱中才會開始販售 | |-|-| 接下來輸入定價,完成後就可以按下 ==儲存== [貨幣相關說明](https://support.google.com/googleplay/android-developer/answer/1169947?hl=zh-Hant)  #### 訂閱項目 選擇 ==訂閱項目==,建立 ==訂閱項目==,然後進行設定 跟受管理的產品差不多,所以就不多談 只是多了帳單週期,還有一些選項,例如:免費試用、入門價格、寬限期、可否重新訂閱等等 | |-|-| ### 購買商品 完成新增商品後,要來區分一下商品類型,受管理的商品還細分成兩類: 1. 消耗性商品:如同藥水、金幣等,可以重複購買 2. 非消耗性商品:如同關卡解鎖,只能購買一次 這兩者的差別在於回報給 Google 時所使用的函式不同,回報是指 Google 扣款完成後 我們需要向 Google 再做一次確認,讓 Google 知道我們已經處理完此次交易(例如:給予使用者商品) 接下來,分成簡易流程、完整流程,如果只是想快速了解內購,只要看簡易流程即可 實作也只撰寫簡易的部分,完整流程只傳達概念 #### 簡易流程 流程大綱: 1. APP 載入 Play Console 的商品資料 2. User 購買商品 3. 購買完後給予 User 商品,並向 Google 回報 (或是先回報再給商品) 流程上還蠻簡單的,一開始 APP 需要從 Play Console 載入商品的資料,也就是載入剛剛新增的商品 接著我們將商品呈現給 User,讓 User 選擇想要購買的商品,User 選擇後會進入付款環節 付款完成會有 Callback 將商品回傳給 APP,此時我們要記得給予 User 商品,並向 Google 回報 如果沒有回報,Google 會在三天內將款項退回給 User ==TODO("程式碼")== #### 完整流程 以上是簡單的實作,但實際上這個流程並不安全,因為可能發生沒有完成回報或沒有給予商品的情況 情況一:購買完先給商品,但若未回報 Google 會退款,造成開發者的損失 情況二:購買完先回報,但若未給商品,造成使用者的不悅 為了盡量避免上述的情況發生,加入 Server 的環節,讓 Server 儲存 Google 回傳的商品資料 並使用類似 TCP 三向握手的流程,建立一個相較安全的流程,流程如下: ```sequence Participant Google Participant Client Participant Server Note over Client: 購買商品 Client --> Google: launchBillingFlow Note over Google: 扣款、紀錄商品資料 Google --> Client: Callback Client --> Server: 發送 API 建立未完成訂單 Note over Server: 建立未完成訂單 Server --> Client: Callback Client --> Google: 回報商品已消費 Note over Google: 商品標記成已消費 Google --> Client: Callback Client --> Server: 發送 API 標記訂單已完成 Note over Server: 標記訂單已完成、給予使用者商品 Note over Google,Server: 完成購買流程 ``` 有了這樣的流程後,我們可以確定一件事,就是商品會在回報完成且 Server 有資料後給予使用者 但還是無法確保未回報、未給商品的情形,這時候要運用到 BillingClient 的函式 ==queryPurchases== 它能查到使用者的帳戶有無未回報的商品,若有就表示 Client 在收到未完成訂單的 Callback 時出錯 這時候,我們就能從 ==queryPurchases== 回傳的 purchasesList 進行回報,並標記訂單已完成 如果 Server 沒有收到標記訂單的 API 呢? 一樣從 Client 執行 ==queryPurchases== 如果沒有未回報的商品,就表示商品已被回報或被退款,若是前者則重新發送 API 即可 若是後者,我們就不能發送 API 給他商品,但已回報跟被退款怎麼區分呢? 我們只要為訂單設定時間,必須於一天內完成交易流程,否則訂單狀態為失敗 這樣就不用擔心免費送商品的情況,但使用者需要等三天的退款機制,這樣就有完整的問題處理方式 :::danger queryPurchases 只會回傳未回報的商品,若已回報就不會回傳任何商品資料 如果使用者將自己的帳戶移除,那 queryPurchases 也會找不到未回報的商品 ::: :::success https://www.youtube.com/watch?v=L2aiHRD6Pfk&feature=youtu.be 影片 11:30 有提到回報的動作可以再 Server 完成,那這樣上述的流程就可以更加安全 相關教學:https://ithelp.ithome.com.tw/articles/10232395 但看了 Google Developers 文件,只有 acknowledge 跟 get 方法 實作後,get 可以取得訂單資料,但 acknowledge 比較像是非消耗性商品使用 ::: <details> <summary>Server 端實作相關文件、流程</summary> 首先要至 Play Console -> 開發人員帳戶 -> API 存取權,建立服務帳號,建完後下載 json 檔,裡面的重要訊息就是 Server call API 所需要的參數 接下來至 Play Console -> 開發人員帳戶 -> 使用者及權限,幫剛剛建立的服務帳戶開啟財務權限,之後就依據使用的語言來下載相關套件,進行 API 傳送 [Google In App Billing串接學習筆記 (Android+Nodejs)](https://ithelp.ithome.com.tw/articles/10232395) [Google Play Developer API](https://developers.google.com/android-publisher/api-ref/rest/v3/purchases.products) </details> ### 訂閱 訂閱的實作跟購買非消耗性商品一樣,只是多了一些狀態(例如:續訂) 監聽這些更新的狀態,需要使用 Real-time developer notifications (RTDN) 它是一種在 APP 中的用戶權利發生變化時,能從 Google 接收通知的機制 我們需要使用 Google Cloud Pub/Sub 功能,來達成訂閱狀態的監聽,讓 Server 可以取得新的狀態 [訂閱常見的違規事項](https://support.google.com/googleplay/android-developer/answer/9900533) ## 促銷活動 在 Play Console 的促銷活動可以新增促銷活動產生代碼 但促銷代碼只能提供免費的產品或免費適用訂閱的時間,不能對商品價格進行折扣 [官方說明](https://developer.android.com/google/play/billing/promo) ## 測試內購 首先要將測試帳號 (email) 加入測試人員,加入後進行測試時,就不會實際扣款 而且為了方便測試,所有的週期都會變短,例如:未回報的退款從 3 天變成 5 分鐘,續訂時間也變短 接下來只要發布測試版本就可以進行測試,要注意,開發人員的 email 不能成為測試人員 ### 授權測試 在 Play Console 外層,點擊 ==設定==,選擇 ==帳戶詳細資料==,在 ==授權測試== 加入測試帳號,按下 ==儲存== | |-|-| ### 放款資訊 Google:固定15號放款,好像可調整匯款門檻 Apple:下個月的某一天,10美元以上才放款 [收成與時間表](https://www.mobiloud.com/help/knowledge-base/what-are-apple-and-googles-fees-and-revenue-share-percentage-on-in-app-purchases-and-subscriptions) [Apple](https://itunespartner.apple.com/books/articles/apple-books-payments-2748) [Google](https://support.google.com/paymentscenter/topic/9017496?hl=zh-Hant&ref_topic=9017493)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up