• 前言

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

  • Deals、Membership和Transactions

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

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

var deal = new Deal(guid);
deal.MerchantName = "Contoso";
deal.MerchantAddress.Business1.Street = "boulevard Roi Albert II";
deal.MerchantAddress.Business1.PostalCode = "";
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();
deal.ExpirationDate = deal.StartDate.Value.AddMonths();
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是一个字典类,来保存自定义的信息。

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。

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中添加使用记录。

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(' ')[], out balance))
{
balance = balance + ;
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。

  • 将应用集成到Wallet中

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

<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。

Windows Phone中Wallet钱包的使用的更多相关文章

  1. 在 Windows Phone 中,为 Grid 添加 Tilt 效果

    在 Windows Phone 中,Tilt 效果是比较经典的效果,我们可以很简单的为按钮等控件添加这样的效果(使用 Windows Phone Toolkit 的Tilt 效果),但是,如果我们想要 ...

  2. 如何托管ASP.NET Core应用到Windows Service中

    (此文章同时发表在本人微信公众号"dotNET开发经验谈",欢迎右边二维码来关注.) 题记:正在构思一个中间件的设计,考虑是否既可以使用最新的技术,也可以兼顾传统的部署模式.所以有 ...

  3. UEFI+GPT模式下的Windows系统中分区结构和默认分区大小及硬盘整数分区研究

    内容摘要:本文主要讨论和分析在UEFI+GPT模式下的Windows系统(主要是最新的Win10X64)中默认的分区结构和默认的分区大小,硬盘整数分区.4K对齐.起始扇区.恢复分区.ESP分区.MSR ...

  4. 虚拟机和windows主机中的文件共享

    22:54 2015/12/22 虚拟机和windows主机中的文件共享:特别推荐:我的一个老师特别推荐的方法:在windows安装SSH Secure File Transfer Client,直接 ...

  5. Windows编程中UNICODE和_UNICODE定义问题

    Windows编程中UNICODE和_UNICODE定义问题 先转一篇文章: 初学Windows SDK编程时碰到过这个问题,相信很多初学Windows编程的人也都碰到过,后来慢慢搞明白些了,但有时别 ...

  6. 如何在windows计划中调用备份sharepoint2010网站集的powershell脚本

    最近有个项目需要在在windows计划中使用powershell脚本备份sharepoint2010网站集,打开sharepoint的powershell执行命令管理界面的属性 查看: C:\Wind ...

  7. 【翻译】Windows 10 中为不同设备加载不同页面的3种方法

    在以前,为PC和手机做App是两个工程,PC和手机各一个.在Windows 10中会发现只有一个了,对于简单的页面变化可以使用VisualState来解决,但是比如网易云音乐这种PC版和手机版差异巨大 ...

  8. 解决vista和win7在windows服务中交互桌面权限问题:穿透Session 0 隔离

        在某国外大型汽车公司BI项目中,有一个子项目,需要通过大屏幕展示销售报表,程序需要自动启动和关闭.开发人员在开发过程中,发现在Win7的service中不能直接操作UI进程,调查过程中,发现如 ...

  9. Windows Phone中获取UserAgent

    进入WP8时代后,通过DeviceExtendedProperties获取到的DeviceName不再是手机型号了,这对于需要获得手机型号做一些事情的应用(如新浪微博的小尾巴)来说,影响是比较大的. ...

随机推荐

  1. jQuery Mask

    <script type="text/javascript" src="/assets/mask/jquery.mask.min.js"></ ...

  2. javascript代码复用模式

    代码复用有一个著名的原则,是GoF提出的:优先使用对象组合,而不是类继承.在javascript中,并没有类的概念,所以代码的复用,也并不局限于类式继承.javascript中创建对象的方法很多,有构 ...

  3. java事务管理

    一.什么是Java事务 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性(isol ...

  4. UNICODE字符串与多字节字符串的转换

    相互转换的两个函数的声明: 1. 多字节字符串与宽字符串的转换 int MultiByteToWideChar( UINT CodePage, // code page,一般设为 CP_ACP DWO ...

  5. IDL与C#混合编程技术

    C# (C Sharp)是微软公司在2000年6月发布的一种新的编程语言.C#与Java有很多的相似之处,包括了诸如单一继承.界面.与Java几乎同样的语法,和编译成中间代码再运行的过程.它又借鉴了D ...

  6. angular 指令@、=、&的用法和区别

    1.指令作用域中的@ 作用是把当前属性作为字符串传递. html: <div ng-controller="MyCtrl"> <drink water=" ...

  7. Solaris的vi

    进入输入模式i: 在光标之前插入a: 在光标之后插入o: 在下面新建一行输入I: 光标移动到本行首插入A: 光标移动到本行末尾插入O: 在上面新建一行输入 移动光标M:移到屏幕中间一行的行首L:移到屏 ...

  8. Django搭建及源码分析(三)---+uWSGI+nginx

    每个框架或者应用都是为了解决某些问题才出现旦生的,没有一个事物是可以解决所有问题的.如果觉得某个框架或者应用使用很不方便,那么很有可能就是你没有将其使用到正确的地方,没有按开发者的设计初衷来使用它,当 ...

  9. ASP.NET MVC5 高级编程 第5章 表单和HTML辅助方法

    参考资料<ASP.NET MVC5 高级编程>第5版 第5章 表单和HTML辅助方法 5.1 表单的使用 5.1.1 action 和 method 特性 默认情况下,表单发送的是 HTT ...

  10. linux下source命令的基本功能

    source命令用法:source FileName作用:在当前bash环境下读取并执行FileName中的命令.注:该命令通常用命令“.”来替代.如:source .bash_rc 与 . .bas ...