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

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

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

Cordovaは様々なデバイスで使うことができるオープンソースなモバイル用開発プラットフォームです。開発者に各デバイスの元のプラットフォームで開発する必要をなくし、HTML・JavaScript・CSSなどの一般的なウェブのテクノロジーを使ってすべてのデバイスで展開することができるモバイルのアプリケーションを生成することを可能にします。

Android

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

プラグイン

プラグイン(plug-in)は、ソフトウェアアプリケーションの機能拡張の為に開発された、一組のソフトウェアコンポーネントのことを指します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Monaca

「Monaca」はiOS、Android、Windows向けのアプリ開発に対応した、Cordovaベースのモバイルアプリ開発プラットフォームです。HTML5、JavaScriptといったWeb標準技術を用いてモバイルアプリ開発を行うことができます。

Q&A

1回答

2581閲覧

cordovaを使ったアプリ内課金でエラー

shiba-t

総合スコア4

Cordova

Cordovaは様々なデバイスで使うことができるオープンソースなモバイル用開発プラットフォームです。開発者に各デバイスの元のプラットフォームで開発する必要をなくし、HTML・JavaScript・CSSなどの一般的なウェブのテクノロジーを使ってすべてのデバイスで展開することができるモバイルのアプリケーションを生成することを可能にします。

Android

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

プラグイン

プラグイン(plug-in)は、ソフトウェアアプリケーションの機能拡張の為に開発された、一組のソフトウェアコンポーネントのことを指します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Monaca

「Monaca」はiOS、Android、Windows向けのアプリ開発に対応した、Cordovaベースのモバイルアプリ開発プラットフォームです。HTML5、JavaScriptといったWeb標準技術を用いてモバイルアプリ開発を行うことができます。

0グッド

1クリップ

投稿2020/02/26 05:47

編集2020/02/27 06:18

Androidアプリで定期購読の状態を取得できない

cordovaを使用し、Androidアプリを作成しています。
定期購読機能を追加したのですが、購読手続きは出来たのですが、
その後、定期購読の状態を取得する事が出来ない状態です。
以下のようなログが出ています。
質問自体初めてなので、見づらくて申し訳ないのですが
ご教授お願い致します。

該当のソースコード

ソースコード(javascript)

var listArray;

const constUrl = "url";
const constUserID = "subscription@domain";
const constPassword = "password";

const constSampleUrl = "url"
const constSampleUserID = "sample@domain"
const constSamplePassword = "password"

const store_id = "store_id_00001";

var strSendUrl;
var strUserId;
var strPassword;
var strSelectId;
var isFirst = true;

const headUrl = "https://"
const apiUrl = "/api"
const searchUrl = apiUrl + "/search/"

//初期化処理
ons.ready(function () {
console.log("onsen start");
$('#btnSetting').on('click', function (e) {
console.log('click setting');
document.querySelector('#navigator').pushPage('setting.html');
});
onload();
});

document.addEventListener('init', function (event) {
console.log("init event start=" + event.target.id);
if (event.target.id == "mainPage") {
loadSettings();
}
}, false);

function onload() {
console.log("onload start");

document.addEventListener("deviceready", onDeviceReady, false);

}

function onDeviceReady() {
console.log("onDeviceReady start");
navigator.splashscreen.hide();

listArray = new Array(); window.sessionStorage.setItem("listArraySession", JSON.stringify(listArray)); initializeStore(); store_show(true);

}

// アプリ内課金
function initializeStore() {
console.log('start initializeStore');

store.verbosity = store.DEBUG; // 購入登録 store.register({ id:store_id, alias:store_id, type:store.PAID_SUBSCRIPTION }); store.when(store_id).approved(function(p) { log("verify subscription"); p.verify(); }); store.when(store_id).verified(function(p) { log("subscription verified"); p.finish(); }); store.when(store_id).unverified(function(p) { log("subscription unverified"); }); store.when(store_id).updated(function(p) { if (p.owned) { console.log('owned'); strSendUrl = constUrl; strUserId = constUserID; strPassword = constPassword; } else { console.log('not owned'); strSendUrl = constSampleUrl; strUserId = constSampleUserID; strPassword = constSamplePassword; } }); store.error(function(error) { log('error:' + error.code + ':' + error.message); }); store.ready(); store.refresh();

}

function check_notad(product) {
if (product.owned) {
strSendUrl = constUrl;
strUserId = constUserID;
strPassword = constPassword;
} else {
strSendUrl = constSampleUrl;
strUserId = constSampleUserID;
strPassword = constSamplePassword;
}
}

