Udostępnij za pośrednictwem


Transakcje i weryfikacja w środowisku Xamarin.iOS

Przywracanie przeszłych transakcji

Jeśli aplikacja obsługuje typy produktów, które można przywrócić, należy uwzględnić niektóre elementy interfejsu użytkownika, aby umożliwić użytkownikom przywrócenie tych zakupów. Ta funkcja umożliwia klientowi dodanie produktu do dodatkowych urządzeń lub przywrócenie produktu na tym samym urządzeniu po wyczyszczeniu lub usunięciu i ponownym zainstalowaniu aplikacji. Następujące typy produktów można przywrócić:

  • Produkty, które nie są eksploatacyjne
  • Subskrypcje autoodnawialne
  • Bezpłatne subskrypcje

Proces przywracania powinien aktualizować rekordy, które są na urządzeniu, aby spełniały twoje produkty. Klient może zdecydować się na przywrócenie w dowolnym momencie na dowolnym urządzeniu. Proces przywracania ponownie wysyła wszystkie wcześniejsze transakcje dla tego użytkownika; Kod aplikacji musi następnie określić, jakie działania należy wykonać z tych informacji (na przykład sprawdzić, czy na urządzeniu istnieje już rekord tego zakupu, a jeśli nie, utworzenie rekordu zakupu i włączenie produktu dla użytkownika).

Implementowanie przywracania

Przycisk Przywracania interfejsu użytkownika wywołuje następującą metodę, która wyzwala operacje RestoreCompletedTransactions w pliku SKPaymentQueue.

public void Restore()
{
   // theObserver will be notified of when the restored transactions start arriving <- AppStore
   SKPaymentQueue.DefaultQueue.RestoreCompletedTransactions();​​​
}

Zestaw StoreKit wyśle żądanie przywrócenia do serwerów firmy Apple asynchronicznie.

Ponieważ element CustomPaymentObserver jest zarejestrowany jako obserwator transakcji, będzie otrzymywać komunikaty, gdy serwery firmy Apple odpowiadają. Odpowiedź będzie zawierać wszystkie transakcje, które użytkownik kiedykolwiek wykonał w tej aplikacji (na wszystkich swoich urządzeniach). Kod przechodzi przez każdą transakcję, wykrywa stan Przywrócony i wywołuje metodę UpdatedTransactions w celu przetworzenia jej, jak pokazano poniżej:

// called when the transaction status is updated
public override void UpdatedTransactions (SKPaymentQueue queue, SKPaymentTransaction[] transactions)
{
   foreach (SKPaymentTransaction transaction in transactions)
   {
       switch (transaction.TransactionState)
       {
       case SKPaymentTransactionState.Purchased:
          theManager.CompleteTransaction(transaction);
           break;
       case SKPaymentTransactionState.Failed:
          theManager.FailedTransaction(transaction);
           break;
       case SKPaymentTransactionState.Restored:
           theManager.RestoreTransaction(transaction);
           break;
​default:
           break;
       }
   }
}

Jeśli nie ma produktów możliwych do przywrócenia dla użytkownika, UpdatedTransactions nie jest wywoływany.

Najprostszy możliwy kod przywracania danej transakcji w przykładzie wykonuje te same akcje co w przypadku zakupu, z tą różnicą, że OriginalTransaction właściwość jest używana do uzyskiwania dostępu do identyfikatora produktu:

public void RestoreTransaction (SKPaymentTransaction transaction)
{
   // Restored Transactions always have an 'original transaction' attached
   var productId = transaction.OriginalTransaction.Payment.ProductIdentifier;
   // Register the purchase, so it is remembered for next time
   PhotoFilterManager.Purchase(productId); // it's as though it was purchased again
   FinishTransaction(transaction, true);
}

Bardziej zaawansowana implementacja może sprawdzać inne transaction.OriginalTransaction właściwości, takie jak oryginalna data i numer paragonu. Te informacje będą przydatne w przypadku niektórych typów produktów (takich jak subskrypcje).

Uzupełnianie przywracania

Element CustomPaymentObserver ma dwie dodatkowe metody, które będą wywoływane przez zestaw StoreKit po zakończeniu procesu przywracania (pomyślnie lub z błędem), pokazano poniżej:

public override void PaymentQueueRestoreCompletedTransactionsFinished (SKPaymentQueue queue)
{
   Console.WriteLine(" ** RESTORE Finished ");
}
public override void RestoreCompletedTransactionsFailedWithError (SKPaymentQueue queue, NSError error)
{
   Console.WriteLine(" ** RESTORE FailedWithError " + error.LocalizedDescription);
}

W przykładzie te metody nie robią nic, jednak prawdziwa aplikacja może zdecydować się zaimplementować komunikat dla użytkownika lub inne funkcje.

Zabezpieczanie zakupów

Dwa przykłady w tym dokumencie służą NSUserDefaults do śledzenia zakupów:

