Transakce a ověření v Xamarin.iOS

Obnovení minulých transakcí

Pokud vaše aplikace podporuje typy produktů, které je možné obnovit, musíte zahrnout některé prvky uživatelského rozhraní, aby uživatelé mohli tyto nákupy obnovit. Tato funkce umožňuje zákazníkovi přidat produkt do dalších zařízení nebo obnovit produkt do stejného zařízení po vymazání nebo odebrání a opětovné instalaci aplikace. Obnovitelné jsou následující typy produktů:

  • Nepoužitelné produkty
  • Automaticky obnovitelná předplatná
  • Bezplatná předplatná

Proces obnovení by měl aktualizovat záznamy, které na zařízení uchováváte, aby splňovaly vaše produkty. Zákazník se může kdykoli rozhodnout, že ho obnoví na libovolném zařízení. Proces obnovení znovu odešle všechny předchozí transakce pro daného uživatele; Kód aplikace pak musí určit, jakou akci s informacemi provést (například kontrola, jestli už v zařízení existuje záznam o tomto nákupu, a pokud ne, vytvoření záznamu o nákupu a povolení produktu pro uživatele).

Implementace obnovení

Tlačítko Restore uživatelského rozhraní volá následující metodu, která aktivuje RestoreCompletedTransactions na SKPaymentQueue.

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

StoreKit odešle požadavek na obnovení na servery Apple asynchronně.

CustomPaymentObserver Vzhledem k tomu, že je zaregistrovaný jako pozorovatel transakcí, obdrží zprávy, když servery Apple reagují. Odpověď bude obsahovat všechny transakce, které tento uživatel kdy provedl v této aplikaci (na všech svých zařízeních). Kód prochází každou transakci, detekuje obnovený stav a volá metodu UpdatedTransactions , která ji zpracuje, jak je znázorněno níže:

// 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;
       }
   }
}

Pokud pro uživatele nejsou žádné obnovitelné produkty, UpdatedTransactions není volána.

Nejjednodušší možný kód pro obnovení dané transakce v ukázce provádí stejné akce jako při nákupu s tím rozdílem, že OriginalTransaction vlastnost se používá pro přístup k ID 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);
}

Sofistikovanější implementace může kontrolovat další transaction.OriginalTransaction vlastnosti, jako je původní datum a číslo účtenky. Tyto informace budou užitečné pro některé typy produktů (například předplatná).

Obnovení dokončení

Obsahuje CustomPaymentObserver dvě další metody, které bude StoreKit volat po dokončení procesu obnovení (buď úspěšně, nebo s chybou), jak je znázorněno níže:

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

V příkladu tyto metody nedělají nic, ale skutečná aplikace se může rozhodnout implementovat zprávu pro uživatele nebo některé jiné funkce.

Zabezpečení nákupů

Dva příklady v tomto dokumentu slouží NSUserDefaults ke sledování nákupů:

Spotřební zboží – "zůstatek" nákupů kreditů je jednoduchá NSUserDefaults celočíselná hodnota, která se s každým nákupem zvýší.

Nepoužitelné – každý nákup filtru fotografií je uložen jako pár klíč-hodnota v NSUserDefaults.

Použití NSUserDefaults zachová příklad kódu jednoduché, ale nenabízí velmi bezpečné řešení, protože může být možné, aby technicky myslící uživatelé aktualizovali nastavení (obejití platebního mechanismu).

Poznámka: Aplikace z reálného světa by měly přijmout zabezpečený mechanismus pro ukládání zakoupeného obsahu, který není předmětem manipulace uživatelů. To může zahrnovat šifrování a/nebo jiné techniky, včetně ověřování vzdáleného serveru.

Mechanismus by měl být také navržen tak, aby využíval integrované funkce zálohování a obnovení pro iOS, iTunes a iCloud. Tím se zajistí, že po obnovení zálohy, kterou si uživatelé koupili, budou okamžitě k dispozici.

Další pokyny specifické pro iOS najdete v průvodci zabezpečeným kódováním společnosti Apple.

Ověření příjmu a produkty doručované serverem

Příklady v tomto dokumentu se zatím skládaly výhradně z aplikace komunikující přímo se servery App Storu za účelem provádění nákupních transakcí, které odemykají funkce nebo funkce, které jsou už kódované do aplikace.

Apple poskytuje další úroveň zabezpečení nákupu tím, že umožňuje nezávislé ověření nákupních účtenek jiným serverem, což může být užitečné k ověření žádosti před doručením digitálního obsahu v rámci nákupu (například digitální knihy nebo časopisu).

Předdefinované produkty – podobně jako příklady v tomto dokumentu existuje zakoupený produkt jako funkce dodávané s aplikací. Nákup v aplikaci umožňuje uživateli přístup k funkcím. ID produktů jsou pevně zakódovaná.

Produkty doručované serverem – Produkt se skládá z obsahu ke stažení uloženého na vzdáleném serveru, dokud úspěšná transakce nezpůsobí stažení obsahu. Příklady můžou zahrnovat problémy s knihami nebo časopisy. ID produktů obvykle pocházejí z externího serveru (kde je také hostovaný obsah produktu). Aplikace musí implementovat robustní způsob záznamu po dokončení transakce, takže pokud stahování obsahu selže, může se pokusit znovu zmást uživatele.

Serverové produkty

Obsah některého produktu, jako jsou knihy a časopisy (nebo dokonce herní úroveň), je potřeba během nákupu stáhnout ze vzdáleného serveru. To znamená, že po zakoupení se vyžaduje další server pro ukládání a doručování obsahu produktu.

