Georg fährt extra nach Berlin um Steve Ballmer zu treffen

8 Tage Windows Phone 8 | Tag #8: Brieftasche & In-App Käufe

Die­ser Arti­kel ist Tag #8 der Serie 8 Tage Win­dows Pho­ne 8 von Geert van der Cruijsen.

Der Ori­gi­nal­ar­ti­kel befin­det sich hier: 8 days of Win­dows Pho­ne 8 — Day 8: Wal­let and In-App Purcha­ses.

8 Tage Windows Phone 8

Will­kom­men zum letz­ten Arti­kel der Serie 8 Tage Win­dows Pho­ne 8, wel­che sich mit den neu­en Fea­tures der Win­dows Pho­ne 8 Platt­form beschäf­tigt. Heu­te, am Tag 8, bespre­chen wir die Brief­ta­sche und In-App Käufe.

day8

Brieftasche

Die Brief­ta­schen-Anwen­dung ist als Ort gedacht, in wel­chem alle mög­li­chen Anwen­dun­gen Din­ge wie Deals, Kre­dit­kar­ten­in­for­ma­tio­nen, Bonus­punk­te und der­glei­chen spei­chern kön­nen. Mit Hil­fe der Wal­let API kön­nen Sie Ein­trä­ge zur Brief­ta­sche hin­zu­fü­gen, die­se lesen, ver­än­dern und löschen. 

Als ers­tes wer­den wir in unse­rer Bei­spiel­an­wen­dung einen Deal zur Brief­ta­sche hin­zu­fü­gen. In die­sem Bei­spiel erstel­len wir einen Deal für ein Frei­bier, wel­chen der Benut­zer in sei­ner Lieb­lings­bar in Anspruch neh­men kann. Bevor wir mit Code anfan­gen, stat­ten wir unser WMAppManifest.xml mit der Wal­let Fähig­keit aus.

walletcapability

Danach erstel­len wir einen But­ton in der MainPage.xaml, um den neu­en Frei­bier-Deal zu erzeugen.

<StackPanel x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
   <Button x:Name="FreeBeerButton" Content="get 1 free beer deal!" Click="FreeBeerButton_Click_1"></Button>
</StackPanel>

In dem Click Event fügen wir den Code hin­zu, um den neu­en Deal in der Brief­ta­sche zu erstel­len. Wir begin­nen, indem wir ein neu­es Deal Objekt erstel­len und die­sem eine ein­deu­ti­ge ID über­ge­ben. Auf dem Deal Objekt kön­nen Sie eine Rei­he von Eigen­schaf­ten set­zen, wie z.B. Name, Bil­der und einen Bar­code. In unse­rem Bei­spiel habe ich eini­ge der ein­fa­chen Eigen­schaf­ten mit Wer­ten belegt. Gera­de die Bar­code Eigen­schaft kann aber sehr prak­tisch sein, etwa, wenn es dar­an geht, den Deal in einer Bar ein­zu­lö­sen. Nach­dem wir alle Eigen­schaf­ten gesetzt haben, kön­nen wir die Metho­de SaveA­sync auf­ru­fen und der Deal wird gespei­chert. Es ist gän­gi­ge Pra­xis, danach die Brief­ta­sche zu öff­nen, so dass der Benut­zer sehen kann, was dort gespei­chert wur­de. Es gibt kei­nen spe­zi­el­len Laun­cher für die Brief­ta­sche. Statt­des­sen öff­nen Sie eine spe­zi­el­le URL — begin­nend mit wallet:// — um die Brief­ta­sche zu öffnen.

private async void FreeBeerButton_Click_1(object sender, RoutedEventArgs e)
{
   var beerDeal = new Deal("1FREEBEER");
   beerDeal.MerchantName = "MyBar";
   beerDeal.DisplayName = "1 free beer!"; 
   beerDeal.Description = "collect 1 free beer at your favorite bar";
   beerDeal.CustomerName = "Geert";
   beerDeal.ExpirationDate = DateTime.Now.AddDays(1);
   beerDeal.IssuerName = "Your Favorite Bar";
   beerDeal.NavigationUri = new Uri("/mainpage.xaml?deal=freebeer", UriKind.Relative);
   await beerDeal.SaveAsync(); 
   Launcher.LaunchUriAsync(new Uri("wallet://", UriKind.RelativeOrAbsolute));
}

Wenn wir die Anwen­dung aus­füh­ren und auf den Free Beer But­ton drü­cken, wird sich die Brief­ta­sche öff­nen und unser Deal wird sicht­bar sein. Wenn wir auf die­sen kli­cken, sehen wir sei­ne Details. Wenn Sie einen Bar­code hin­zu­fü­gen, wird die­ser eben­falls hier sicht­bar sein. Wei­ter­hin gibt es eine Mög­lich­keit, die zum Deal gehö­ri­ge Anwen­dung zu öff­nen. Dabei wird der Wert der Eigen­schaft Navi­ga­ti­onURI ver­wen­det, die wir auf dem Deal Objekt set­zen kön­nen. Sie kön­nen die Deals hier auch als ver­braucht mar­kie­ren oder die­se aus Ihrer Brief­ta­sche löschen.