Materiały eksploatacyjne — "saldo" zakupów środków to prosta NSUserDefaults wartość całkowita, która jest zwiększana przy każdym zakupie.

Nieekploatacyjne — każdy zakup filtru zdjęć jest przechowywany jako para klucz-wartość w programie NSUserDefaults.

Korzystanie z NSUserDefaults tego przykładowego kodu jest proste, ale nie oferuje bardzo bezpiecznego rozwiązania, ponieważ może być możliwe, aby użytkownicy technicznie pamiętali o zaktualizowaniu ustawień (pomijając mechanizm płatności).

Uwaga: aplikacje w świecie rzeczywistym powinny przyjąć bezpieczny mechanizm przechowywania zakupionej zawartości, która nie podlega manipulacji użytkowników. Może to obejmować szyfrowanie i/lub inne techniki, w tym uwierzytelnianie zdalne serwera.

Mechanizm powinien być również zaprojektowany w celu korzystania z wbudowanych funkcji tworzenia kopii zapasowych i odzyskiwania w systemach iOS, iTunes i iCloud. Zapewni to, że po przywróceniu kopii zapasowej poprzednie zakupy przez użytkownika będą natychmiast dostępne.

Zapoznaj się z przewodnikiem bezpiecznego kodowania firmy Apple, aby uzyskać więcej wytycznych specyficznych dla systemu iOS.

Weryfikacja paragonu i produkty dostarczane przez serwer

Przykłady w tym dokumencie do tej pory obejmowały wyłącznie aplikację komunikującą się bezpośrednio z serwerami sklepu App Store w celu przeprowadzania transakcji zakupu, które odblokowują funkcje lub możliwości już zakodowane w aplikacji.

Firma Apple zapewnia dodatkowy poziom zabezpieczeń zakupu, umożliwiając niezależne zweryfikowanie paragonów zakupu przez inny serwer, co może być przydatne do weryfikacji żądania przed dostarczeniem treści cyfrowych w ramach zakupu (na przykład książki cyfrowej lub magazynu).

Wbudowane produkty — podobnie jak przykłady w tym dokumencie, zakupiony produkt istnieje jako funkcjonalność dostarczana z aplikacją. Zakup w aplikacji umożliwia użytkownikowi dostęp do funkcji. Identyfikatory produktów są zakodowane na stałe.

Produkty dostarczane przez serwer — produkt składa się z zawartości do pobrania przechowywanej na serwerze zdalnym do momentu pomyślnej transakcji powoduje pobranie zawartości. Przykłady mogą obejmować książki lub problemy z magazynem. Identyfikatory produktów są zwykle pozyskiwane z serwera zewnętrznego (gdzie jest również hostowana zawartość produktu). Aplikacje muszą zaimplementować niezawodny sposób rejestrowania po zakończeniu transakcji, aby w przypadku niepowodzenia pobierania zawartości można było spróbować ponownie bez mylące użytkownika.

Produkty dostarczane przez serwer

Niektóre treści produktu, takie jak książki i magazyny (a nawet poziom gry) muszą być pobierane z serwera zdalnego podczas procesu zakupu. Oznacza to, że do przechowywania i dostarczania zawartości produktu jest wymagany dodatkowy serwer po zakupie.

Pobieranie cen produktów dostarczanych przez serwer

Ponieważ produkty są dostarczane zdalnie, można również dodać więcej produktów w czasie (bez aktualizowania kodu aplikacji), takich jak dodawanie kolejnych książek lub nowych problemów magazynu. Aby aplikacja mogła odnaleźć te produkty wiadomości i wyświetlić je użytkownikowi, dodatkowy serwer powinien przechowywać i dostarczać te informacje.

Getting Prices for Server-Delivered Products

  1. Informacje o produkcie muszą być przechowywane w wielu miejscach: na serwerze i w programie iTunes Połączenie. Ponadto każdy produkt będzie miał skojarzone z nim pliki zawartości. Te pliki zostaną dostarczone po pomyślnym zakupie.

  2. Gdy użytkownik chce kupić produkt, aplikacja musi określić, jakie produkty są dostępne. Te informacje mogą być buforowane, ale powinny być dostarczane z serwera zdalnego, na którym jest przechowywana główna lista produktów.

  3. Serwer zwraca listę identyfikatorów produktów, które mają być analizowane przez aplikację.

  4. Następnie aplikacja określa, które z tych identyfikatorów produktów mają być wysyłane do zestawu StoreKit w celu pobrania cen i opisów.

  5. StoreKit wysyła listę identyfikatorów produktów do serwerów firmy Apple.

  6. Serwery iTunes odpowiadają prawidłowymi informacjami o produkcie (opis i bieżąca cena).

  7. Dane aplikacji SKProductsRequestDelegate są przekazywane do informacji o produkcie do wyświetlania użytkownikowi.

Kupowanie produktów dostarczanych przez serwer

