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

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

ただいまの
回答率

90.52%

  • Android

    6521questions

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

  • iOS

    3996questions

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

  • COCOS2D-X

    188questions

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

  • Lua

    57questions

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

  • Cocos2d

    27questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 246

neuro_su

score 4

現在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日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+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/26 17:11 編集

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

    キャンセル

  • 2018/08/24 09:56

    sdkbox.IAP:init
    sdkbox.IAP:setListener
    の記載場所はわかりました。ありがとうございます!

    ですがショップ部分で具体的にどのように進めていけばよいか分かっていません。
    sdkbox_configに商品のIDを記載するところまでは出来ました。

    キャンセル

  • 2018/08/24 10:03

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

    キャンセル

  • 2018/08/25 22:32

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

    キャンセル

  • 2018/08/27 13:23

    onFailureにメッセージが渡ってきているはずなので、そのエラーも載せてください。
    しかし、そもそもアプリ内課金が実行できる要件は満たしているのでしょうか?
    コードを書けば動くというものではないです。

    まず、andoridアプリのアプリ内課金の常識として以下のチェックポイントがあります。
    これを先に確認してください。

    もちろん、Googleに開発者費用を払い、デベロッパー登録を完了している事が必要です。さすがにそれは完了していますよね?

    (1) クローズドベータとしてGooglePlayで公開状態になっていますか?つまり、apkをリリースビルドで作成しアップロードしていますか?
    (2) さらに、テスターとしてアカウントを登録し、オプトインURLにアクセスしてテスターとして登録が完了していますか?
    (3) アプリ内アイテムとして、課金アイテムの情報を正しく入力し、公開状態としていますか?
    質問に掲載しているコードの場合、「coin_package」がきちんとデベロッパーコンソールで登録し、公開状態になっていますか?
    (4) 実行する時のデバッグキーはリリース用のキーストアに差し替えていますか?デバッグ用のキーではアプリ内課金は失敗します。
    動作確認するだけなら、テスターアカウントを設定した実機でGooglePlayからアプリをインストールすれば良いです。
    クローズドベータ版であればテスターのみ、GooglePlayに公開された状態となるので、一般ユーザにアプリが公開されるわけではありません。

    これを全部満たしているかどうかが重要です。
    androidアプリで課金を実装するために必須の設定となります。

    キャンセル

  • 2018/08/27 15: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」返ってきておりました。
    やはりアイテムの登録がうまく行っていないのでしょうか?

    キャンセル

  • 2018/08/27 15:33 編集

    「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>ライセンスとアプリ内課金
    に表示されている「このアプリのライセンスキー」をコピーして貼り付ける必要があります。
    これも完了していますか?

    キャンセル

  • 2018/09/11 20:53

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

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    luaでの参照渡しの仕方

    いまcで書かれたものをluaに書き換えようと思っています その際にdefineで定義されたマクロ関数を書き直す際に、 luaで関数内で引数を書き換えたら実引数も書き換わるということ

  • 受付中

    VBA 作成した乱数をIf文で使う方法

    上で作成した、1~10の数字の乱数を、下のif文に当てはめるにはどのようなコードを書けばよいのでしょうか? 今は8という数字が入っていて、当たりも8が設定されているため、セル1の1

  • 解決済

    VBAのDir関数でサブディレクトリを取得したいが、「ファイルが見つかりません」というエラーが出る

    Dir関数でサブフォルダを取得する 上記サイトの一番最後のコードを実行してみましたが、「ファイルが見つかりません」というエラーが出てしまいます。 デバッグしてみるとIf 

  • 解決済

    順列の求め方について

    コインをn枚投げた時の順列を求めたいです。 例えば、2投げた時の順列は、 「表・表、 表・裏、 裏・表、 裏・裏」の4種類なので、 list_ = ["表・表", "表・裏

  • 解決済

    入力した値を出力。js初心者です。

     カレンダーを作りたい fullcalendarとsweetalertを組み合わせてカレンダーを作っているのですが、 イベントを追加するのにうまく出来なくて困っています。  発

  • 解決済

    jQueryでformデータの値の受け取り方について

    初歩的なことですみません。 jQueryでformからsubmitされた値の受け取り方について質問です。 <?php foreach ($products as $produc

  • 解決済

    マクロの同じファイル名が存在する場合について

    こんにちわ マクロ(VBA)でかいています 実行してExcelファイルを開きそのなかから特定のものを抽出し、csvファイルで出力するものです。 エクセルファイルはシートが複数あり、

  • 解決済

    vbaにおける可視セルの選択(複数行の場合)

    質問させていただきます。 Excelでデータベースを作成中です。(来店記録のようなものです) 現在、A列に名前、B列に住所が入っており、C列には日付、D列には○か☓が必ず入る予定の

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

  • Android

    6521questions

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

  • iOS

    3996questions

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

  • COCOS2D-X

    188questions

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

  • Lua

    57questions

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

  • Cocos2d

    27questions

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