Androidアプリの課金ボタン追加とサービス手数料15%登録
弊社はUSBカメラをAndroidで接続するアプリを長く公開しています。USBカメラをAndroidで使ってもらうために、広告なし、無料でアプリを公開していました。これからも広告なし、無料を続けるため2025/10に開発サポートをお願いするボタンを追加しました。
Google Playを使ったAndroidアプリの課金パターンはアプリ購入、アプリ内課金、定期購入がありますが、今回はGoogle Play Billing Libraryを使ったアプリ内課金を利用しました。また、課金した際にGoogle Playのサービス手数料を30%から15%に引き下げるための登録もしました。Google Play Billing LibraryはGoogleが提供している、Google Play の課金システムをアプリに統合するために使用できる API です。
アプリ内アイテム登録
Google Playでアプリ内課金を利用する場合には、Google Play Consoleでアイテムを作成して利用します。アイテムの作成はGoogle Play Consoleでアプリを選択し、左メニューの「Google Playで収益化する」→「商品」→「アプリ内アイテム」を選択すると「アイテムの作成」ボタンが出ます。弊社アプリではアプリ内アイテムを作成するには請求権限を追加していなかったので、次のようなメッセージが出てアプリ内アイテムの追加ができませんでした。

追加できない場合にはAndroidアプリで請求権限を追加して、Google Play Consoleでアプリをリリースすることでアイテムを追加することができます。私はGoogle Play Consoleにテスト用のアプリを登録することで、アイテムの追加ができるようになりました。請求権限はAndroidManifest.xmlに次の権限を追加します。
<uses-permission android:name="com.android.vending.BILLING"/>
Google Play Consoleのアプリ内アイテムで「アイテムの作成」を押して、ID, 商品の名前, 説明, 価格の設定、保存、および有効化することで、アプリでアイテムを利用できます。
課金処理
Google Play Billing Libraryを使って、次の流れで課金を実行を行います。BillingManagerはアプリ内で課金を操作するためのクラスとして作りました。

課金処理を実行するBillingManagerのコードは以下です。アイテムの作成で設定したIDを使って課金処理を実行しています。購入後、消費することで、同じアイテムを再度購入できます。Google Play Billing Libraryは8.0.0を利用しています。
public class BillingManager implements PurchasesUpdatedListener {
public static final String PRODUCT_ID_1 = "item1"; // Google Play Consoleで作成したアイテムのID
private final BillingClient billingClient;
private final List<ProductDetails> products = new ArrayList<>();
public BillingManager(Context context) {
// コンストラクタ BillingClientを作成
billingClient = BillingClient.newBuilder(context)
.setListener(this)
.enablePendingPurchases(
PendingPurchasesParams.newBuilder().enableOneTimeProducts().build()
)
.build();
}
public void endConnection() {
// 切断
billingClient.endConnection();
}
public void startConnection() {
// 非同期でのGoogle Playへの接続
billingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(@NonNull BillingResult billingResult) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
// 接続成功
loadProducts();
}
}
@Override
public void onBillingServiceDisconnected() {
}
});
}
public void launch(Activity activity, String productId) {
QueryProductDetailsParams.Product product =
QueryProductDetailsParams.Product.newBuilder()
.setProductId(productId)
.setProductType(BillingClient.ProductType.INAPP) // 一回限り購入
.build();
QueryProductDetailsParams params =
QueryProductDetailsParams.newBuilder()
.setProductList(Collections.singletonList(product))
.build();
billingClient.queryProductDetailsAsync(params, (billingResult, productDetailsList) -> {
List<ProductDetails> list = productDetailsList.getProductDetailsList();
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK &&
!list.isEmpty()) {
ProductDetails productDetails = list.get(0);
BillingFlowParams.ProductDetailsParams productDetailsParams =
BillingFlowParams.ProductDetailsParams.newBuilder()
.setProductDetails(productDetails)
.build();
BillingFlowParams billingFlowParams =
BillingFlowParams.newBuilder()
.setProductDetailsParamsList(Collections.singletonList(productDetailsParams))
.build();
// 課金フローの開始 Google Playの購入画面が出てきます。
billingClient.launchBillingFlow(activity, billingFlowParams);
}
});
}
@Override
public void onPurchasesUpdated(@NonNull BillingResult billingResult, List<Purchase> purchases) {
// 購入更新の通知
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && purchases != null) {
for (Purchase purchase : purchases) {
// 購入後すぐに消費することで、同じ商品を再度購入できる
ConsumeParams consumeParams = ConsumeParams.newBuilder()
.setPurchaseToken(purchase.getPurchaseToken())
.build();
ConsumeResponseListener listener = (result, purchaseToken) -> {
// 購入完了
};
billingClient.consumeAsync(consumeParams, listener);
}
}
}
private void loadProducts() {
// アイテムのリスト化
List<QueryProductDetailsParams.Product> productList = new ArrayList<>();
productList.add(QueryProductDetailsParams.Product.newBuilder()
.setProductId(PRODUCT_ID_1)
.setProductType(BillingClient.ProductType.INAPP)
.build());
QueryProductDetailsParams params = QueryProductDetailsParams.newBuilder()
.setProductList(productList)
.build();
billingClient.queryProductDetailsAsync(params, (billingResult, productDetailsList) -> {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
products.clear();
products.addAll(productDetailsList.getProductDetailsList());
}
});
}
public void clickButton(Activity, activity, String productId) {
// 購入実行
for(ProductDetails details : products) {
if (details.getProductId() == productId) {
launch(activity, details.getProductId());
}
}
}
}
Google Playのサービス手数料を15%にする登録
Google Playで課金を行うと、Googleにサービス手数料を支払う必要があります。Google Playのサービス手数料はここに記載されていますが、アプリとアプリ内アイテムが、15%~30%、定期購入は15%です。アプリとアプリ内アイテムは下記条件を満たすことでサービス手数料を15%にできます。(2025年10月)
- デジタル商品やサービスの年間収益が 100 万米ドル(USD)を超えていない
- 開発者が15% のサービス手数料ティアに正式に登録する
最初のデジタル商品の登録では100万米ドル(USD)を超えていませんので、15%のサービス手数料ティアに登録すればサービス手数料が15%になります。
登録はGoogle Play Consoleでできます。Google Play Consoleにログインして、「設定」-「お支払いプロファイル」に移動します。お支払いプロファイルがなければ作成します。次にアカウントグループを作成します。Google Play Consoleの「デベロッパーアカウント」-「関連付けられているデベロッパーアカウント」で作成できます。アカウントグループの設定が完了すると「関連付けられているデベロッパーアカウント」で「確認して登録する」ボタンから、15%のサービス手数料の規約を呼んで同意することで登録できます。

やることは簡単なので、やっておいたほうがいいです。サービス手数料に関しては、先日(2025/10/30)Google Playから、アメリカ限定ですがGoogle Playを経由しない課金を許すという連絡が来ていました。これによって自社や他の課金サービスを使って課金ができるため、サービス手数料をGoogleに支払わずに課金することができるようになります。これまではGoogle Playの課金システムを経由しないといけませんでしたし、外部課金システムへの誘導もダメだったようなので、サービス手数料を多く払っているデベロッパーにとっては朗報です。
これから日本でもスマホ法が適用されると、Google Play以外の課金システムを利用することができるようになるかもしれません。しかし、手数料はかからなくなりますが課金システムを用意しなくてはいけないので、弊社は当面Google Playの課金システムを使います。

