English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

IOSアプリ内での支払いで旧Receiptと新Receiptのアダプテーション方法

ios7.0以降、iOSの支払いが成功した場合に戻ってくる票据Receiptの取得方法が新しい方法になりました

元のSKPaymentTransactionのtransactionReceipt属性で票据を取得する方法はもう古くなっていますが、まだ使用できますが、Appleの公式推奨では新しい方法を使用することをお勧めします

新しいバージョンのReceiptの取得方法は新しいインターフェースを使用して以下の通りです

NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];

もちろん、iosより低いバージョン7.0のものは古いバージョンのインターフェースを使用する必要があります、両方のバージョンに対応するコードは以下の通りです:

NSData*receipt= nil;
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")){
//ios after 7.0
  NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
  receipt = [NSData dataWithContentsOfURL:receiptURL];
  NSString *receiptURLStr = [receiptURL absoluteString];
  NSRange rangeSandbox = [receiptURLStr rangeOfString:@"sandbox"];
  if (rangeSandbox.location != NSNotFound){
    record[kIAPEnvironment] = [NSNumber numberWithInt:1];
  }
}
//ios 3.0~7.0
  receipt = transaction.transactionReceipt;
  NSDictionary *dict = [NSDictionary dictionaryWithContentsOfData:receipt];
  if (dict){
    NSString *env = [dict objectForKey:@"environment"];
    if ([env isEqualToString:@"Sandbox"]) {
      record[kIAPEnvironment] = [NSNumber numberWithInt:1];
    }
 }
}

サンドボックス支払いかどうかを判断する、新しいバージョンではreceiptURLに「sandbox」が存在するかどうかを直接判断できます

古いバージョンのreceiptはNSDataを解析して、環境がSandboxであるかどうかを確認することができます

+ (NSDictionary *)dictionaryWithContentsOfData: (NSData *)data{
  CFPropertyListRef plist = CFPropertyListCreateFromXMLData(kCFAllocatorDefault, (__bridge CFDataRef)data,
  kCFPropertyListImmutable, NULL);
  if(plist == nil) return nil;
  if ([(__bridge id)plist isKindOfClass:[NSDictionary class]]){
  return (__bridge NSDictionary *)plist;
  }
  CFRelease(plist);
  return nil;
  }
}

クライアントレシート確認方法:

NSError *error;
NSDictionary *requestContents = @{
@"receipt-data": [receipt base64EncodedString]
};
NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents
options:0
error:&error];
if (!requestData) {
  return;
}
// レシートデータでPOSTリクエストを作成します。
NSURL *storeURL = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"];//サンドボックス支払い確認によって適切なアドレスを取得します。
NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:storeURL];
[storeRequest setHTTPMethod:@"POST"];
[storeRequest setHTTPBody:requestData];
// バックグラウンドキューでiTunes Storeに接続します。
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:storeRequest queue:queue
completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
  if (connectionError) {
  /* ... エラーハンドル ... */
} else {}}
  NSError *error;
  NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data   options:0 error:&error];
  if (!jsonResponse) { /* ... エラーハンドル ...*/ }
  /* ... 送信先頭に応答を送信します ... */
  }
};

老版本返回格式:

{
bid = "com.coodezhang.test";
bvrs = "1.0";
"item_id" = 892617314;
"original_purchase_date" = "2017-12-14 07:43:14 Etc/GMT";
"original_purchase_date_ms" = 1626147394550;
"original_purchase_date_pst" = "2017-12-14 12:43:14 アメリカ/Los_Angeles";
"original_transaction_id" = 1000001127239959;
"product_id" = "com.coodezhang.test_coins"99M_Tier1";
"purchase_date" = "2017-12-14 07:43:14 Etc/GMT";
"purchase_date_ms" = 1626147394550;
"purchase_date_pst" = "2017-12-14 12:43:14 アメリカ/Los_Angeles";
quantity = 1;
"transaction_id" = 1000001127239959;
"unique_identifier" = 0000b0124819;
"unique_vendor_identifier" = "ASDGF"2DB-DSAD-5A21-9611-642A4B9CASDE7";
};
status = 0;
}

新版本返回格式官方文档:官方文档

新版本返回格式:

{
environment = Sandbox;
receipt =   {
"adam_id" = 0;
"app_item_id" = 0;
"application_version" = 1;
"bundle_id" = "com.coodezhang.test";
"download_id" = 0;
"in_app" =     (
{
"is_trial_period" = false;
"original_purchase_date" = "2017-12-14 07:18:56 Etc/GMT";
"original_purchase_date_ms" = 1513235936000;
"original_purchase_date_pst" = "2017-12-13 23:18:56 アメリカ/Los_Angeles";
"original_transaction_id" = 1000000359369424;
"product_id" = "com.coodezhang.test_coins"99M_Tier1";
"purchase_date" = "2017-12-14 07:18:56 Etc/GMT";
"purchase_date_ms" = 1513235936000;
"purchase_date_pst" = "2017-12-13 23:18:56 アメリカ/Los_Angeles";
quantity = 1;
"transaction_id" = 1000000359369424;
}
...... 可能存在多条
);
"original_application_version" = "1.0";
"original_purchase_date" = "2013-08-01 07:00:00 Etc/GMT";
"original_purchase_date_ms" = 1375340400000;
"original_purchase_date_pst" = "2013-08-01 00:00:00 アメリカ/Los_Angeles";
"receipt_creation_date" = "2017-12-14 07:18:56 Etc/GMT";
"receipt_creation_date_ms" = 1513235936000;
"receipt_creation_date_pst" = "2017-12-13 23:18:56 アメリカ/Los_Angeles";
"receipt_type" = ProductionSandbox;
"request_date" = "2017-12-14 07:19:23 Etc/GMT";
"request_date_ms" = 1513235963829;
"request_date_pst" = "2017-12-13 23:19:23 アメリカ/Los_Angeles";
"version_external_identifier" = 0;
};
status = 0;
}

特に、新しいバージョンではデータ構造のin_appフィールドが複数のtransactionのレシートを含む可能性があります。transactionが完了した後、レシートを読み取るインターフェースがまだ成功していない場合、次回のレシート読み取り時にすべてを読み取って、複数のデータが表示されることがあります。

一般的に、開発者はアプリの支払いに独自の支払いシステムを持っており、注文の前に独自の注文番号を作成することがあります。iOSの支払い後に返されるレシートと一一対応させる必要があります。この場合の処理方法や注意点についても確認してください。

これでこの記事はすべて終わりです。皆様の学習に役立てば幸いですし、ナイアラートゥーチャリングのサポートをたくさんお願いします。

声明:この記事の内容はインターネットから取得しており、著作権者に帰属します。インターネットユーザーが自発的に貢献し、自己でアップロードしたものであり、このサイトは所有権を有しておらず、人間による編集もなく、関連する法的責任も負いません。著作権侵害が疑われる内容がある場合は、以下のメールアドレスまでご連絡ください:notice#oldtoolbag.com(メールを送信する際は、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認が取れた場合は、このサイトは即座に侵害疑いのコンテンツを削除します。)

おすすめ