Získání cen pro produkty doručované serverem

Vzhledem k tomu, že produkty jsou doručovány vzdáleně, je také možné v průběhu času přidat další produkty (bez aktualizace kódu aplikace), jako je přidání dalších knih nebo nových problémů časopisu. Aby aplikace tyto informační produkty objevila a zobrazila je uživateli, měl by další server tyto informace uložit a doručit.

Getting Prices for Server-Delivered Products

  1. Informace o produktu musí být uloženy na více místech: na vašem serveru a v iTunes Připojení. Každý produkt bude mít navíc přidružené soubory obsahu. Tyto soubory se doručí po úspěšném nákupu.

  2. Když si uživatel přeje koupit produkt, musí aplikace určit, které produkty jsou k dispozici. Tyto informace můžou být uložené v mezipaměti, ale měly by být doručeny ze vzdáleného serveru, kde je uložený hlavní seznam produktů.

  3. Server vrátí seznam ID produktů, které má aplikace analyzovat.

  4. Aplikace pak určí, které z těchto ID produktů se mají odeslat do StorKitu, aby načetly ceny a popisy.

  5. StoreKit odešle seznam ID produktů na servery Společnosti Apple.

  6. Servery iTunes reagují platnými informacemi o produktu (popis a aktuální cena).

  7. Aplikace SKProductsRequestDelegate se předá informace o produktu pro zobrazení uživateli.

Nákup produktů dodaných serverem

Vzhledem k tomu, že vzdálený server vyžaduje nějaký způsob ověření, že požadavek na obsah je platný (tj. zaplaceno), informace o potvrzení se předávají za ověření. Vzdálený server předá tato data do iTunes k ověření a v případě úspěchu zahrne obsah produktu v reakci na aplikaci.

Purchasing Server-Delivered Products

  1. Aplikace přidá do SKPayment fronty. V případě potřeby se uživateli zobrazí výzva k zadání Apple ID a zobrazí se výzva k potvrzení platby.

  2. StoreKit odešle požadavek na server ke zpracování.

  3. Po dokončení transakce server odpoví účtem transakce.

  4. Podtřída SKPaymentTransactionObserver obdrží potvrzení a zpracuje ji. Vzhledem k tomu, že produkt musí být stažen ze serveru, aplikace zahájí síťový požadavek na vzdálený server.

  5. Žádost o stažení je doprovázena daty o přijetí, aby vzdálený server mohl ověřit, že má oprávnění k přístupu k obsahu. Síťový klient aplikace čeká na odpověď na tento požadavek.

  6. Když server obdrží požadavek na obsah, parsuje data potvrzení a odešle požadavek přímo na servery iTunes, aby ověřil, že potvrzení je platné transakce. Server by měl použít určitou logiku k určení, jestli se má požadavek odeslat do produkční adresy URL nebo adresy URL sandboxu. Apple navrhuje, aby vždy používal produkční adresu URL a přepnul na sandbox, pokud se váš stav 21007 (příjem sandboxu odeslal na produkční server). Další podrobnosti najdete v Průvodci programováním pro ověření účtenek společnosti Apple.

  7. iTunes zkontroluje potvrzení a vrátí stav nuly, pokud je platný.

  8. Server čeká na odpověď iTunes. Pokud obdrží platnou odpověď, měl by kód vyhledat přidružený soubor obsahu produktu, který se má zahrnout do odpovědi na aplikaci.

  9. Aplikace přijme a parsuje odpověď a uloží obsah produktu do systému souborů zařízení.

  10. Aplikace povolí produkt a potom zavolá StoreKit FinishTransaction. Aplikace pak může volitelně zobrazit zakoupený obsah (například zobrazit první stránku zakoupené knihy nebo časopisu).

Alternativní implementace pro velmi velké soubory obsahu produktu může zahrnovat jednoduše uložení potvrzení transakce v kroku 9, aby transakce mohla být rychle dokončena a poskytuje uživateli uživatelské rozhraní ke stažení skutečného obsahu produktu později. Další žádost o stažení může znovu odeslat uloženou účtenku pro přístup k požadovanému souboru obsahu produktu.

Zápis ověřovacího kódu potvrzení na straně serveru

Ověření potvrzení v kódu na straně serveru je možné provést pomocí jednoduchého požadavku a odpovědi HTTP POST, který zahrnuje kroky č. 5 až #8 v diagramu pracovního postupu.

SKPaymentTansaction.TransactionReceipt Extrahujte vlastnost v aplikaci. Jedná se o data, která je potřeba odeslat do iTunes k ověření (krok 5).

Kódování base64 dat o účtech transakcí (buď v kroku 5, nebo #6).

Vytvořte jednoduchou datovou část JSON takto:

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

HTTP POST JSON do https://buy.itunes.apple.com/verifyReceipt produkčního prostředí nebo https://sandbox.itunes.apple.com/verifyReceipt pro testování.

Odpověď JSON bude obsahovat následující klíče:

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

Stav nuly označuje platný příjem. Váš server může pokračovat v plnění obsahu zakoupeného produktu. Klíč potvrzení obsahuje slovník JSON se stejnými vlastnostmi jako SKPaymentTransaction objekt přijatý aplikací, takže kód serveru může tento slovník dotazovat, aby načetl informace, jako je product_id a množství nákupu.

Další informace najdete v dokumentaci k programovým průvodci ověřením účtenek společnosti Apple.