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.
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.
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ů.
Server vrátí seznam ID produktů, které má aplikace analyzovat.
Aplikace pak určí, které z těchto ID produktů se mají odeslat do StorKitu, aby načetly ceny a popisy.
StoreKit odešle seznam ID produktů na servery Společnosti Apple.
Servery iTunes reagují platnými informacemi o produktu (popis a aktuální cena).
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.
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.StoreKit odešle požadavek na server ke zpracování.
Po dokončení transakce server odpoví účtem transakce.
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.Žá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.
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.
iTunes zkontroluje potvrzení a vrátí stav nuly, pokud je platný.
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.
Aplikace přijme a parsuje odpověď a uloží obsah produktu do systému souborů zařízení.
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.