1

iOS6 および iOS7 で実行したいアプリのアプリ内購入レシートを検証する作業を行っています。これまでの私の計画は次のとおりでした: (a) まず、Apple サーバーに接続せずに純粋にオンデバイスのレシート検証を行います (これらの Apple ドキュメントおよび WWDC 2013 セッション「Using Receipts to Protect Your Digital Sales」で提供されているように)、次に (b) 2 番目にサーバーで受信確認を行います。2 回実行すると役立つはずです。万が一サーバーがダウンした場合でも、セキュリティが強化されます。

ようやく App Store からレシートの例が戻ってきましたが、デバイスでのレシートの検証に問題があります。私は iOS6 システム (iPad) でテストしており、SKPaymentTransaction (NSBundle の appStoreReceiptURL ではありません) から transactionReceipt を使用して領収書を取得しています。私が持っている領収書のサンプルは次のとおりです。

{
    "signature" = "AkkgbJWkOGHyXoigel4s39Ut37kiYv+sXwhTa6+ic6LJPOq3DLV3B2zi9aebiezw6nvbJKyFrIYh1mqiKHDp/gJ5RFrslWDxk7ntiKIs1eJ3bpFgDC733Au9f1zUctvAiFwN+9L/FOGWugddwnHMhh9N8eSPoK+BoYUX8ObeCxc7AAADVzCCA1MwggI7oAMCAQICCGUUkU3ZWAS1MA0GCSqGSIb3DQEBBQUAMH8xCzAJBgNVBAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSYwJAYDVQQLDB1BcHBsZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEzMDEGA1UEAwwqQXBwbGUgaVR1bmVzIFN0b3JlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA5MDYxNTIyMDU1NloXDTE0MDYxNDIyMDU1NlowZDEjMCEGA1UEAwwaUHVyY2hhc2VSZWNlaXB0Q2VydGlmaWNhdGUxGzAZBgNVBAsMEkFwcGxlIGlUdW5lcyBTdG9yZTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMrRjF2ct4IrSdiTChaI0g8pwv/cmHs8p/RwV/rt/91XKVhNl4XIBimKjQQNfgHsDs6yju++DrKJE7uKsphMddKYfFE5rGXsAdBEjBwRIxexTevx3HLEFGAt1moKx509dhxtiIdDgJv2YaVs49B0uJvNdy6SMqNNLHsDLzDS9oZHAgMBAAGjcjBwMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUNh3o4p2C0gEYtTJrDtdDC5FYQzowDgYDVR0PAQH/BAQDAgeAMB0GA1UdDgQWBBSpg4PyGUjFPhJXCBTMzaN+mV8k9TAQBgoqhkiG92NkBgUBBAIFADANBgkqhkiG9w0BAQUFAAOCAQEAEaSbPjtmN4C/IB3QEpK32RxacCDXdVXAeVReS5FaZxc+t88pQP93BiAxvdW/3eTSMGY5FbeAYL3etqP5gm8wrFojX0ikyVRStQ+/AQ0KEjtqB07kLs9QUe8czR8UGfdM1EumV/UgvDd4NwNYxLQMg4WTQfgkQQVy8GXZwVHgbE/UC6Y7053pGXBk51NPM3woxhd3gSRLvXj+loHsStcTEqe9pBDpmG5+sk4tw+GK3GMeEN5/+e1QT9np/Kl1nj+aBw7C0xsy0bFnaAd1cSS6xdory/CUvM6gtKsmnOOdqTesbp0bs8sn6Wqs0C9dgcxRHuOMZ2tm8npLUm7argOSzQ==";
    "purchase-info" = "ewoJIm9yaWdpbmFsLXB1cmNoYXNlLWRhdGUtcHN0IiA9ICIyMDEzLTEwLTE4IDE2OjQ3OjM4IEFtZXJpY2EvTG9zX0FuZ2VsZXMiOwoJInVuaXF1ZS1pZGVudGlmaWVyIiA9ICI5OTQ2ZTk0M2E4YTI3YzhlM2U0YzY4YmM1N2I5YWQ2MmUwOTFjNmUxIjsKCSJvcmlnaW5hbC10cmFuc2FjdGlvbi1pZCIgPSAiMTAwMDAwMDA5MDYwNjMzOSI7CgkiYnZycyIgPSAiMS4wIjsKCSJ0cmFuc2FjdGlvbi1pZCIgPSAiMTAwMDAwMDA5MDYwNjMzOSI7CgkicXVhbnRpdHkiID0gIjEiOwoJIm9yaWdpbmFsLXB1cmNoYXNlLWRhdGUtbXMiID0gIjEzODIxNDAwNTg3NjYiOwoJInVuaXF1ZS12ZW5kb3ItaWRlbnRpZmllciIgPSAiODBERjQ0RUItNkQ1OS00QTBBLUEwNkEtQzg2RjM0QTcwQ0ZDIjsKCSJwcm9kdWN0LWlkIiA9ICJiaXouU3Bhc3RpY011ZmZpbi5QZXR1bmlhLkFkUmVtb3ZhbFllYXJseSI7CgkiaXRlbS1pZCIgPSAiNzI3MTg5MzU4IjsKCSJiaWQiID0gImJpei5TcGFzdGljTXVmZmluLlBldHVuaWEiOwoJInB1cmNoYXNlLWRhdGUtbXMiID0gIjEzODIxNDAwNTg3NjYiOwoJInB1cmNoYXNlLWRhdGUiID0gIjIwMTMtMTAtMTggMjM6NDc6MzggRXRjL0dNVCI7CgkicHVyY2hhc2UtZGF0ZS1wc3QiID0gIjIwMTMtMTAtMTggMTY6NDc6MzggQW1lcmljYS9Mb3NfQW5nZWxlcyI7Cgkib3JpZ2luYWwtcHVyY2hhc2UtZGF0ZSIgPSAiMjAxMy0xMC0xOCAyMzo0NzozOCBFdGMvR01UIjsKfQ==";
    "environment" = "Sandbox";
    "pod" = "100";
    "signing-status" = "0";
}

