質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
Cocos2d

Cocos2dは、二次元のゲームや視覚的なアプリケーションを開発する為のオープンソースのフレームワークです。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

COCOS2D-X

COCOS2D-Xは、 2Dゲームを手軽に開発できるフレームワークのことです。 iPhone(iOS)向け、Android等に対応しており、 実質ワンソースで開発が可能です。

Lua

Luaは、汎用のスクリプト言語の一つで、 移植性が高く、高速な実行速度などの特徴を持ち 手続き型・オブジェクト指向言語としても利用可能で 関数型言語、データ駆動型の要素も併せ持っている言語です。

Q&A

解決済

cocos2d-xのluaでの課金処理について

neuro_su
neuro_su

総合スコア13

Cocos2d

Cocos2dは、二次元のゲームや視覚的なアプリケーションを開発する為のオープンソースのフレームワークです。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

COCOS2D-X

COCOS2D-Xは、 2Dゲームを手軽に開発できるフレームワークのことです。 iPhone(iOS)向け、Android等に対応しており、 実質ワンソースで開発が可能です。

Lua

Luaは、汎用のスクリプト言語の一つで、 移植性が高く、高速な実行速度などの特徴を持ち 手続き型・オブジェクト指向言語としても利用可能で 関数型言語、データ駆動型の要素も併せ持っている言語です。

1回答

0グッド

0クリップ

1755閲覧

投稿2018/07/25 12:35

編集2018/08/27 06:34

現在cocos2d-xを使い、Android・iOSでアプリの制作をしています。
luaで開発をしないといけない状況なのですが、luaについての知識があまりなく困っています。

こちらのリンクを参考にIn-App Purchase Integration Guide
課金処理を行っているのですが、あまり理解が出来ず困っています。

sdkbox.IAP:init()

このコードはどこに記述しないといけないのか?
main.luaに記述するのがいいのでしょうか?

sdkbox.IAP:setListener(function(args) if "onSuccess" == args.event then local product = args.product dump(product, "onSuccess:") elseif "onFailure" == args.event then local product = args.product local msg = args.msg dump(product, "onFailure:") print("msg:", msg) elseif "onCanceled" == args.event then local product = args.product dump(product, "onCanceled:") elseif "onRestored" == args.event then local product = args.product dump(product, "onRestored:") elseif "onProductRequestSuccess" == args.event then local products = args.products dump(products, "onProductRequestSuccess:") elseif "onProductRequestFailure" == args.event then local msg = args.msg print("msg:", msg) else print("unknown event ", args.event) end end)

この処理で課金の何が出来ているのか?
などだいぶ初歩的な部分で躓いてしまっています…

課金処理について詳しい方がおられましたら、教えていただきたいです。

sdkbox.IAP:init()の処理を記述したのですが、sdkboxの値がnil(null)になってしまったので、
初期化の処理を書く際にcppみたいにincludeしないと行けないのでしょうか?

ショップの購入ボタンにsdkbox::IAP::purchase(productId)を記述し、
確認を行ったら、onFailureが返って来ました。
他に設定を行うことはありますでしょうか?
以下課金ボタンに関するソースになります。

//ショップの初期化処理 function ShopPanel:Init(root, scene) sdkbox.IAP:setListener(function(args) if "onSuccess" == args.event then local product = args.product dump(product, "onSuccess:") elseif "onFailure" == args.event then local product = args.product local msg = args.msg dump(product, "onFailure:") print("msg:", msg) elseif "onCanceled" == args.event then local product = args.product dump(product, "onCanceled:") elseif "onRestored" == args.event then local product = args.product dump(product, "onRestored:") elseif "onProductRequestSuccess" == args.event then local products = args.products dump(products, "onProductRequestSuccess:") elseif "onProductRequestFailure" == args.event then local msg = args.msg print("msg:", msg) else print("unknown event ", args.event) end end) end //購入ボタンを押したら以下の関数が走る function ShopPanel:onRequestIAPKakin(sender, event) sdkbox.IAP:purchase("coin_package"); end

sdkbox_config.jsonも載せておきます。

