App satın alma için makbuz doğrulayın

8 Cevap php

Ben bir kaç gün için app alımları ile oynamak, her şeyi ben sürekli bir geçersiz durum geri alıyorum gibi, App Store ile makbuz doğrulamak için deneyin noktaya kadar gayet iyi çalışıyor.

Ben PHP sunucu daha sonra App Store oradan yönlendirme için makbuz veri geçen ve ben geçerli bir yanıt aldıktan sonra benim veritabanına makbuz veri eklemek niyetinde.

Onlar gerçekten örnek her türlü vermeyin gibi mağaza kit programlama kılavuzu ve sınıf referanslar bu özel alan için daha az işe yaramaz, ben biraz ama bir şey bana yardımcı hangisinin yararlı article buldunuz hala yanlış.

Ben hiçbir yerde alıyorum gibi makbuz doğrulama çalışma var birisi kendi kodunu paylaşmaya istekli olacağını Temelde ben merak ediyorum.

Teşekkürler

8 Cevap

Birincisi, yayınlanan kod birkaç yazım hatası var. Bu deneyin. (Yasal Uyarı:.! Refactoring ark okuyucu için bir egzersiz olarak bırakılmıştır)

- (BOOL)verifyReceipt:(SKPaymentTransaction *)transaction {
    NSString *jsonObjectString = [self encode:(uint8_t *)transaction.transactionReceipt.bytes length:transaction.transactionReceipt.length];      
    NSString *completeString = [NSString stringWithFormat:@"http://url-for-your-php?receipt=%@", jsonObjectString];               
    NSURL *urlForValidation = [NSURL URLWithString:completeString];       
    NSMutableURLRequest *validationRequest = [[NSMutableURLRequest alloc] initWithURL:urlForValidation];              
    [validationRequest setHTTPMethod:@"GET"];         
    NSData *responseData = [NSURLConnection sendSynchronousRequest:validationRequest returningResponse:nil error:nil];  
    [validationRequest release];
    NSString *responseString = [[NSString alloc] initWithData:responseData encoding: NSUTF8StringEncoding];
    NSInteger response = [responseString integerValue];
    [responseString release];
    return (response == 0);
}

- (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];
}

Sen SKPaymentTransactionObserver iletilerini işleme sınıfın bu İç yöntemleri yapabilirsiniz:

@interface YourStoreClass (Internal)
- (BOOL)verifyReceipt:(SKPaymentTransaction *)transaction;
- (NSString *)encode:(const uint8_t *)input length:(NSInteger)length;
@end

Not: could libcrypto base64 kodlaması işlemek için gibi bir şey kullanmak, ancak daha sonra app onay anda ihracat kısıtlamaları ve ekstra adımlar bakıyoruz. Ama ben sapmak ...

Eğer işlem ile uzak sunucu, çağrı verifyReceipt: üzerinde işlem kayıt kick-off ve emin olmak niyetinde Daha sonra her yerde, bu pozitif geri geliyor.

Bu arada, sunucu üzerinde, burada şeyleri işlemek için bazı süper-elimden aşağı PHP bulunuyor:

$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;

Nerede call-your-http-post-here favori HTTP post mekanizmadır. (cURL olası bir seçimdir. YMMV. PHP.net kepçe var!)

Beni biraz ilgili olan bir şey (GET) sunucuya app giden URL yükün uzunluğudur. Bir uzunluk konu RFC'lere başına orada olmadığını unutuyorum. Belki Tamam, ya da belki de sunucu özgü bulunuyor. (Okuyucular: Bu bölümünde Düşünme hoş geldiniz!)

Ayrıca, bu bir senkron isteği yaparak bazı balking olabilir. Sen uyumsuz olarak gönderebilir ve ol 'UIActivityIndicatorView veya diğer bazı HUD koymak isteyebilirsiniz. Tipik bir örnek: initWithData:encoding: çağrısı benim için bir loooooong zaman alır bu. (Bu konuda çevrimiçi veya başka bir yerde,) iPhone topraklarda küçük bir sonsuzluk olduğunu birkaç saniye. Belirsiz ilerleme göstergesi çeşit gösteriliyor tavsiye edilebilir.

This bağlantı aldığını doğrulamak için php komut dosyası yazmak için tüm kodu var ..

http://www.phpriot.com/articles/verifying-app-store-receipts-php-curl

