Was Sie über die Überprüfung des App Store-Checks wissen müssen (App Store-Quittung)

StackOverflow hat noch viele Fragen zur Validierung der App Store-Prüfungen. Daher haben wir beschlossen, einen Artikel zu diesem Thema in einem Frage-Antwort-Format zu verfassen.


Bild


Was ist ein App Store-Check?


Dies ist eine verschlüsselte Datei im PKCS # 7-Format, die Informationen zu allen Käufen in der Anwendung enthält. Es befindet sich im Anwendungspaket und kann einfach unter folgender Bundle.main.appStoreReceiptURL abgerufen werden: Bundle.main.appStoreReceiptURL .


Gibt es immer diese Datei?


Wenn die Anwendung aus dem App Store heruntergeladen wurde, dann ja, immer. Und wenn es über Xcode oder Testflight installiert wurde, hat die Anwendung zunächst keine Sandbox-Prüfung bis zum ersten Kauf oder zur Wiederherstellung der Prüfung.


Was bedeutet es, "einen Scheck zu validieren"?


Dies bedeutet, die Datei zu entschlüsseln, das JSON-Datum zu erhalten und die vom Benutzer getätigten Käufe zu überprüfen. Sie können dies lokal oder durch Senden einer Anfrage an Apple tun.


In welchen Fällen benötigt ein Entwickler die Validierung eines Schecks?


Um einen gerade abgeschlossenen Kauf zu validieren.
Wenn viele einen Jailbreak hatten, war dies relevant: Es gab Dienstprogramme für die Fälschung eines Schecks. Jetzt ist dieses Problem nicht mehr akut, weil Jailbreak zu einer Seltenheit geworden ist.


Beim Wiederherstellen von Einkäufen.
Wenn ein Benutzer Ihre Anwendung neu installiert oder von einem anderen Gerät aus startet, müssen Sie ihm Zugriff auf die Funktionen gewähren, für die er bereits bezahlt hat. Nachdem Sie den App Store-Check entschlüsselt haben, können Sie feststellen, ob ein In-App-Kauf gekauft wurde.


Beim Kauf von Abonnements mit automatischer Verlängerung.
So ermitteln Sie den aktuellen Abonnementstatus und das Ablaufdatum.


Welche Einkäufe können während der Validierung wiederhergestellt werden?


Es gibt 4 Arten von In-App-Käufen:


  • Verbrauchsmaterialkäufe
  • Einkäufe ohne Verbrauchsmaterial
  • nicht erneuerbare Abonnements
  • Automatisch erneuerbare Abonnements
    Sie können alles außer ausgegebenen Einkäufen wiederherstellen. Dazu gehören beispielsweise Münzen in Ihrer Anwendung - etwas, das Sie so oft kaufen können, wie Sie möchten. Sie müssen die aktuelle Anzahl der Münzen beim Benutzer auf Ihrem Server speichern.

Welche Validierungsmethoden gibt es?


Es gibt drei davon:


  • lokale Validierung mit OpenSSL,
  • On-Demand-Validierung durch Apple direkt von einem iOS-Gerät aus,
  • On-Demand-Validierung durch Apple über Ihren Server.

Welche Validierungsmethode ist besser?


Die lokale Validierung ist komplex und erfordert viel Zeit und Mühe bei der Implementierung. Sie müssen Ihrem Projekt auch die OpenSSL-Bibliothek hinzufügen. In einigen Fällen müssen Sie die Prüfung aktualisieren.


Apple empfiehlt nicht, die Überprüfungen auf dem iOS-Gerät selbst zu überprüfen. Dies ist nicht sicher: Eine Anfrage kann mit einem Man-in-the-Middle-Angriff abgefangen werden.


Es ist am besten, Überprüfungen auf dem Server zu überprüfen. Darüber hinaus fügt Apple dort gelegentlich neue Felder hinzu, z. B. grace_period_expires_date und subscription_group_identifier . Auf unserem Server können wir schnell Änderungen vornehmen, ohne die Anwendung zu aktualisieren. Die beiden vorherigen Validierungsmethoden lassen sich leicht täuschen, indem Sie einfach die Systemzeit auf dem iOS-Gerät ändern.


