• 前言

      应用内购买(In-App Purchase)对于开发者来说绝对是一个非常重要的功能,它提供了一个便捷的入口供用户来购买付费。在IAP盛行之前的游戏运营商一般都是通过接入第三方支付入口来收费。之前做过的一个安卓手机游戏服务器(Asp.Net),他们采用的付费方式有两种,一个是接入支付宝的接口,让用户可以通过支付宝来付费。还有一种是通过手机运营商来付费,先由用户把钱付给运营商,运营商通过你注册的服务器的API告知该用户已付费。在Windows Phone 8中就不用担心第三方付费服务器的问题了,微软为我们提供了一个付费的功能,也就是之前提到的IAP,付费的整个过程都是由微软的交易平台(Microsoft Commerce Platform)来提供支持的,通过Windows.ApplicationModel.Store命名空间下的API可以非常容易的实现IAP的功能,省去了很多接入第三方付费接口的调试时间。下面这张图介绍了创建和购买虚拟物品的流程。

a/b:开发者通过Dev Center注册自己的付费App和所有虚拟物品信息。如果商品要从服务器下载,那么你需要自己提供这个服务器。

c/d:开发者拉取Store上注册的虚拟物品并展示在App内,由用户来点击购买。

e/f:微软交易平台告知你的App用户付费成功,并获取电子收据。

g/h:通过微软交易平台提供的收据作为凭证,从你的服务器下载虚拟物品。并告知交易平台该商品已经成功分发。

整个过程还是非常简单清晰的,需要注意的是如果你的游戏非常的轻量,比如是个单机游戏,那么虚拟商品就不需要服务器的支持,电子收据这步可以省略掉。大型的手机游戏一般都会有后端服务器的支持。电子收据为我们从服务器下载插件时提供了有效的凭证。下面我们就先省略掉注册应用和虚拟物品这两个步骤,做一个简单客户端IAP的例子。

private async void LoadListingInformationAsync()
{
try
{
// Query the Windows Phone Store for the in-app products defined for the currently-running app.
var listingInformation = await CurrentApp.LoadListingInformationAsync();
foreach (var v in listingInformation.ProductListings)
{
Products.Add(new ProductViewModel() { Title = v.Value.Name, ProductId = v.Value.ProductId, ImageUri = v.Value.ImageUri });
}
}
catch
{
// An exception is expected to be raised by CurrentApp.LoadListingInformationAsync()
//when it is not called from an app installed from the Windows Phone Store.
}
}

上面这段代码就是异步的从Store中获取我们事先注册好的虚拟物品集合。CurrentApp是一个非常重要的类,它包含了所有主要操作虚拟物品的方法。通过上面的方法获取到虚拟物品的信息后,我们就可以对数据做进一步的处理,例子当中用一个ObservableCollection类型的集合Producets来保存数据,并通过databinding将其展示在商品页面上,供用户选择购买。

private async void PurchaseProduct(string productId)
{
try
{
// Kick off purchase; don't ask for a receipt when it returns
await CurrentApp.RequestProductPurchaseAsync(productId, false); // Now that purchase is done, give the user the goods they paid for
// (DoFulfillment is defined later)
//DoFulfillment();
}
catch (Exception ex)
{
// When the user does not complete the purchase (e.g. cancels or navigates back from the Purchase Page),
// an exception with an HRESULT of E_FAIL is expected.
}
}

当用户确定要购买某项虚拟物品的时候通过调用RequestProductPurchaseAsync方法来开启用户付费的过程,这个方法需要两个参数,一个是之前获取到的虚拟物品的id,另一个是bool类型的参数,代表在付费成功后是否要返回购买虚拟物品的电子收据,电子收据是一个xml格式的信息。如果用户没有完成付费操作,比如取消或者通过back键返回等,都会触发一个错误类型为E_FALL的Exception。

public void DoFulfillment()
{
var productLicenses = CurrentApp.LicenseInformation.ProductLicenses;
DistributeProduct(productLicenses);
} private void DistributeProduct(IReadOnlyDictionary<string, ProductLicense> productLicenses)
{
var bagOfSilver = new Regex(@"Bag\.Silver\.(\d+)");
foreach (ProductLicense license in productLicenses.Values)
{
if (license.IsConsumable && license.IsActive)
{
var m = bagOfSilver.Matches(license.ProductId);
if ((m.Count == ) && (m[].Success))
{
m_silverCount += int.Parse(m[].Value);
CurrentApp.ReportProductFulfillment(license.ProductId);
}
}
}
}

当用户付费成功后我们就可以在App里面将虚拟物品分发给用户,通过CurrentApp.LicenseInformation.ProductLicenses获取到用户购买的虚拟物品的授权license,ProductLicenses是一个IDictionary类型的集合,可以通过TryGetValue方法获取到某个商品的授权。IsConsumable属性代表商品可以进行消费,IsActive属性代表这个license是有效的。如果license有效,我们就可以把虚拟物品分发给用户了。最后还要调用ReportProductFulfillment方法告诉Store商品已经分发,整个购买过程结束。

public async Task<bool> LoadLevelAsync(string levelProductId)
{
var license = CurrentApp.LicenseInformation.ProductLicenses[levelProductId];
if (!license.IsActive)
{
// User doesn't own this level
return false;
}
if (!IsLevelDownloaded(levelProductId))
{
var receiptXml = await CurrentApp.GetProductReceiptAsync(levelProductId);
await DownloadLevelAsync(receiptXml);
}
// TODO: Load the level
return true;
} private async Task DownloadLevelAsync(string receiptXml)
{
var webReq = (HttpWebRequest)WebRequest.Create(sc_DownloadUrl);
webReq.Method = "POST";
AddStringToWebRequestStream(webReq, receiptXml);
WebResponse response = await webReq.GetResponseAsync();
// TODO: Save the level to disk
}

