問題タブ [receipt-validation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - ユーザーが iOS でアプリの購入を復元するときに、リプレイ攻撃/レシートの再利用を防ぐにはどうすればよいですか?
ユーザーが購入した場合、リプレイ攻撃 (ユーザーが古いレシートを再利用して新しいコンテンツを取得すること) を防ぐために、そのトランザクション ID が以前に使用されたかどうかを確認します。だったら却下。それはうまくいきます。
ただし、ユーザーが「以前の購入を復元する」場合、ここでそれを防ぐにはどうすればよいですか? トランザクションは以前に購入されたものであることが予想されますが、レシートがその特定のユーザーからのものであり、一般的なレシートからのリプレイ攻撃ではないことをどのように確認できますか?
特定のユーザーにリンクできますか? 復元をタップするだけで回避できるのに、購入時にリプレイ攻撃を防ぐのはばかげているようです...
ios - Apple In-App Purchase レシート バージョン 3 (バージョン 2 の代わりに突然表示される)
私のアプリの領収書の検証が最近壊れ始めました。どうやら、過去 2 ~ 3 週間で、Apple はアプリ内購入レシートのバージョン番号を から に変更した2
よう3
です。
署名構造体を調べる場合:
…ここで、 (iOS 7 以降非推奨)オブジェクトsignature_bytes
の JSON BLOB からの署名文字列の Base64 でデコードされた値です。transactionReceipt
SKPaymentTransaction
…のチェックをハードコードしましたversion == 2
。今、私は の値を見ています3
。
App Store で数年後、ここ 2 ~ 3 週間で、新しい購入や「復元」購入でアプリのコンテンツをアクティブ化できないというユーザー レポートがアプリに届き始めました。したがって、これは Apple 側の最近の変更であると思います。
Apple が変更を行ったことを確認できる人はいますか? 詳細を教えてください。この新しいバージョンの購入レシートに関するドキュメントを教えていただけないでしょうか?
ios - iOS レシート検証ステータス コード 21009: MZInAppCacheAccessException とは?
App Store でレシートを検証しています。非常にまれなケース (~0.5‰) では、JSON は次のようになります。
残念ながら、Apple はステータス コード表でこのコードについて言及していません。
例外の名前を検索すると、Web 全体で 1 つの参照しかありませんでした。それは、Apple Developer Forums の代表的なスレッドです: What is Error code 21009? いくつかの「私も」の投稿を除けば、「具体的な情報」がある場合は、「より多くの情報で対応する」という Apple スタッフの回答があります。
頻度について: スレッドの日付は 2016-03-15 です。私はこれらの日付での出来事を知っています:
この例外は無視できるほどまれですが、いくつかの光を当てていただければ幸いです。
この例外を処理する適切な方法を見つけた人はいますか? (再確認のように)
この例外は実際にはどういう意味ですか? (「jingle」、「commercelogic」、「MZInAppCache」とは何ですか?)
ios - iOS アプリの領収書の検証 - デバッグ中にシミュレーターとデバイスで領収書が見つからない
アプリの開発中にレシートがないのはなぜですか?
Xcode 7.3.1 から iOS (7、8、9) アプリを実行しています。アプリの領収書が見つからないようです。このアプリは現在 App Store で出荷されているため、開発者の資格情報と「サンドボックス」ユーザー ログインがあります。
シミュレーター
次のコードを実行する場合:
iPhone 6s Plus の Simulator 9.3 での結果:
ファイル:///Users/Bourque/Library/Developer/CoreSimulator/Devices/7F32850A-CC1A-45A3-8ED6-95C75CD9DD44/data/Containers/Data/Application/46BDF021-D2A3-418E-91E1-61A15215942B/StoreKit/receipt
しかし、2 番目の UUID で名前が付けられたフォルダーに移動すると、フォルダーが見つかりませんStoreKit
。
実機
実際の iOS iPod touch でテストするために、そのコードを次のように展開します。</p>
…領収書の場所を確認します。
…そんなファイルを読み込んでみる。
…ファイルが存在するかどうかを確認します。
実行時の結果。
URL: file:///private/var/mobile/Containers/Data/Application/21430192-6E3A-4929-B847-23FD525D804E/StoreKit/sandboxReceipt
urlContents: (ヌル)
悪い URL の領収書が見つかりません: file:///private/var/mobile/Containers/Data/Application/21430192-6E3A-4929-B847-23FD525D804E/StoreKit/sandboxReceipt
file:///private/var/mobile/Containers/Data/Application/B1497F0D-95A7-4AD8-A9D5-7AF95663A04F/StoreKit/sandboxReceipt
ios - iOS アプリ内購入レシート追加ペイロード
私のアプリケーションでは、ユーザーは Apple ID ではなく、システム内の自分のアカウントにリンクされた購入を行うことができます。通常、iOS アプリは App Store のレシートをサーバーに送信し、サーバーはそれを検証します。レシート内の各トランザクションは特定のユーザー アカウントに属していることを知りたいです。これを行う 1 つの方法は、次のような追加のパラメーターをさらに受信に送信することです。
レシートのデジタル署名の検証により、内部のデータが有効であり、ハッカーによって置き換えられていないことを確認します。パラメーター (ログインとプラットフォーム) がレシート内にある場合、検証は完全に安全であり、有効なデジタル署名はすべての購入が有効でアカウントに属していることを示します。そうしないと、1 つの領収書が異なるログインで送信され、複数のユーザーが支払いなしで購入できるようになります。これを防ぐには、たとえば、すべてのバンドル (領収書、ログイン、プラットフォーム) を追加で署名し、トランザクション ID とユーザー ID の一意のペアのチェックを追加することができます。私の質問は、レシートに追加のトランザクション パラメータを追加する方法、またはレシートとユーザー アカウントの購入間のリンクをアーカイブする別の一般的な方法はありますか?
javascript - React Native/Swift - iAP のレシート検証
携帯電話から iOS In App 購入の領収書を取得し、JavaScript オブジェクトとして互換性のあるものとして Swift からのコールバックでそれを返そうとしています。これは可能ですか?Swift のオブジェクトは NSData タイプですが、RCTJSONStringify() encountered the following error: Invalid type in JSON write (NSConcreteData)
このオブジェクトをネイティブに反応させるために戻そうとすると取得します。
また、base64としてエンコードしてwindow.atob(data)
から、反対側でデコードするために使用しようとしましたが、あらゆる種類の奇妙な文字が得られました.
どんな助けでも大歓迎です!
php - PHP サーバーで iOS レシートを検証して読み取る
iOS の領収書の検証に関する多くの議論を読みましたが、Apple サーバーを呼び出さずに PHP で領収書の内容を検証して読み取る方法を見つけることができませんでした (これは非常に遅く、アプリを開く前に 4/5 秒待機させます)。 )。
残念ながら、証明書、SSL、および暗号化に関する一般的な知識は貧弱であるため、このようなものが必要ですが、Objective-C/Swift ではなく PHP で必要です。誰かが私を助けることができますか?
ios - 「main」メソッドでチェックした場合、レシートが存在しない場合、Receigen が生成したレシート検証コードがクラッシュする
Receigenのドキュメントやその他の情報源では、main
メソッドの早い段階でも、アプリのレシートをできるだけ早く検証することを提案しています。
Receigen で生成されたコードをmain
メソッドで呼び出すと、アプリに Receipt がない場合に実行中断が発生します。
を呼び出すとreturn UIApplicationMain
、Xcode 7.3.1 で次のエラー メッセージが表示されます。
スレッド 1: EXC_BAD_ACCESS (コード = 1、アドレス = 0xe)
この呼び出しをメソッドからアプリのデリゲートのメソッドの先頭に移動するMyPrefix_CheckReceipt
とmain
、didFinishLaunchingWithOptions
回避策になります。EXC_BAD_ACCESS
レシートが存在しなくてもエラーは発生しません。
ユーザーが Mac または PC 上の iTunes アプリを介してバックアップからアプリを復元するときに、レシートがないことが現場で発生する可能性があります。また、実際のハードウェア iOS デバイスで Xcode を介して初めて実行するとき、またはデバイスからアプリを削除した後に、開発中にレシートがないことが常に発生します。
2 回目の実行では、このようなエラーは発生しません。レシートが偽の「サンドボックス」App Store から正常に取得され、2 回目の実行で表示されることを確認しました。
main
質問は次のとおりです。メソッドから検証呼び出しが行われた場合にのみ、Receigen コードがクラッシュしてレシートが見つからないのはなぜですか?
ios - 最初に購入したバージョンが常に 1.0 と表示されるのはなぜですか?
次のコードを使用して、ユーザーの領収書を抽出して、元の購入バージョンが何であったかを確認しようとしています:
しかし、私は testflight ベータ プログラムをセットアップし、テストしているユーザーは以前にバージョン 1.32 を購入しましたが、返される値は常にバージョン 1.0 です。