前提・実現したいこと
現在Monacaとcordova-plugin-purchaseを用いてiOSおよびAndroidアプリの定期購読の実装をしているのですが、復元処理(リストア)時のベストな実装方法がわからないため質問させてください。
発生している問題
store.refresh()コールによる復元処理(リストア)時に、今までの購読継続した回数分のレシートが再生成され、そのレシート数分approved()イベントがコールされます。
この時、盲目的にverify()を呼ぶと、そのレシート数分検証サーバーに対して、レシート検証を問い合わせるため、大量の通信が発生し、また、verifed()またはexpired()イベントもその回数発生してしまうため、購読継続が増えれば増えるほどクライアントアプリまたは検証サーバーに対して負荷をかけてしまうことになります。
したがって、復元処理においては、継続回数によらず、1度のみverify()を実行したいと考えているのですが、どのように実装すればよいのかを教えていただきたいです。
なおシーケンス図は下記です。
該当のソースコード
iOSで検証したときに、以下approvedイベントが継続した数分発火します。
transaction.original_transaction_idはnullが返却され、
transaction.idは毎回違った値(おそらくAppStoreが再生成したレシート番号)が返却されます。
expiryDateおよびlastRenewalDateはすべてのイベントで最後の更新の日時が入っています。
js
1 /* 起動時のapprovedイベントに対する処理 */ 2 // アプリ購入が承認された場合 3 // 発火のタイミング:購入完了後、アプリ起動直後 4 store.when("SubscriptionItem").approved(function (product) { 5 6 alert_message = "[approved]\n" + 7 "\n owned=(" + product.owned + 8 ")\n state=(" + product.state + 9 ")\n expiryDate=(" + product.expiryDate + 10 ")\n lastRenewalDate=(" + product.lastRenewalDate + 11 ")\n transaction.id=(" + product.transaction.id + 12 ")\n original_transaction_id=(" + product.transaction.original_transaction_id + 13 ")\n transaction.type=(" + product.transaction.type + ")"; 14 alert(alert_message); 15 16 // サーバで検証する 17 product.verify(); 18 });
補足情報(FW/ツールのバージョンなど)
cordova-plugin-purchase(v10.2.0)
OnsenUI(v2.10.10)
あなたの回答
tips
プレビュー