如果我们的虚拟物品要从自己的服务器下载比如皮肤和主题文件,使用GetProductReceiptAsync方法获取电子收据recipt。有了电子收据方便我们的服务器对恶意的商品请求做出过滤,避免第三方通过不法手段获取虚拟商品。

  • 总结

     Windows Phone Store的IAP已经封装成了一个非常方便的接口,如果你还没有注册虚拟物品到Dev Center可以先通过CurrentAppSimulator类来模拟整个过程。IAP绝对是一个有益于开发者的特性,可以吸引更多的开发者来完善整个生态圈。那么就开始你的IAP之旅吧。

Windows Phone中In-App Purchase应用内购买的更多相关文章

  1. 将WCF寄宿在托管的Windows服务中

    在我之前的一篇博客中我介绍了如何发布WCF服务并将该服务寄宿于IIS上,今天我再来介绍一种方式,就是将WCF服务寄宿在Windows服务中,这样做有什么好处呢?当然可以省去部署IIS等一系列的问题,能 ...

  2. [IPA]IOS In App Purchase(内购)验证

    参考我之前的笔记 苹果内购笔记,在客户端向苹果购买成功之后,我们需要进行二次验证. 二次验证 IOS在沙箱环境下购买成功之后,向苹果进行二次验证,确认用户是否购买成功. 当应用向Apple服务器请求购 ...

  3. 背水一战 Windows 10 (101) - 应用间通信: 通过协议打开指定的 app 并传递数据以及获取返回数据, 将本 app 沙盒内的文件共享给其他 app 使用

    [源码下载] 背水一战 Windows 10 (101) - 应用间通信: 通过协议打开指定的 app 并传递数据以及获取返回数据, 将本 app 沙盒内的文件共享给其他 app 使用 作者:weba ...

  4. unity3d 嵌入iOS的 In App Purchase 应用程序内购买

    Unity做东西是快,但是有些功能是需要额外开发的,比如 IAP (In App Purchase,应用程序内购买) 还好unity提供了灵活的扩展功能,允许嵌入原生代码来做一些unity未实现的功能 ...

  5. [转载]在 Windows 10 中, 如何卸载和重新安装 OneNote App

    在 Windows 10 中, 如何卸载和重新安装 OneNote App 15/8/2015 使用 PowerShell 命令卸载 OneNote App 开始菜单 -> 输入 "P ...

  6. Windows环境中,通过Charles工具,抓取安卓手机、苹果手机中APP应用的http、https请求包信息

    Windows环境中,通过Charles工具,抓取安卓手机.苹果手机中APP应用的http.https请求包信息1.抓取安卓手机中APP应用的http请求包信息1)在电脑上操作,查看Windows机器 ...

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

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

  8. iOS 开发 初级:应用内购买 In-App Purchase

    http://blog.csdn.net/songrotek/article/details/8680415 现在有很多应用都使用了In-App Purchase,虽然对于很多用户来说,可能并不喜欢甚 ...

  9. In App Purchase翻译

    一.In App Purchase概览 Store Kit代表App和App Store之间进行通信.程序将从App Store接收那些你想要提供的产品的信息,并将它们显示出来供用户购买.当用户需要购 ...

随机推荐

  1. 解决visual studio已安装的问题

    使用Windows Install Clean Up(用管理员身份打开),找到相应的软件

  2. [linux]查看文件编码和编码转换

    方法一:file filename 方法二:在Vim中可以直接查看文件编码 :set fileencoding 即可显示文件编码格式. 如果你只是想查看其它编码格式的文件或者想解决用Vim查看文件乱码 ...

  3. 关于玩QQ消息导入导出功能的感想!

    今天玩了一下QQ的导入导出聊天记录的功能,感觉自己有些白痴,因为作为一个软件开发人员对自己平时使用的软件的功能掌握的不够,别说其他的任何东西了就连功能性的操作有些也不知道更别说熟练或精通了,这不是一个 ...

  4. 学习练习 java 集合

    将1—100之间的所有正整数存放在一个List集合中,并将集合中索引位置是10的对象从集合中移除 package com.hanqi; import java.util.*; public class ...

  5. Android基础总结(9)——网络技术

    这里主要讲的是如何在手机端使用HTTP协议和服务器端进行网络交互,并对服务器返回的数据进行解析,这也是Android最常使用到的网络技术了. 1.WebView的用法 Android提供的WebVie ...

  6. 转)SSO单点登录在互联网电商应用中的解决方案(基于CAS的改造)

    电商平台中无论是前端还是后端会存在大量的业务应用,在整个交易的过程中请求是在各个业务应用中流转的,对于用户来讲只需要登录一次就可以访问所有的业务,这就是单点登录SSO. 单点登录开源有很多的解决方案, ...

  7. 简化对象extend拓展

    发现对对象继承或拷贝的时候,总是要$点来点去好麻烦,我的解决办法如下: (function(){ Object.prototype.extend = function(o){ $.extend(tru ...

  8. Android IOS WebRTC 音视频开发总结(六十)-- 您为什么招不到适合的音视频人才

    本文主要介绍音视频行业招聘现状,文章最早发表在我们的微信公众号上,详见这里,欢迎关注微信公众号blackerteam,更多详见www.blackerteam.com 有过音视频人才招聘经验的应该都深有 ...

  9. css3动画属性

    Transitions  transitions:property 用哪个属性进行设置             :duration 执行时间             :timing-function  ...

  10. zencart用chrome无法登录后台

    再本地安装完zencart后,可以使用ie和Firefox登录网站后台,但是使用chrome登录时,页面闪一下,然后又跳转到登录页面. 按如下设置可以解决该问题: 中文版:商店设置->Sessi ...