wallet1

wallet2

wallet3

wallet4

Neben Deals kön­nen Sie auch Zah­lungs­mit­tel hin­ter­le­gen. Die­se Objek­te sind Din­ge wie z.B. Bonus­punk­te, die man beim Ein­kau­fen sam­melt. Oft kann man die­se Punk­te ein­lö­sen gegen irgend­ei­ne Beloh­nung. Die Erstel­lung eines Zah­lungs­mit­tels läuft fast genau so ab wie die Erstel­lung eines Deals. Wir ver­wen­den dies­mal nur ein Pay­men­tIn­stru­ment Objekt. Die Klas­se Pay­men­tIn­stru­ment hat eine Eigen­schaft, mit wel­cher Sie den Betrag set­zen kön­nen. Die­sen kön­nen Sie auch nach­träg­lich noch erhö­hen oder verringern.

Um die Zah­lungs­mit­tel in der Brief­ta­sche zu ver­wen­den, müs­sen Sie dem WMAppManifest.xml eine wei­te­re Fähig­keit mit dem Namen ID_CAP_WALLET_PAYMENTINSTRUMENTS hinzufügen.

Zu guter Letzt kön­nen Sie der Brief­ta­sche gene­ri­sche Objek­te hin­zu­fü­gen. Das könn­te etwa eine Kun­den­kar­te mit einem Bar­code oder einer Num­mer sein, wel­che Sie in einem Laden als Stamm­kun­den iden­ti­fi­ziert. Gene­ri­sche Ein­trä­ge in der Brief­ta­sche kön­nen Sie mit Hil­fe des Wal­let­T­ran­sac­tion­I­tem erstellen.

In-App Käufe

Ein wirk­lich wich­ti­ges Fea­ture von Win­dows Pho­ne 8 ist die Mög­lich­keit, In-App Käu­fe zu nut­zen. In Win­dows Pho­ne 7 konn­ten Sie nur zwi­schen kos­ten­lo­sen und zah­lungs­pflich­ti­gen Apps (evtl. mit Test­ver­si­on) wäh­len. In-App Käu­fe eröff­nen ganz neue Mög­lich­kei­ten, mit einer App Geld zu ver­die­nen. Sie könn­ten z.B. ein kos­ten­lo­ses Spiel ent­wi­ckeln, in wel­chem der Nut­zer neue Levels für einen gewis­sen Betrag kau­fen kann. Ein wei­te­res Bei­spiel wäre eine Sport-Anwen­dung, in wel­cher Ihre Benut­zer die Push-Benach­rich­ti­gun­gen für eine Sai­son abon­nie­ren kön­nen, anstatt die­se für immer zu bekom­men. Wie also machen wir das?

In-App Käu­fe müs­sen im Ent­wick­ler­por­tal erstellt wer­den. Log­gen Sie sich mit Ihrem Ent­wick­ler­kon­to auf dev.windowsphone.com ein und laden Sie eine neue Anwen­dung hoch oder navi­gie­ren Sie zu den Details einer exis­tie­ren­den Anwendung.

inapp1

Kli­cken Sie auf den Rei­ter Pro­ducts und dann auf „Add in-app pro­duct“. Damit erstel­len Sie ein neu­es Pro­dukt, wel­ches aus Ihrer App her­aus erwor­ben wer­den kann.

inapp2

Zunächst müs­sen wir die Eigen­schaf­ten des In-App Pro­dukts aus­fül­len. Die­se bestehen aus einem Namen und einem Iden­ti­fi­ka­tor. Die­ser Iden­ti­fi­ka­tor ist wich­tig, da wir über die­sen das Pro­dukt in unse­rer App anspre­chen können.

Wei­ter­hin kön­nen Sie fest­le­gen, ob es sich um ein dau­er­haf­tes oder ein zu ver­brau­chen­des Pro­dukt han­delt. Dau­er­haf­te Pro­duk­te kön­nen ein­mal erwor­ben wer­den und ste­hen dem Nut­zer danach unein­ge­schränkt zur Ver­fü­gung. Zu ver­brau­chen­de Pro­duk­te wer­den ein­mal gekauft und ver­fal­len nach Benutzung.

inapp3

Zum Schluss wäh­len wir einen Preis und drü­cken auf Save. Danach geben wir eine Beschrei­bung für unser Pro­dukt an.

inapp4