オンデバイスのレシート検証で、PKCS #7 表現に変換するステップで失敗しています。

// Without (void *) coercion, we get a warning, but we're only reading from this buffer in BIO_new_mem_buf
b_receipt = BIO_new_mem_buf((void *) [self.receipt bytes], [self.receipt length]);
if (! b_receipt) {
    endWithMessage(@"Failed on BIO_new_mem_buf: receipt"); return(ReceiptInvalid);
}

// Convert receipt data to PKCS #7 Representation
p7 = d2i_PKCS7_bio(b_receipt, NULL);
if (! p7) {
    endWithMessage(@"Failed on d2i_PKCS7_bio"); return(ReceiptInvalid);
}

これまでのところ、領収書がバイナリではなく ASCII であるという事実に驚かされました。

Apple docsに戻ると、「iOS では、(古いシステムで) appStoreReceiptURL メソッドが使用できない場合、App Store で SKPaymentTransaction オブジェクトの transactionReceipt プロパティを検証する方法にフォールバックできます。詳細については、「App Store で領収書を検証する」を参照してください。

間違った仮定をした可能性があるようです。私は、iOS6 と iOS7 の領収書は同じ形式で、別の場所から取得しただけであると想定しています。

SKPaymentTransaction ASCII の transactionReceipt プロパティからの領収書と NSBundle バイナリの appStoreReceiptURL メソッドからの領収書ですか?

iOS6 で transactionReceipt によって取得されたレシートを使用して、純粋にオンデバイスのレシート検証を本当に行うことができますか?

考え?クリス。

編集

セッション WWDC 2013「Using Receipts to Protect Your Digital Sales」をもう一度見ましたが、明らかに iOS6 のレシート形式は iOS7 の形式とは異なるようです。Apple が iOS6 と iOS7 のレシート形式の比較をどこかで提供してくれることを願っています。ただし、iOS7 を実行するハードウェアにはまだアクセスできません。シミュレーターではアプリ内購入が機能しないため、iOS7 の領収書の例にはまだアクセスできません。:(。

4

2 に答える 2

0

いいえ。アプリの購入では、外部サーバー経由で検証する必要があります。そうしないと、アプリ内購入メカニズムをだますのはかなり簡単です。

于 2013-10-19T03:19:23.070 に答える
0

Apple が投稿した VerificationController のコードの抜粋を使用して、transactionReceipt のオンデバイスのレシート検証を確実に実行できます。私はそれを修正し、VerificationControllerPBKSimple という名前のコードを Developers Forum に投稿しました。レシートは Apple によって署名されているため、誰かがデバイス上でコンパイル済みの Objective-C コードをいじらない限り、また非推奨の transaction.transactionReceipt が消えるまで、このプロセスはかなり安全です。

iOS7 レシート (transaction.transactionReceipt ではない) のオンデバイス レシート検証を実行することもできますが、これには高度なコーディングが必要です。

于 2014-01-04T07:12:56.977 に答える