2013-03-08 4 views
0

Я разрабатываю серверную часть приложения с помощью IAP, я знаю, что мне нужно отправить квитанцию ​​из приложения на мой сервер, когда пользователь делает подписку, а затем проверить квитанцию ​​с хранилищем приложений для статуса, даты expiration и т. д., & предоставить пользователю контент.какой чековый билет для автоматической возобновляемой подписки следует проверить?

Но мой вопрос в том, какая квитанция нужна мне для проверки статуса продления? я имею в виду, что в первый раз, когда я проверю чек, магазин приложений вернет мне квитанцию, статус и самую последнюю квитанцию, эта последняя квитанция является той, которую я должен использовать, чтобы проверить статус в следующий раз, или я должен использовать всегда оригинальную квитанцию ? я тестировал их оба, и они дают мне тот же статус из магазина приложений, но я не уверен, что это правильный способ сделать.

Благодаря

ответ

0

после завершения транзакции вы получите tansaction & trasaction.reciept для этой транзакции reciept вы хотите предоставить base64 здесь код этого

NSString *jsonObjectString = [self encodeBase64:(uint8_t*)transaction.transactionReceipt.bytes 
             length:transaction.transactionReceipt.length]; 

это jsonObjectString спасет его сервер и при проверке квитанции, которую вы хотите предоставить поделенную для этого verify this link

+0

Спасибо за ссылку, у меня уже есть php-скрипт для проверки получения и работы, но когда у меня есть ответ из магазина приложений, я получаю статус, получение & last_receitp каждый раз, когда подписка возобновляется, поэтому я ' я смущен о том, что делать с этой последней квитанцией, должен ли я сохранять ее на своем сервере и использовать ее каждый раз, когда мне нужно проверить статус подписки или оригинальную квитанцию ​​(ту, которая была создана при совершении транзакции) достаточно? –

+0

Вы можете просто сохранить оригинальную квитанцию ​​и просто отправить ее Apple каждый раз для проверки. Для ARS Apple всегда будет отвечать последней квитанцией для этого идентификатора продукта. Таким образом, вам необязательно хранить новые квитанции –

0

Сегодня у меня проблемы с этой проблемой.

Следуйте за нами Apple doc здесь, я использовал этот способ проверки подписки истек или нет.

+ (BOOL)checkInAppPurchaseStatus 
{ 
    // Load the receipt from the app bundle. 
    NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; 
    NSData *receipt = [NSData dataWithContentsOfURL:receiptURL]; 
    if (receipt) { 
     BOOL sandbox = [[receiptURL lastPathComponent] isEqualToString:@"sandboxReceipt"]; 
     // Create the JSON object that describes the request 
     NSError *error; 
     NSDictionary *requestContents = @{ 
              @"receipt-data": [receipt base64EncodedStringWithOptions:0],@"password":@"SHARE_SECRET_CODE" 
              }; 
     NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents 
                   options:0 
                   error:&error]; 

     if (requestData) { 
      // Create a POST request with the receipt data. 
      NSURL *storeURL = [NSURL URLWithString:@"https://buy.itunes.apple.com/verifyReceipt"]; 
      if (sandbox) { 
       storeURL = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"]; 
      } 
      NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:storeURL]; 
      [storeRequest setHTTPMethod:@"POST"]; 
      [storeRequest setHTTPBody:requestData]; 

      BOOL rs = NO; 
      //Can use sendAsynchronousRequest to request to Apple API, here I use sendSynchronousRequest 
      NSError *error; 
      NSURLResponse *response; 
      NSData *resData = [NSURLConnection sendSynchronousRequest:storeRequest returningResponse:&response error:&error]; 
      if (error) { 
       rs = NO; 
      } 
      else 
      { 
       NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:resData options:0 error:&error]; 
       if (!jsonResponse) { 
        rs = NO; 
       } 
       else 
       { 
        NSLog(@"jsonResponse:%@", jsonResponse); 

        NSDictionary *dictLatestReceiptsInfo = jsonResponse[@"latest_receipt_info"]; 
        long long int expirationDateMs = [[dictLatestReceiptsInfo valueForKeyPath:@"@max.expires_date_ms"] longLongValue]; 
        long long requestDateMs = [jsonResponse[@"receipt"][@"request_date_ms"] longLongValue]; 
        NSLog(@"%lld--%lld", expirationDateMs, requestDateMs); 
        rs = [[jsonResponse objectForKey:@"status"] integerValue] == 0 && (expirationDateMs > requestDateMs); 
       } 
      } 
      return rs; 
     } 
     else 
     { 
      return NO; 
     } 
    } 
    else 
    { 
     return NO; 
    } 
} 

Надеюсь, что эта помощь.