Bei der Beschrei­bung müs­sen Sie einen Titel, einen aus­führ­li­chen Beschrei­bungs­text und ein Bild ange­ben. Drü­cken Sie danach wie­der Save.

inapp5

inapp6

Jetzt sind wir bereit, das In-App Pro­dukt ein­zu­rei­chen. Wenn wir Sub­mit drü­cken, wird unser Pro­dukt gespei­chert und wir kön­nen es nach der Zer­ti­fi­zie­rung in unse­rer Anwen­dung verwenden.

inapp7

Da wir jetzt ein In-App Pro­dukt defi­niert haben, kön­nen wir ver­su­chen, die­ses aus unse­rer App her­aus zu kaufen.

Fügen wir einen But­ton hin­zu, um unse­re 30 neu­en Levels zu kaufen.

<Button x:Name="BuyLevelsButton" Content="buy 30 more levels!" Click="BuyLevelsButton_Click_1" ></Button>

Im Click Event fügen wir den Code hin­zu, um unser Pro­dukt zu kau­fen. Als ers­tes holen wir uns eine Lis­te aller ver­füg­ba­ren Pro­duk­te. Die­se bekom­men wir vom Cur­ren­t­App Objekt, indem wir die Metho­de Load­Lis­ting­In­for­ma­ti­on­Async auf­ru­fen. Da wir wis­sen, dass es nur ein Pro­dukt gibt, neh­men wir eine Abkür­zung und grei­fen gleich auf den ers­ten Ein­trag zu. Wenn es meh­re­re Pro­duk­te gäbe, könn­ten Sie das gewünsch­te Pro­dukt mit Hil­fe der ID aus­wäh­len. Sobald wir eine Refe­renz auf das Pro­dukt haben, kön­nen wir die Metho­de Request­Pro­duct­Purcha­se­A­sync auf­ru­fen, um den Store zu öff­nen. Dort hat der Nut­zer die Mög­lich­keit, zu ent­schei­den, ob er die­sen Extra­kauf täti­gen möch­te. Nach­dem der Nut­zer sei­ne Ent­schei­dung getrof­fen hat, kom­men wir zurück in unse­ren Code, wo wir über­prü­fen kön­nen, ob das Pro­dukt nun auf Acti­ve gesetzt ist. Wenn die­ser Wert true ist, müs­sen wir die Metho­de Report­Pro­ductFul­fill­ment rufen, um den Store wis­sen zu las­sen, dass die App den Kauf regis­triert hat. Anschlie­ßend kön­nen wir irgend­wo eine Eigen­schaft spei­chern, wel­che anzeigt, dass das zum Pro­dukt gehö­ri­ge Fea­ture in der Anwen­dung frei­ge­schal­tet wurde.

private async void BuyLevelsButton_Click_1(object sender, RoutedEventArgs e)
{
    var products = await CurrentApp.LoadListingInformationAsync();
    var product1 = products.ProductListings.FirstOrDefault();
    var boughtProduct  = await CurrentApp.RequestProductPurchaseAsync(product1.Value.ProductId, true);

   if (CurrentApp.LicenseInformation.ProductLicenses[product1.Value.ProductId].IsActive)    
   {                
      CurrentApp.ReportProductFulfillment(product1.Value.ProductId);
      var saveBoughtProductstate = true;
   }
}

Beach­ten Sie, dass wir in einem Pro­dukt kei­nen Extra-Code oder sons­ti­ges hin­zu­fü­gen. Es han­delt sich um nichts wei­ter als einen Boole’schen Wert, wel­cher auf true gesetzt wur­de. In dem Bei­spiel, in dem der Nut­zer 30 Levels kau­fen kann, müs­sen die­se bereits im Paket vor­han­den sein. Sie deak­ti­vie­ren ein­fach die ent­spre­chen­den Berei­che der Benut­zer­ober­flä­che, so lan­ge der Wert durch den Kauf noch nicht auf true gesetzt wurde.

Ich mag die Mög­lich­kei­ten der In-App Käu­fe und glau­be, dass dadurch mehr Fir­men, etwa Zei­tun­gen, dazu moti­viert wer­den, Apps für die Win­dows Pho­ne Platt­form zu entwickeln.

Sie kön­nen das Bei­spiel­pro­jekt hier her­un­ter­la­den: http://sdrv.ms/QSJ2yx.

Das war’s Leu­te. Die Serie 8 Tage Win­dows Pho­ne 8 ist zum Ende gekom­men. Hof­fent­lich hat Ihnen das Lesen die­ser Serie etwas Spaß gemacht und Sie haben dabei etwas gelernt.

Wenn Sie neue Fea­tures ver­misst haben soll­ten, las­sen Sie es mich wis­sen. Wenn mög­lich, kann ich noch eini­ge wei­te­re Arti­kel schreiben.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert