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

相關文章
相關標籤/搜索