{ "android": { "iap": { "items": { "remove_ads": { "type": "non_consumable", "id": "com.cocos2dx.non1" }, "double_coin": { "type": "non_consumable", "id": "com.cocos2dx.non2" }, "coin_package": { "id": "商品ID" }, "coin_package2": { "id": "商品ID" } }, "key": "本番用" } }, "ios": { "iap": { "items": { "remove_ads": { "type": "non_consumable", "id": "com.cocos2dx.non1" }, "double_coin": { "type": "non_consumable", "id": "com.cocos2dx.non2" }, "coin_package": { "id": "商品ID" }, "coin_package2": { "id": "商品ID" } } } } }

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

1

ベストアンサー

cocos2d-x(C++)で実際にアプリ内課金を実装しているので、C++であれば回答できますがluaは分かりませんので、その点は力になれそうにありません。

luaに詳しくないのに、luaで開発するというのが良く分からないのですが、仕事ですか?
仕事であれば、同僚、先輩に聞いて教えてもらうしかないですね。
趣味であれば、今からでも情報量の多さで考えたらC++を選択するべきです。
もちろん、どうしてもluaで作りたいのであれば、自分で選択した以上頑張るしかありません。

sdkbox.IAP:init() は、C++でいえばAppDelegate.cppの最初のシーンを起動した後あたりに記述します。
luaは分かりませんが、相当するファイルがあるでしょう。

IAP:setListenerについては、課金を実装するシーンの初期化時に呼び出します。
たいていは、ショップ画面などでしょう。
これは課金に関するイベントを受け取るものです。

cocos2d-xの前に、ネイティブアプリの開発経験があり、アプリ内課金の実装の経験があれば望ましいです。
そこが分かっていないと、cocos2d-x、アプリ内課金の2つの複雑な問題があるのにどちらも理解があいまいという状態なので、先に進むのが難しいです。

また、課金を実行するには各プラットフォームの課金の準備が必要です。
両方説明するのはしんどいので、一番簡単なAndroidだけ説明します。
これは、cocos2d-xに関係なくネイティブのAndroidアプリでも同じなので、ネットで調べれば情報は出てきます。

Androidであれば、AndroidManifest.xmlに課金のパーミッションを追加した状態でapkファイルを生成し、デベロッパーコンソールにアップロードし、クローズドベータとして公開する必要があります。
その状態で、アプリ内課金のアイテム情報も登録し、公開状態とします。
また、ベータ版がGoogelPlayに公開されたら、テスターとして任意のGoogleアカウント(GMail)を登録します。
そのGoogleアカウントを設定した実機で、テスターになるためのURLにアクセスして、テスターとして認識されないと、テスト購入ができません。
Resources/sdkbox_config.json に、デベロッパーコンソールで登録したアイテムIDを登録しておかなければいけません。
初期状態で書かれているのはサンプルなので削除して必要なものだけを書きましょう。
また、androidの場合、keyのところに、デベロッパーコンソールに表示されているライセンスキーを記述する必要もあります。

投稿2018/07/25 13:39

mingos

総合スコア3875

neuro_su👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

mingos

2018/07/26 08:12 編集

C++であればAppDelage.cppに#include "PluginIAP/PluginIAP.h"を書かないと当然使えません。 sdkbox import iapを実行すると自動で書き換えてくれますが、luaのほうは分かりません。 なにかsdkboxを使用するための設定があるのかもしれません。 ドキュメントを読みつつ、ネット情報を探ながらいろいろ試行錯誤するしかないですね。
neuro_su

2018/08/24 00:56

sdkbox.IAP:init sdkbox.IAP:setListener の記載場所はわかりました。ありがとうございます! ですがショップ部分で具体的にどのように進めていけばよいか分かっていません。 sdkbox_configに商品のIDを記載するところまでは出来ました。
mingos

2018/08/24 01:03

リストで商品を並べて各商品の購入ボタンを押されたら、対応するproduct_idの購入リクエストをストアに送信すれば良いでしょう。 C++では、sdkbox::IAP::purchase(productId); でリクエストが送信されます。 その後は、ストアからイベントが発行されて来るので、 sdkbox.IAP:setListenerに処理が渡ってくるはずです。
neuro_su

2018/08/25 13:32

