Birincisi, yayınlanan kod birkaç yazım hatası var. Bu deneyin. (Yasal Uyarı:.! Refactoring ark okuyucu için bir egzersiz olarak bırakılmıştır)
- (BOOL)verifyReceipt:(SKPaymentTransaction *)transaction {
NSString *jsonObjectString = [self encode:(uint8_t *)transaction.transactionReceipt.bytes length:transaction.transactionReceipt.length];
NSString *completeString = [NSString stringWithFormat:@"http://url-for-your-php?receipt=%@", jsonObjectString];
NSURL *urlForValidation = [NSURL URLWithString:completeString];
NSMutableURLRequest *validationRequest = [[NSMutableURLRequest alloc] initWithURL:urlForValidation];
[validationRequest setHTTPMethod:@"GET"];
NSData *responseData = [NSURLConnection sendSynchronousRequest:validationRequest returningResponse:nil error:nil];
[validationRequest release];
NSString *responseString = [[NSString alloc] initWithData:responseData encoding: NSUTF8StringEncoding];
NSInteger response = [responseString integerValue];
[responseString release];
return (response == 0);
}
- (NSString *)encode:(const uint8_t *)input length:(NSInteger)length {
static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
NSMutableData *data = [NSMutableData dataWithLength:((length + 2) / 3) * 4];
uint8_t *output = (uint8_t *)data.mutableBytes;
for (NSInteger i = 0; i < length; i += 3) {
NSInteger value = 0;
for (NSInteger j = i; j < (i + 3); j++) {
value <<= 8;
if (j < length) {
value |= (0xFF & input[j]);
}
}
NSInteger index = (i / 3) * 4;
output[index + 0] = table[(value >> 18) & 0x3F];
output[index + 1] = table[(value >> 12) & 0x3F];
output[index + 2] = (i + 1) < length ? table[(value >> 6) & 0x3F] : '=';
output[index + 3] = (i + 2) < length ? table[(value >> 0) & 0x3F] : '=';
}
return [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease];
}
Sen SKPaymentTransactionObserver iletilerini işleme sınıfın bu İç yöntemleri yapabilirsiniz:
@interface YourStoreClass (Internal)
- (BOOL)verifyReceipt:(SKPaymentTransaction *)transaction;
- (NSString *)encode:(const uint8_t *)input length:(NSInteger)length;
@end
Not: could libcrypto base64 kodlaması işlemek için gibi bir şey kullanmak, ancak daha sonra app onay anda ihracat kısıtlamaları ve ekstra adımlar bakıyoruz. Ama ben sapmak ...
Eğer işlem ile uzak sunucu, çağrı verifyReceipt: üzerinde işlem kayıt kick-off ve emin olmak niyetinde Daha sonra her yerde, bu pozitif geri geliyor.
Bu arada, sunucu üzerinde, burada şeyleri işlemek için bazı süper-elimden aşağı PHP bulunuyor:
$receipt = json_encode(array("receipt-data" => $_GET["receipt"]));
// NOTE: use "buy" vs "sandbox" in production.
$url = "https://sandbox.itunes.apple.com/verifyReceipt";
$response_json = call-your-http-post-here($url, $receipt);
$response = json_decode($response_json);
// Save the data here!
echo $response->status;
Nerede call-your-http-post-here favori HTTP post mekanizmadır. (cURL olası bir seçimdir. YMMV. PHP.net kepçe var!)
Beni biraz ilgili olan bir şey (GET) sunucuya app giden URL yükün uzunluğudur. Bir uzunluk konu RFC'lere başına orada olmadığını unutuyorum. Belki Tamam, ya da belki de sunucu özgü bulunuyor. (Okuyucular: Bu bölümünde Düşünme hoş geldiniz!)
Ayrıca, bu bir senkron isteği yaparak bazı balking olabilir. Sen uyumsuz olarak gönderebilir ve ol 'UIActivityIndicatorView veya diğer bazı HUD koymak isteyebilirsiniz. Tipik bir örnek: initWithData:encoding: çağrısı benim için bir loooooong zaman alır bu. (Bu konuda çevrimiçi veya başka bir yerde,) iPhone topraklarda küçük bir sonsuzluk olduğunu birkaç saniye. Belirsiz ilerleme göstergesi çeşit gösteriliyor tavsiye edilebilir.