Ponieważ serwer zdalny wymaga weryfikacji, czy żądanie zawartości jest prawidłowe (tj. zostało opłacone), informacje o potwierdzeniu są przekazywane wraz z uwierzytelnianiem. Serwer zdalny przekazuje te dane do programu iTunes w celu weryfikacji i, jeśli zakończy się to powodzeniem, dołącza zawartość produktu w odpowiedzi na aplikację.

Purchasing Server-Delivered Products

  1. Aplikacja dodaje element SKPayment do kolejki. Jeśli jest to wymagane, zostanie wyświetlony monit o podanie identyfikatora Apple ID i prośba o potwierdzenie płatności.

  2. StoreKit wysyła żądanie do serwera w celu przetworzenia.

  3. Po zakończeniu transakcji serwer odpowiada potwierdzeniem transakcji.

  4. Podklasa SKPaymentTransactionObserver odbiera potwierdzenie i przetwarza je. Ponieważ produkt musi zostać pobrany z serwera, aplikacja inicjuje żądanie sieciowe do serwera zdalnego.

  5. Żądanie pobierania jest dołączone do danych potwierdzenia, aby serwer zdalny mógł sprawdzić, czy jest autoryzowany do uzyskiwania dostępu do zawartości. Klient sieciowy aplikacji czeka na odpowiedź na to żądanie.

  6. Gdy serwer odbiera żądanie zawartości, analizuje dane paragonu i wysyła żądanie bezpośrednio do serwerów iTunes w celu sprawdzenia, czy potwierdzenie dotyczy prawidłowej transakcji. Serwer powinien używać logiki, aby określić, czy żądanie ma zostać wysłane do adresu URL środowiska produkcyjnego, czy piaskownicy. Firma Apple sugeruje, że zawsze używasz adresu URL produkcyjnego i przełączysz się do piaskownicy, jeśli otrzymasz stan 21007 (potwierdzenie piaskownicy wysłane na serwer produkcyjny). Aby uzyskać więcej informacji, zobacz Przewodnik programowania weryfikacji paragonów firmy Apple.

  7. Program iTunes sprawdzi potwierdzenie i zwróci stan zero, jeśli jest prawidłowy.

  8. Serwer czeka na odpowiedź programu iTunes. Jeśli otrzyma prawidłową odpowiedź, kod powinien zlokalizować skojarzony plik zawartości produktu, który ma zostać uwzględniny w odpowiedzi na aplikację.

  9. Aplikacja odbiera i analizuje odpowiedź, zapisując zawartość produktu w systemie plików urządzenia.

  10. Aplikacja włącza produkt, a następnie wywołuje element StoreKit.FinishTransaction Aplikacja może następnie opcjonalnie wyświetlić kupioną zawartość (na przykład wyświetlić pierwszą stronę zakupionej książki lub wydania magazynu).

Alternatywna implementacja dla bardzo dużych plików zawartości produktu może obejmować po prostu przechowywanie paragonu transakcji w kroku 9, aby można było szybko ukończyć transakcję i zapewnić użytkownikowi interfejs pobierania rzeczywistej zawartości produktu w późniejszym czasie. Kolejne żądanie pobierania może ponownie wysłać przechowywane potwierdzenie, aby uzyskać dostęp do wymaganego pliku zawartości produktu.

Pisanie kodu weryfikacyjnego potwierdzenia po stronie serwera

Weryfikowanie potwierdzenia w kodzie po stronie serwera można wykonać za pomocą prostego żądania/odpowiedzi HTTP POST obejmującego kroki od 5 do 8 na diagramie przepływu pracy.

Wyodrębnij SKPaymentTansaction.TransactionReceipt właściwość w aplikacji. Są to dane, które należy wysłać do programu iTunes w celu weryfikacji (krok 5).

Base64 koduje dane potwierdzenia transakcji (w kroku 5 lub 6).

Utwórz prosty ładunek JSON w następujący sposób:

{
   "receipt-data" : "(base-64 encoded receipt here)"
}

HTTP POST kod JSON do https://buy.itunes.apple.com/verifyReceipt do środowiska produkcyjnego lub https://sandbox.itunes.apple.com/verifyReceipt do testowania.

Odpowiedź JSON będzie zawierać następujące klucze:

{
   "status" : 0,
   "receipt" : { (receipt repeated here) }
}

Stan zero wskazuje prawidłowe potwierdzenie. Serwer może kontynuować wypełnianie zawartości zakupionego produktu. Klucz paragonu zawiera słownik JSON z tymi samymi właściwościami co SKPaymentTransaction obiekt, który został odebrany przez aplikację, więc kod serwera może wysyłać zapytania do tego słownika w celu pobrania informacji, takich jak product_id i ilość zakupu.

Aby uzyskać dodatkowe informacje, zobacz dokumentację przewodnika programowania weryfikacji paragonów firmy Apple.