Во-первых, есть несколько опечаток в размещенном коде. Попробуй это. (Отказ от ответственности:. Рефакторинг и др оставляется в качестве упражнения для читателей!)
- (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[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/=";
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];
}
Вы можете сделать эти внутренние методы класса, который обрабатывает ваши SKPaymentTransactionObserver сообщения:
@interface YourStoreClass (Internal)
- (BOOL)verifyReceipt:(SKPaymentTransaction *)transaction;
- (NSString *)encode:(const uint8_t *)input length:(NSInteger)length;
@end
Примечание: Вы могли бы использовать что-то вроде libcrypto для обработки кодировки base64, но затем вы смотрите на ограничения на экспорт и дополнительные шаги в момент утверждения приложения. Но я отвлекся ...
Затем, где бы вы не начали запись транзакции на своем удаленном сервере, позвоните verifyReceipt: с вашей транзакцией и убедитесь, что она возвращается положительно.
Между тем, на сервере, вот некоторый супер-урезанный PHP для обработки вещи:
$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;
Где вызова вашего-клиент-пост-здесь Вашего любимого HTTP POST механизм. (Curl это один из возможных вариантов. YMMV. PHP.net есть совок!)
Одна вещь, которая меня немного беспокоит длина полезной нагрузки в URL, идущей от приложения на сервер (через GET) , Я забываю, что в RFC есть проблема с длиной. Возможно, все в порядке, или, возможно, это зависит от сервера. (Читатели: Пособие приветствуется в этой части!)
Возможно, также возникнут некоторые отклонения от синхронного запроса. Вы можете отправить его асинхронно и установить ol 'UIActivityIndicatorView или какой-либо другой HUD. Дело в том, что initWithData: encoding: звонок занимает время loooooong для меня. Несколько секунд, что является небольшой вечностью в iPhone на земле (или где-нибудь еще в Интернете, если на то пошло). Может показаться, что какой-то неопределенный индикатор прогресса может быть полезен.
Спасибо за тыс наконец, получил это работает, думаю, что моя главная проблема была в моем PHP-код. Еще раз спасибо, Andy – Andy
Привет, используя предоставленный здесь скрипт, я получаю следующий ответ с сервера: 21002 ... можете ли вы рассказать мне, что это значит? Я вижу другого парня в этом сообщении, в котором упоминается аналогичная проблема. Спасибо за ваше время. – SpaceDog
Хм ... не могу сказать, что я когда-либо видел этот ответ. :(Единственное, что я хотел бы проверить дважды, это то, что вы делаете HTTP _post_, а не HTTP_get_. То есть, полезная нагрузка поступает в данные сообщения, а не в строку запроса. –