ショップの購入ボタン処理にsdkbox::IAP::purchase(productId)を記述し、 確認をしたら、onFailureが返って来ました。質問にソースを追加しました。 他に記述しないといけないことがありますでしょうか?
mingos

2018/08/27 04:23

onFailureにメッセージが渡ってきているはずなので、そのエラーも載せてください。 しかし、そもそもアプリ内課金が実行できる要件は満たしているのでしょうか? コードを書けば動くというものではないです。 まず、andoridアプリのアプリ内課金の常識として以下のチェックポイントがあります。 これを先に確認してください。 もちろん、Googleに開発者費用を払い、デベロッパー登録を完了している事が必要です。さすがにそれは完了していますよね? (1) クローズドベータとしてGooglePlayで公開状態になっていますか?つまり、apkをリリースビルドで作成しアップロードしていますか? (2) さらに、テスターとしてアカウントを登録し、オプトインURLにアクセスしてテスターとして登録が完了していますか? (3) アプリ内アイテムとして、課金アイテムの情報を正しく入力し、公開状態としていますか? 質問に掲載しているコードの場合、「coin_package」がきちんとデベロッパーコンソールで登録し、公開状態になっていますか? (4) 実行する時のデバッグキーはリリース用のキーストアに差し替えていますか?デバッグ用のキーではアプリ内課金は失敗します。 動作確認するだけなら、テスターアカウントを設定した実機でGooglePlayからアプリをインストールすれば良いです。 クローズドベータ版であればテスターのみ、GooglePlayに公開された状態となるので、一般ユーザにアプリが公開されるわけではありません。 これを全部満たしているかどうかが重要です。 androidアプリで課金を実装するために必須の設定となります。
neuro_su

2018/08/27 06:22

デベロッパー登録は完了しています。 (1)クローズドベータとして公開状態になっています。 (2)テスターアカウント登録は完了しています。 (4)リリース用に差し替えています。 (3)について質問なのですが、「coin_package」はsdkbox_config.jsonに下記のように記載しています。 "iap": { "items": { "coin_package": { "id": "商品ID" }, "coin_package2": { "id": "商品ID2" } } } 商品IDはデベロッパーコンソールに登録していますが、「coin_package」という名前も登録する場所があるのでしょうか? onFailureで返ってきたエラーは「Invalid iap item name」返ってきておりました。 やはりアイテムの登録がうまく行っていないのでしょうか?
mingos

2018/08/27 06:42 編集

「Invalid iap item name」というエラーであるなら、 ・商品登録が間違っている ・IDの指定が間違っている のいずれかでしょう。 デベロッパーコンソールで登録した商品ID以外はエラーになるのは当たり前です。 ※修正 私はJSONのキーと商品IDを同じにするという方法しかやった事がないので、 別のキーでもうまく行くのかもしれませんが、同じにしたほうが混乱しにくいと思います。 具体的にはこうします。 "商品ID": { "id": "商品ID" }, "coin_package2": { "id": "coin_package2" } 他に間違いが起きる可能性のあるものは、keyの差し替えをしているかどうかですね。 { "android": { "iap": { "items": { "商品ID": { "type": "non_consumable", "id": "商品ID" } }, "key": "ライセンスキーを自分のアプリの内容に差し替える" } }, "ios": { ... } } アプリ>開発ツール>サービスとAPI>ライセンスとアプリ内課金 に表示されている「このアプリのライセンスキー」をコピーして貼り付ける必要があります。 これも完了していますか?
neuro_su

2018/09/11 11:53

ありがとうございます! 無事課金処理が成功しました! 本当にありがとうございます。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Cocos2d

Cocos2dは、二次元のゲームや視覚的なアプリケーションを開発する為のオープンソースのフレームワークです。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

COCOS2D-X

COCOS2D-Xは、 2Dゲームを手軽に開発できるフレームワークのことです。 iPhone(iOS)向け、Android等に対応しており、 実質ワンソースで開発が可能です。

Lua

Luaは、汎用のスクリプト言語の一つで、 移植性が高く、高速な実行速度などの特徴を持ち 手続き型・オブジェクト指向言語としても利用可能で 関数型言語、データ駆動型の要素も併せ持っている言語です。