ホームページ  >  記事  >  バックエンド開発  >  iOS でアプリ内購入の領収書を検証するにはどうすればよいですか?

iOS でアプリ内購入の領収書を検証するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-17 20:20:02506ブラウズ

How to Validate In-App Purchase Receipts in iOS?

アプリ内購入の領収書の検証

アプリ内購入の領収書の検証は、を通じて行われた取引の信頼性と正当性を確認するための重要な手順です。あなたのアプリ。この記事は、正常に実装された包括的なコード例を共有することで、レシートの検証に苦労している開発者にガイダンスを提供することを目的としています。

コードの実装

レシートを確認するには、次の手順を実行します。これらの手順:

  1. 以下に示すように verifyReceipt メソッドを定義します:
<code class="objective-c">- (BOOL)verifyReceipt:(SKPaymentTransaction *)transaction {
    // Encode receipt data
    NSString *jsonObjectString = [self encode:(uint8_t *)transaction.transactionReceipt.bytes length:transaction.transactionReceipt.length];
    
    // Construct URL with encoded receipt
    NSString *completeString = [NSString stringWithFormat:@"http://url-for-your-php?receipt=%@", jsonObjectString];
    NSURL *urlForValidation = [NSURL URLWithString:completeString];
    
    // Create request with HTTP GET method
    NSMutableURLRequest *validationRequest = [[NSMutableURLRequest alloc] initWithURL:urlForValidation];
    [validationRequest setHTTPMethod:@"GET"];
    
    // Send request synchronously
    NSData *responseData = [NSURLConnection sendSynchronousRequest:validationRequest returningResponse:nil error:nil];
    
    // Parse server response
    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    NSInteger response = [responseString integerValue];
    
    return (response == 0);
}</code>
  1. レシート データを Base64 でエンコードする encode メソッドを実装します:
<code class="objective-c">- (NSString *)encode:(const uint8_t *)input length:(NSInteger)length {
    // Define encoding table
    static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    
    // Create mutable data buffer
    NSMutableData *data = [NSMutableData dataWithLength:((length + 2) / 3) * 4];
    uint8_t *output = (uint8_t *)data.mutableBytes;
    
    // Encode data in loop
    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]);
            }
        }
        
        // Add encoded bytes to output
        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];
}</code>
  1. SKPaymentTransactionObserver デリゲート メソッドから verifyReceipt メソッドを呼び出します。
  2. サーバー側で、PHP を使用して領収書検証を処理します。
<code class="php"><?php

// Fetch receipt data from request parameter
$receipt = json_encode(array("receipt-data" => $_GET["receipt"]));

// Set URL for receipt verification
$url = "https://sandbox.itunes.apple.com/verifyReceipt";

// Send POST request with receipt data
$response_json = call-your-http-post-here($url, $receipt);

// Decode JSON response
$response = json_decode($response_json);

// Perform receipt verification and save data accordingly
echo $response->status;

?></code>

その他の考慮事項

  • 環境 (サンドボックスまたは運用環境) に応じて、受信確認には正しい URL を使用してください。
  • 次の点に注意してください。 URL の長さを制限し、大量の受信には非同期 HTTP リクエストの処理を検討してください。
  • セキュリティを強化するには、サーバー側の証明書検証の使用を検討してください。

以上がiOS でアプリ内購入の領収書を検証するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。