Tutorial

アプリ内課金を利用するには

アプリ内課金を実現するには、事前にGoogle PlayもしくはApp Storeにアイテム登録をし、プロダクトIDを取得しておかなければなりません。アプリ内課金API(Purchase

課金アイテムの情報取得

applican.purchase.getProducts([プロダクトIDの配列], [課金種別], [成功時のコールバック], [失敗時のコールバック]);

プロダクトID

Google Play Developer Consoleや、iTuens Connectで設定したIDを配列形式で指定して、複数のアイテム情報を一括して取得できます。(1件だけ取得する場合も配列形式で指定してください)

課金種別

Androidの場合に定期購読の場合はsubs”、それ以外の場合はinapp”を指定してください。iOSの場合にはこの値は無視します。

通常の課金 定期購読
inapp subs

サンプルコード

var productIds = ['jp_co_xxx_yyy_coin100', 'jp_co_xxx_yyy_coin200'];
applican.purchase.getProducts(productIds, 'inapp', purchaseGetProductsSuccess, purchaseGetProductsError);
function purchaseGetProductsSuccess(products){
	var dump = "purchaseGetProductsSuccess\n";
	var cnt = products.length;
	if(cnt>0){
		for(var i=0; i<cnt; i++){
			var product = products[i];
			dump += "========================\n";
			dump += "productId:"+product.productId+"\n";
			dump += "name:"+product.name+"\n";
			dump += "price:"+product.price+"\n";
			dump += "description:"+product.description+"\n";
		}
	}
	alert(dump);
}
function purchaseGetProductsError(error){
	var dump = "purchaseGetProductsError\n";
	dump += "code:"+error.code+"\n";
	dump += "message:"+error.message+"\n";
	alert(dump);
}

成功時のコールバックの引数は以下の内容のオブジェクトが配列で渡されます。

パラメータ名 説明
productId プロダクトID
name コンテンツ名
price 価格。(ローカライズされた文字列)
description コンテンツの説明文
os プラットフォームのOS。"ios" 又は "android"。

課金実行

以下のメソッドで課金プロセスを開始します。
このメソッドを呼び出すとネイティブの課金ダイアログが表示されます。

applican.purchase.makePurchase([プロダクトID], [課金種別], [成功時のコールバック], [失敗時のコールバック]);

成功時のコールバックを受け取った際に、決済を完了させるために以下の機能を呼び出す必要があります。

applican.purchase.finishPurchase([課金ID],  [成功時のコールバック], [失敗時のコールバック]);

※iOSとAndroidで、決済を完了させる処理の呼び出しに違いがあるため注意してください。

・iOSの場合は必ず呼び出します。
・Androidの場合は消費アイテムの場合のみ呼び出します。プロダクトIDで判別して送信するように実装してください。

サンプルコード

applican.purchase.makePurchase('jp_co_xxx_yyy_coin100', 'inapp', makePurchaseSuccess, makePurchaseError);
function makePurchaseSuccess(result){
	if(result.productId=='jp_co_xxx_yyy_coin100'){
		//※課金アイテムの付与などの処理を実装する
	}else if(result.productId=='jp_co_xxx_yyy_coin200'){
		//※課金アイテムの付与などの処理を実装する
}

	//決済完了にする処理。
	//iOSの場合は必ず送信。Androidは消費アイテムの場合のみ送信する。
	if(result.os=="ios" ||
		(result.os=="android" && (result.productId=="jp_co_xxx_yyy_coin100" ||
purchase.productId=="jp_co_xxx_yyy_coin200"))){
		applican.purchase.finishPurchase(result.purchaseId,  finishPurchaseSuccess, finishPurchaseError);
	}else{
		alert('決済完了しました:'+result.purchaseId);
	}
}
function makePurchaseError(error){
	var dump = "makePurchaseError\n";
	dump += "code:"+error.code+"\n";
	dump += "message:"+error.message+"\n";
	alert(dump);
}
function finishPurchaseSuccess(purchaseId){
	alert('決済完了しました:'+purchaseId);
}
function finishPurchaseError(error){
	alert('決済完了できませんでした。'+"code:"+error.code+"\n"+"message:"+error.message);
}

課金実行の成功時のコールバックの引数には以下の内容のオブジェクトが渡されます。

パラメータ名 説明
productId プロダクトID
purchaseId 課金ID
receipt 課金認証用のレシート
os プラットフォームのOS。"ios" 又は "android"。

課金情報のレストア

以下の機能で課金済み情報を再取得することができます。

applican.purchase.restorePurchase([課金種別], [成功時のコールバック], [失敗時のコールバック]);

※Androidの場合は課金種別毎に呼び出す必要があります。iOSの場合は課金種別のパラメータを使わないため、1回の呼び出しですべての課金情報を取得できます。

レストア機能は以下の目的で使用します。
・非消費型の購入をレストアする(広告非表示など)
・定期購読の購入をレストアする
・finishPurchaseを送信できずに決済を中断してしまった場合の復帰処理

サンプルコード

var _incomplete_purchase;	//未完了決済を格納する変数

applican.purchase.restorePurchase('inapp', restorePurchaseSuccess, restorePurchaseError);

function restorePurchaseSuccess(result){
	_incomplete_purchase = new Array();

	var cnt = result.length;
	if(cnt>0){
		for(var i=0; i<cnt; i++){
			var purchase = result[i];

			//購入が未完了のものをストック
			if((purchase.os=="ios" && !purchase.isRestore)
				|| (purchase.os=="android" &&
				 (purchase.productId=="jp_co_xxx_yyy_coin100" ||
				  purchase.productId=="jp_co_xxx_yyy_coin200"))){

				_incomplete_purchase.push(purchase);
			}else{
				//※購入済みアイテムをレストアする処理
			}
		}
	}

	if(_incomplete_purchase.length>0){
		//購入が未完了のものを完了させる処理を呼ぶ
		repairPurchase();
	}else{
		alert('レストア完了');
	}
}
function restorePurchaseError(error){
	var dump = "restorePurchaseError\n";
	dump += "code:"+error.code+"\n";
	dump += "message:"+error.message+"\n";
	alert(dump);
}

//購入が未完了のものを完了させる処理
function repairPurchase(){
	if(_incomplete_purchase.length<1){
		alert('未完了決済の処理完了');
		return;
	}

	var purchase = _incomplete_purchase.shift();

	if(purchase.productId=='jp_co_xxx_yyy_coin100'){
		//※課金アイテムの付与などの処理を実装する
	}else if(purchase.productId=='jp_co_xxx_yyy_coin200'){
		//※課金アイテムの付与などの処理を実装する
	}

	//決済完了にする処理
	applican.purchase.finishPurchase(purchase.purchaseId, repairPurchase, repairPurchaseError);
}

function repairPurchaseError(error){
	alert('決済完了できませんでした。'+"code:"+error.code+"\n"+"message:"+error.message);
}

restorePurchaseの成功時のコールバックの引数は以下の内容のオブジェクトが渡されます。

パラメータ名 説明
productId プロダクトID
purchaseId 課金ID
receipt 課金認証用のレシート
os プラットフォームのOS。"ios" 又は "android"。
isRestore 購入済みアイテムのレストアかどうか(iOSのみ。Androidはfalse固定)

購入が未完了かどうかを判定する方法がiOSとAndroidで異なるので注意してください。

iOSの場合の判定方法 Androidの場合の判定方法
isRestoreがfalse productIdが消費型アイテム

購入未完了の決済についてはアイテム等の付与を行った後、finishPurchaseを実行して決済を完了させるようにしてください。

上記のサンプルコードではrepairPurchaseを再帰的に呼び出し、未完了決済が全て無くなるまで繰り返し処理をするように実装しています。

会員登録(無料)はこちらから