Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menyelesaikan Status Resit Tidak Sah Apabila Mengesahkan Pembelian Dalam Apl dalam iOS?

Bagaimana untuk Menyelesaikan Status Resit Tidak Sah Apabila Mengesahkan Pembelian Dalam Apl dalam iOS?

DDD
DDDasal
2024-10-17 20:21:02593semak imbas

How to Resolve Invalid Receipt Status When Verifying In-App Purchases in iOS?

Mengesahkan Resit Pembelian Dalam Apl

Pembelian dalam apl menyediakan cara yang mudah untuk pengguna memperoleh kandungan atau ciri tambahan dalam apl anda. Untuk memastikan urus niaga adalah sah, mengesahkan resit dengan App Store adalah penting.

Masalah:

Seorang pembangun menghadapi kesukaran mengesahkan resit, secara konsisten menerima status tidak sah. Walaupun penyelesaian masalah yang meluas, isu ini berterusan.

Penyelesaian:

Untuk membantu, langkah berikut disyorkan:

  1. Sahkan Kaedah Penerimaan:

    <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 for validation
        NSString *completeString = [NSString stringWithFormat:@"http://url-for-your-php?receipt=%@", jsonObjectString];
        NSURL *urlForValidation = [NSURL URLWithString:completeString];
    
        // Create HTTP request
        NSMutableURLRequest *validationRequest = [[NSMutableURLRequest alloc] initWithURL:urlForValidation];
        [validationRequest setHTTPMethod:@"GET"];
    
        // Send request and receive response
        NSData *responseData = [NSURLConnection sendSynchronousRequest:validationRequest returningResponse:nil error:nil];
        [validationRequest release];
    
        // Parse response
        NSString *responseString = [[NSString alloc] initWithData:responseData encoding: NSUTF8StringEncoding];
        NSInteger response = [responseString integerValue];
        [responseString release];
    
        // Return verification result
        return (response == 0);
    }</code>
  2. Kaedah Pengekodan:

    <code class="objective-c">- (NSString *)encode:(const uint8_t *)input length:(NSInteger)length {
        static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    
        NSMutableData *data = [NSMutableData dataWithLength:((length + 2) / 3) * 4];
        uint8_t *output = (uint8_t *)data.mutableBytes;
    
        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]);
                }
            }
    
            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>
  3. Pengesahan Sebelah Pelayan:

    <code class="php">$receipt = json_encode(array("receipt-data" => $_GET["receipt"]));
    // NOTE: use "buy" vs "sandbox" in production.
    $url = "https://sandbox.itunes.apple.com/verifyReceipt";
    $response_json = call-your-http-post-here($url, $receipt);
    $response = json_decode($response_json);
    
    // Save the data here!
    
    echo $response->status;</code>
  4. Kaedah Dalaman:

    <code class="objective-c">@interface YourStoreClass (Internal)
    - (BOOL)verifyReceipt:(SKPaymentTransaction *)transaction;
    - (NSString *)encode:(const uint8_t *)input length:(NSInteger)length;
    @end</code>
  5. Pertimbangan Tambahan:

    • Pertimbangkan penyiaran HTTP tak segerak kerana kemungkinan panjang permintaan dan masa pemprosesan.
    • Berikan maklum balas pengguna semasa pengesahan resit.

Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Status Resit Tidak Sah Apabila Mengesahkan Pembelian Dalam Apl dalam iOS?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn