可以纯粹在设备上的应用程序内购买收据validation与iOS6完成吗?

我一直在努力validation我想在iOS6和iOS7上运行的应用程序中的应用程序内购买收据。 我到目前为止的计划是:(a)首先在没有连接到Apple服务器的情况下(如在这些Apple文档中和WWDC 2013会话“使用收据保护您的数字销售”中所述)纯粹进行设备上的收据validation,然后(b)在我的服务器上进行验收。 这样做两次应该会有所帮助,而在我的服务器closures的情况下,也会使事情变得更加安全。

我终于收到一个从App Store回来的示例收据,并且在设备收据validation方面遇到了问题。 我正在iOS6系统(iPad)上testing,并使用SKPaymentTransaction中的transactionReceipt(而不是NSBundle中的appStoreReceiptURL)获取收据。 这是我有的样品收据:

{ "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" = "ewoJIm=="; "environment" = "Sandbox"; "pod" = "100"; "signing-status" = "0"; } 

在我的设备收据validation中,我无法转换为PKCS#7表示forms:

 // 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而不是二进制。

回过头来看看苹果文档 ,我发现了一个短语:“在iOS中,如果appStoreReceiptURL方法不可用(在旧系统上),可以使用App Store来validationSKPaymentTransaction对象的transactionReceipt属性。详细信息,请参阅“使用App Storevalidation收据”。

我似乎可能做了一个错误的假设。 我一直假设iOS6和iOS7收据的格式是相同的,只是从不同的地方获得。

是SKPaymentTransaction ASCII的transactionReceipt属性的收据和NSBundle二进制文件的appStoreReceiptURL方法的收据?

你真的可以在iOS6中使用transactionReceipt获得的收据进行纯粹的设备上收据validation吗?

思考? 克里斯。

EDITS

我再次观看了会议WWDC 2013“使用收据保护您的数字销售”,看起来很明显,iOS6收据格式与iOS7格式不同。 我希望苹果公司能够提供iOS6和iOS7收据格式之间的比较。 虽然我还没有使用运行iOS7的硬件,并且由于应用内购买在模拟器上不起作用,所以我还没有访问示例iOS7收据。 :(。

不需要。您必须通过外部服务器validation应用程序购买。 如果你不这样做,那么欺骗应用内购买机制是相当简单的。

您当然可以使用Apple发布的VerificationController中的代码摘录对transaction.transactionReceipt进行设备上接收validation。 我修改并在开发者论坛上发布了名为VerificationControllerPBKSimple的代码。 收据由苹果公司签署,所以这个过程是相当安全的,除非有人在他们的设备上编译了Objective-C代码,直到不再使用的transaction.transactionReceipt消失。

你也可以在iOS7的收据(不是transaction.transactionReceipt)上进行设备上的收据validation,但这需要一些奇特的编码。