Windows Phone中Wallet钱包的使用

  • 前言

     Windows Phone 8中加入了钱包Wallet这个功能,这个功能很是的有意思,开发者能够经过Wallet提供的API建立获取Wallet中的商品。统一管理用户的收集优惠券、信用卡、成员资格、会员卡和一些自定义的信息。甚至能够将本身开发的应用集成到系统的Wallet中,不只方便了用户的管理,还可让用户直接从Wallet中获得关联的应用。这个关联的功能很是适合一些笔记类、旅行类、金融管理类的应用,好比,印象笔记、有道笔记、挖宝和携程、艺龙。网络

  • Deals、Membership和Transactions

   在使用Wallet的API以前,你必需要开启应用的Wallet能力,在WMAppManifest.xml中勾选ID_CAP_WALLET,以下图。app

    Deals是一种经常使用的Wallet类型,你能够理解为是一个优惠劵的集合,你能够在你的应用内建立优惠劵信息并将其添加到系统的Wallet中,并提供了更新、删除的功能。async

var deal = new Deal(guid);
deal.MerchantName = "Contoso";
deal.MerchantAddress.Business1.Street = "boulevard Roi Albert II";
deal.MerchantAddress.Business1.PostalCode = "1030";
deal.MerchantAddress.Business1.City = "Schaerbeek";
deal.MerchantAddress.Business1.CountryRegion = "Belgium";
deal.OfferWebsite = new Uri("http://www.contoso.com");
deal.IssuerName = "Contoso";
deal.StartDate = DateTime.Now.Date.AddDays(1);
deal.ExpirationDate = deal.StartDate.Value.AddMonths(2);
var barcode = new BitmapImage();
barcode.SetSource(Application.GetResourceStream(new Uri("Assets/barcode.bmp", UriKind.Relative)).Stream);
deal.BarcodeImage = barcode;
var logo99 = new BitmapImage();
logo99.SetSource(Application.GetResourceStream(new Uri("Assets/DealIcon99.png", UriKind.Relative)).Stream);
deal.Logo99x99 = logo99;
var logo159 = new BitmapImage();
logo159.SetSource(Application.GetResourceStream(new Uri("Assets/DealIcon159.png", UriKind.Relative)).Stream);
deal.Logo159x159 = logo159;
var logo336 = new BitmapImage();
logo336.SetSource(Application.GetResourceStream(new Uri("Assets/DealIcon336.png", UriKind.Relative)).Stream);
deal.Logo336x336 = logo336;
deal.CustomProperties.Add("Perso", new CustomWalletProperty("Custom field", "This is a custom message."));
await deal.SaveAsync();

      上面咱们就建立了一个deal并经过SaveAsync方法将其保存到了Wallet中。deal的Logo有三种格式,分别对应不一样分辨率的手机。CustomProperties是一个字典类,来保存自定义的信息。ide

var walletItems = await Wallet.GetItemsAsync();
var item = walletItems.FirstOrDefault(s => s.Id == guid);
if(item != null)
{
   Wallet.Remove(item);
}

       GetItemsAsync方法返回的是一个WallteItemCollection的集合,这个集合是包括咱们应用内建立爱你的WalletItem,不包括其余入口建立的WalletItem,因此你只能对本身应用内建立的Item作修改。你可使用Linq来获取单个的元素,使用Wallet的Remove方法从Wallet中删除deal。网站

       Wallet也能够用来支付,经过OnlinePaymentInstrument,PaymentInstrument,WalletTransactionItem能够实现不一样需求,下面咱们主要讲的仍是最后一种WalletItem,前两种须要你的开发者帐号到MarketPlace注册。下面咱们来建立一个会员卡的WalletItem。ui

var membership = new WalletTransactionItem("ContosoRewards");
var logo99 = new BitmapImage();
logo99.SetSource(Application.GetResourceStream(new Uri("Assets/Icon99.png", UriKind.Relative)).Stream);
membership.Logo99x99 = logo99;
var logo159 = new BitmapImage();
logo159.SetSource(Application.GetResourceStream(new Uri("Assets/Icon159.png", UriKind.Relative)).Stream);
membership.Logo159x159 = logo159;
var logo336 = new BitmapImage();
logo336.SetSource(Application.GetResourceStream(new Uri("Assets/Icon336.png", UriKind.Relative)).Stream);
membership.Logo336x336 = logo336;
membership.DisplayName = "Contoso Shop";
var task = new AddWalletItemTask {Item = Membership};
task.Completed += taskCompleted;
task.Show();
 