Wofür ist Shared Secret?


Dies ist eine spezielle Schlüsselzeile, die zum Entschlüsseln von Schecks mit automatisch erneuerbaren Einkäufen erforderlich ist. Apple verwendet das gemeinsame Geheimnis als Parameter in der HTTPS-Anforderung an Apple.


Wo bekomme ich Shared Secret?


Gehen Sie zum App Store Connect, öffnen Sie die Anwendung, wechseln Sie zur Registerkarte Funktionen. Im Abschnitt Integrierte Einkäufe wird der freigegebene Schlüssel für die Anwendungsschaltfläche angezeigt. Generieren Sie einen neuen Schlüssel, falls dies noch nicht geschehen ist.


Beispielcode zur Validierung eines Schecks


 func validateReceipt(){ #if DEBUG let urlString = "https://sandbox.itunes.apple.com/verifyReceipt" #else let urlString = "https://buy.itunes.apple.com/verifyReceipt" #endif guard let receiptURL = Bundle.main.appStoreReceiptURL, let receiptString = try? Data(contentsOf: receiptURL).base64EncodedString() , let url = URL(string: urlString) else { return } let requestData : [String : Any] = ["receipt-data" : receiptString, "password" : "YOUR_SHARED_SECRET", "exclude-old-transactions" : false] let httpBody = try? JSONSerialization.data(withJSONObject: requestData, options: []) var request = URLRequest(url: url) request.httpMethod = "POST" request.setValue("Application/json", forHTTPHeaderField: "Content-Type") request.httpBody = httpBody URLSession.shared.dataTask(with: request) { (data, response, error) in // convert data to Dictionary and view purchases }.resume() } 

Dies ist ein Beispiel für die Überprüfung einer Prüfung unter iOS. Denken Sie daran, den Wert von YOUR_SHARED_SECRET durch Ihr gemeinsames Geheimnis zu ersetzen.


Konvertieren Sie die data nach dem Empfang in ein Dictionary :


 DispatchQueue.main.async { if let data = data, let jsonData = try? JSONSerialization.jsonObject(with: data, options: .allowFragments){ // your non-consumable and non-renewing subscription receipts are in `in_app` array // your auto-renewable subscription receipts are in `latest_receipt_info` array } } 

Beispiel für einen entschlüsselten App Store-Beleg


Hier sehen Sie ein Beispiel für einen Scheck mit zwei Transaktionen in einer Anwendung mit einem automatisch erneuerbaren Abonnement.


Was sind die Unterschiede zwischen in_app und latest_receipt_info ?


  • latest_receipt_info enthält alle Transaktionen, einschließlich der Erneuerung von automatisch erneuerbaren Einkäufen. Sie sollten nur dieses Array verwenden.


  • in_app enthält Transaktionen von nicht in_app Einkäufen und nicht erneuerbaren Abonnements. Die erste Transaktion Ihres Abonnements mit automatischer Verlängerung wird hier ebenfalls dupliziert. Verbrauchbare Einkäufe werden ebenfalls im Array in_app , verschwinden jedoch, wenn der Entwickler die Transaktion abschließt.



Fazit


Wir bei Apphud haben die Validierung der App Store-Prüfungen für Anwendungen mit automatisch erneuerbaren Abonnements in einem praktischen Open-Source-SDK implementiert. Apphud hilft Ihnen auch dabei, den Abonnementstatus zu verfolgen, wichtige Messdaten zu analysieren, nicht abonnierten Benutzern automatisch Rabatte anzubieten und vieles mehr. Wenn Sie beim Arbeiten mit Abonnements Schmerzen haben, testen Sie unsere Lösung kostenlos.

Source: https://habr.com/ru/post/de472188/


All Articles