/* 購入ダイアログ表示 */
function store_show(first = false){
if (first == false) {
store.order(store_id);
}

strSendUrl = constSampleUrl; strUserId = constSampleUserID; strPassword = constSamplePassword; store.when(store_id).approved(function(product) { strSendUrl = constUrl; strUserId = constUserID; strPassword = constPassword; if (first == false) { product.finish(); } }); store.when(store_id).updated(check_notad);

}

function loadSettings() {
console.log("loadSettings start");

if (listArray == null) { listArray = new Array(); window.sessionStorage.setItem("listArraySession", JSON.stringify(listArray)); }

}

### 試したこと iOSアプリでは、購読状態を取得できたのですが Androidアプリでは、取得できない状態です。 ### 補足情報(FW/ツールのバージョンなど) 開発環境macOS(version:1.13.6) cordova(version:9.0.0) 使用プラグイン cc.fovea.cordova.purchase(version:8.1.1) node(version:8.12.0) android studio(version:3.5.3)

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ons.ready があるからmonaca?と思ったら、違うのですね。
ちょうど私も今、cordova.purchase でサブスクリプション課金を実装していて(monacaです)、androidはほぼ上手く動いていてiOSはStore設定見直し中・・・という、質問者さんとは逆の状態です。
何かお役に立てたらいいのですが。

まず、①②は念のためですが
①store_id という変数が引数になっている箇所は、「商品ID」が入るべき場所ですが、大丈夫ですよね?
②first という変数(宣言無し)と、isFirstという変数(宣言だけ)がありますが・・・


変数firstの意味と、なぜwhen().approvedが2つあるのかが分からないのですが、
2つ目のwhen().approvedの
if (first == false) {
product.finish();
}
の意味が、「初めてならproduct.finish()を呼ばない」ということであれば、それはなぜ?
finishを呼ばないと承認されない(ownedにならない)ですよね?


少なくともAndroidの場合、when(id).updated で指定した関数が呼ばれたときに、product.ownedの値がへんだなと思うことがありまして(購入をfinishした直後でまだfalseだったり)、私はwhen().owned の指定を入れています。こちらはばっちりです。

逆に質問なのですが・・・
cc.fovea.cordova.purchase(version:8.1.1)
をお使いとのこと。このパッケージと、↓(cordova-plugin-purchase version:10.0.1)の関係が分からないのです。同じ?でも違う・・・
https://github.com/j3k0/cordova-plugin-purchase

ちなみに私は後者を使っています。

投稿2020/03/06 02:43

app4jun

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shiba-t

2020/03/09 01:44

ご回答本当にありがとうございます。 元々cordovaで無課金アプリを作成していた流れで作成しています。 また、monacaの課金ソースも参考にしています。 ①ですが「商品ID」をセットしています。iosとandroidで共通にしています。 ②isFirstは課金部分とは別箇所で使用しています。 ③firstですが、課金後にアプリを再起動した時 onDeviceReady処理のinitializeStore後にownedフラグがfalseのままで、 どうにもできなく課金ボタンを押した処理をそのまま流用しました。 store_show(true)<-アプリ再起動時に実行 ご指摘頂いたapprovedは1つに修正し、if (first == false)の条件ははずしましたが 改善されませんでした。 ④ 以下サイトを参考にした関係でcc.fovea.cordova.purchaseを使用しました。 https://qiita.com/s-suefusa/items/8da126510d0263dd1e60 http://amisogumiblog.blog.fc2.com/blog-entry-15.html 色々調べていてios/android共に課金の画面から、課金完了までは動いているのですが 課金後、ownedフラグがfalseのままでどうにもならない状態です。 また、cordova-plugin-purchase version:10.0.1のパッケージに変えたところ Androidでは改善したのですが、逆にiosではコンパイルエラーになってしまい 厳しい状態です。
app4jun

2020/03/10 23:07

ええと・・・ 「課金完了までは動いている」とのことですが、それは具体的にどういう状態ですか(「ownedフラグがfalseのまま」では課金完了していることにならないと思うのですが。) また、 「Androidでは改善した」というのは?
shiba-t

2020/04/02 02:22

返信遅くなってしまい申し訳ありません。 課金完了の確認ですが、本番リリースし定期購読のボタンを押すと、 各osが提供する課金確認画面が表示され実際に課金されました。(入金もありました) Androidで改善と説明したのは、課金後アプリの表示内容が変わる 仕様で、表示内容が変わったので改善したとの認識でした。 相談させて頂いて、そもそもプログラム自体がおかしいか、 ownedフラグの挙動がおかしいように思いました。 また、そのような状況で課金出来てしまったのかは不明なところです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問