English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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(メールを送信する際は、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認が取れた場合は、このサイトは即座に侵害疑いのコンテンツを削除します。)