private void taskCompleted(object sender, AddWalletItemResult e)
        {
            if (e.TaskResult == TaskResult.OK)
            {
                MessageBox.Show("Membership created");
            }
            else
            {
                MessageBox.Show("Membership not created !");
            }
        }

      WalletTransactionItem须要经过AddWalletItemTask添加到Wallet中,这时咱们在Wallet中就能够看到咱们刚刚建立的会员卡了。一般咱们还要特别记录会员卡的使用状况,这个记录也能够记录在Wallet中,经过WalletTransactionItem的TransactionHistory属性向Wallet中添加使用记录。spa

Membership.TransactionHistory.Add(Guid.NewGuid().ToString(), new WalletTransaction
  {
    Description = "超市消费",
    DisplayAmount = "-100",
    IsTransactionTimeValid = true,
    TransactionDate = DateTime.Now
  });
  • WalletAgent

    上面的例子都是咱们在本身建立的App内操做Wallet中的数据,试想若是咱们在网站上贴出了一个优惠劵,经过本身的App将这个优惠劵添加到了Wallet中,若是这个优惠劵过时了咱们可否在不打开原应用的状况下直接在Wallet中刷新优惠劵呢?答案是能够的,这就须要咱们在应用内添加一个WalletAgent,若是以前没有使用过BackgroundAgent,那么最好先自行Google一下BackgroundAgent的原理。
代理

protected override async void OnRefreshData(Microsoft.Phone.Wallet.RefreshDataEventArgs args)
       {
           foreach (var walletItem in args.Items)
           {
               var transactionitem = walletItem as WalletTransactionItem;
               if (transactionitem == null) continue;
               int balance;
               if (int.TryParse(transactionitem.DisplayBalance.Split(' ')[0], out balance))
               {
                   balance = balance + 10;
                   transactionitem.DisplayBalance = balance + " points";
                   transactionitem.TransactionHistory.Add(Guid.NewGuid().ToString(),
                   new WalletTransaction
                   {
                     Description = "Agent operation",
                     DisplayAmount = "+ 10",
                     IsTransactionTimeValid = true,
                   });
            await transactionitem.SaveAsync();
        }
        else
        {
            // Error, do something
        }
    }
    base.OnRefreshData(args);
}

      继承自WalletAgent的代理类只须要重写OnRefreshData就能够对Wallet中的优惠劵作出相应的操做,args.Items表明能够更新的优惠劵的项。用户经过点击相应优惠劵下的刷新按钮处罚OnRefreshData事件,咱们能够经过一个WebService获取网络上有关优惠劵最新的信息,而后更新Wallet。code

  • 将应用集成到Wallet中

    为了让用户在Wallet的其余选项中发现你的应用,你须要将你的应用添加为Wallet的扩展。这样当用户点击“添加”时,会使您的应用出如今 Wallet 的“其余”应用列表中。随后,用户能够从该列表中挑选您的应用,该应用将在手机上下载并安装。若要出如今 Wallet 的“其余”列表中,请注册为一项 Wallet 扩展。扩展在您的应用项目的 WMAppManifest.xml 文件中指定。如下是 WMAppManifest.xml 文件的一个示例,其中包含用于将应用注册为 Wallet 扩展的 Extension 元素。xml

<Extensions>
      <Extension ExtensionName="Wallet_app_membership" ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5683}" TaskID="_default"/>
</Extensions>

     在以上代码中,经过在 WMAppManifest.xml 文件中将一个 Extension 元素添加至 Extensions扩展。

     ExtensionName: 定义所注册扩展的类型。注册为 Wallet 扩展时,此属性的有效值为:

  • Wallet_app_other – 用于非特定 Wallet 项目

  • Wallet_app_loyalty – 用于信用卡

  • Wallet_app_membership – 用于会员卡

  • Wallet_app_transit – 用于储值卡

  • Wallet_app_payment – 用于支付卡

     即便你的应用将用于多种 Wallet 项目类型也只须要注册一次,。能够按须要注册为多种 Wallet 项目类型的扩展,方法是在 WMAppManifest.xml 文件中将多个 Extension 元素添加到 Extensions 中。目前,当用户在Wallet中点击“其余”以显示“添加到 Wallet”对话框并查找 Wallet 扩展时,将返回全部扩展,不管注册为哪一种 Wallet 项目类型。

  • ConsumerID: 这是一个固定值,在手机上设置为 Wallet 应用的 id,即 {5B04B775-356B-4AA0-AAF8-6491FFEA5683}。

  • TaskID: 将此设置为 default

相关文章
相关标签/搜索