Tam kaynak kodu gibi bir PHP uygulama barındırılan bir örnek mevcuttur: http://www.chrismaddern.com/validate-app-store-iap-receipt-codes-online-tool/

Bu size yardımcı olur umarım!

Herkes için kim In-App Satın Alma-sunucu modelini kullanırken meydana gelebilecek bağlantı veya doğrulama hataları nasıl merak ediyor. Makbuz doğrulama işlem tamamlandığında ve başarılı olmasını sağlar. Eğer gerçekten kullanıcının telefonunu güvenmiyorum çünkü iPhone yapmak istemiyorum.

  1. Kullanıcı bir in-app satın alma başlatır
  2. Tamamlandığında, uygulama doğrulama için sunucu sorar
  3. Eğer Apple ile makbuz doğrulamak: geçerli eğer, (, içerik sunmak / kilidini abonelik kayıt ...) satın alma ile bağlantılı her türlü eylemi yapabilir
  4. App kuyruğuna (finishTransaction) den işlem kaldırır

Sunucu aşağı ise, işlem bitirmek, ancak kullanıcıya bir "olmaması mesajı" göstermek olmamalıdır.

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions

Daha sonra tekrar çağrılır.

Eğer bir makbuz geçersiz olduğunu öğrenmek eğer But, sen ilişkili işlem bitirmek gerekir. Değil ise, işlem kuyruğunda sonsuza dek yaşayan ekstra işlemler olabilir. UpdatedTransaction: Yani her zaman app, paymentQueue çalıştığı anlamına gelir işlem başına bir kez çağrılır ...

Benim apps, makbuz doğrulama geçersiz makbuz durumunda bir hata kodu dönen, bir web servisi aracılığıyla yapılır. Harici bir sunucuya ihtiyaç nedeni budur. Bir kullanıcı nasılsa (web hizmeti "başarı" yanıtı taklit ederek) makbuz doğrulama atlamak için yönetirse, o sunucu satın hiçbir iz vardır, çünkü içerik / erişim işlevselliği kilidini açmak mümkün olmayacaktır.

Süre için bu ile çarpıştıktan sonra, nihayet including korkunç 21002 (which is "makbuz veri özelliği verileri bozuk idi."), Apple'ın belgelerinde durum kodları bir liste bulundu. Bu listede yer almayan diğer durum kodları raporlarını gördüm, ben şimdiye kadar Apple belgelenmiş ne ötesinde herhangi görmedim. (Veya belge) diyor abonelikleri değil, in-app alımları diğer türlü oto-yenilemek için bu kodlar yalnızca geçerli olduğunu unutmayın.

Söz konusu belge bulunabilir here.

Sadece bu tekrar açın ve bilgi için bu formları bela karşılığında benim 2 sent eklemek.

Ben sadece kurulum benim app bir IAP hizmet ve aynı 21002 hata içine koştu. Ben PHP sunucusuna sonrası ya da boş (böylece App Store için HTTP isteği boş) veya yanlış biçimlendirilmiş olduğunda 21002 olur bulundu. Bizimki çalışma almak için, iPhone tarafında bir HTTP isteği olarak bizim sunucuya gönderilen sonra kodlanmış base64 gibi bir NSString yılında sonrası verileri ayarlayın.

Sonra bizim sunucu, biz ve dizi ve json-ed onu içine sıkışmış. Bu gibi:

$receipt = json_encode(array("receipt-data"=>$_POST['receipt-data']));

Bunu yerine bir GET POST kullanarak dışında yukarıdaki gibi aynı fark edeceksiniz. Kişisel tercihi gerçekten.

Biz sonra sanal post it CURL kullanılan ve cevabına json_decode kullanılır.

Eğer 21.002, örneğin boş yanıtları ya da hata kodlarını alıyorsanız, bu satırları eklemeyi deneyin. Eğer kıvırmak hata kodlarını kontrol ise, bir SSL sertifikası hata ...

curl_setopt ($curl_handle, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($curl_handle, CURLOPT_SSL_VERIFYPEER, 0);

Ben burada Ray Wenderlich en öğretici bulduk değil şaşırdım - sadece benim hayatımı kurtardı. Bir sunucu olmadan makbuzları doğrulama (önerilen bir çözüm değildir ama ağır neyse yapılır) geçer.

http://www.raywenderlich.com/23266/in-app-purchases-in-ios-6-tutorial-consumables-and-receipt-validation