Проверка подтверждения покупки приложения в приложении

Я хочу проверить получение транзакции в своем приложении,

Вот мой код,

- (void)recordTransaction:(SKPaymentTransaction *)transaction {

    NSData *receiptData = [NSData dataWithData:transaction.transactionReceipt];

    NSString *encodedString = [Base64 encode:receiptData];

     NSURL *url = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"];

    ASIFormDataRequest *request = [[ASIFormDataRequest alloc] initWithURL:url];

    [request setPostValue:encodedString forKey:@"receipt-data"];

    [request setRequestMethod:@"POST"];

    [request setDelegate:self];

    [request startAsynchronous];

}

Я получаю вывод:

{ "status": 21002, "exception": "java.lang.NullPointerException" }

Может кто-нибудь помочь мне получить правильную проверку чека?

Ответ 1

После нескольких попыток я решил выполнить проверку чеков со стороны сервера. На самом деле это рекомендуемый способ.

Вот мой код,

-(void)recordTransaction:(SKPaymentTransaction *)transaction {   

NSString* receiptString = [[[NSString alloc] initWithData:transaction.transactionReceipt encoding:NSUTF8StringEncoding] autorelease];

// POST this string to your server

// I used ASIFormDataRequest 

}

// server side 

$url = 'https://sandbox.itunes.apple.com/verifyReceipt';

// encode the receipt data received from application

$purchase_encoded = base64_encode( $purchase_receipt );

//Create JSON

    $encodedData = json_encode( Array( 
        'receipt-data' => $purchase_encoded 
    ) );


// POST data

    //Open a Connection using POST method, as it is required to use POST method.
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $encodedData);
    $encodedResponse = curl_exec($ch);
    curl_close($ch);


  //Decode response data using json_decode method to get an object.

      $response = json_decode( $encodedResponse );


// check response

if ($response->{'status'} != 0)

    // Invalid receipt

else

   // valid reciept

Я нашел справочную форму,

http://gamesfromwithin.com/in-app-purchases-part-3

Ответ 2

Просто для тех, кто может оказаться полезным. Я заметил, что яблоко обновило Руководство по покупке приложений с некоторым кодом статуса, который предназначен для покупки автоматической возобновляемой подписки, но, похоже, здесь также применяется.

  • 21000 Магазин приложений не смог прочитать предоставленный вами объект JSON.
  • 21002 Данные в свойстве квитанции были искажены.
  • 21003 Квитанция не может быть аутентифицирована.
  • 21004 Общий секрет, который вы предоставили, не совпадает с общим секретом файла для вашей учетной записи.
  • 21005 Сервер получения недоступен.
  • 21006 Эта квитанция действительна, но срок действия подписки истек. Когда этот код состояния возвращается на ваш сервер, данные квитанции также декодируются и возвращаются как часть ответа.
  • 21007 Эта квитанция является чековой книжкой, но она была отправлена ​​на производственный сервис для проверки.
  • 21008 Эта квитанция является производственной квитанцией, но она была отправлена служба песочницы для проверки.

Важно: Необязательные коды статуса здесь применяются только при восстановлении информации об автоматической возобновляемой подписке. Не используйте эти коды состояния при тестировании ответов на другие виды продуктов. (Действительно?)

Надеюсь, это поможет в качестве ссылки. Я получил гвоздь с 21007.

Список кодов состояния на веб-сайте Apple: https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html

Ответ 3

... вы не увольняете свой запрос. Таким образом, ваш ответ пуст, потому что вы еще не сделали запрос!

Либо добавьте вызов [request startSynchronous] (как правило, это плохая идея, вы должны всегда запускать сетевые вызовы асинхронно), либо еще лучше переписать свой код для поддержки асинхронного сетевого вызова и вместо этого использовать [request startAsynchronous].

Я бы предложил просмотреть документацию ASI, если вам нужна дополнительная информация: http://allseeing-i.com/ASIHTTPRequest/How-to-use

Ответ 4

Из следующей справки я понимаю, что вашему приложению необходимо использовать отдельный сервер для "Проверка поступления квитанции". Я думаю, что для проверки чеков нам нужно использовать запрос от статического ip.

спасибо,

Ссылка