本人是一个Unity忠实爱好者,鉴于网上关于Unity的内置付费教程 少之甚少,本人就把自己倒腾过的IAp分享出来,仅供大家参考。
一、搭建号沙盒环境( 详细请看:http://xiaominghimi.blog.51cto.com/2614927/706415)

二、IAP付费流程图:

总体流程图如下:
<ignore_js_op>

详细流程图分为带服务端验证和不带服务端验证,本文研究的是带服务端验证,流程图如下:

<ignore_js_op>

在Unity中制作IAP主要思想和OC是一样的,只需更改输入接口和输出接口,所以本文主要围绕如何通过C#以插件的形式,在OC跟C#之间建立连接,本质是非托管跟托管之间的连接(托管是可以再公共语言运行库(CLR)上运行的)。

三、接来下我以代码的形式,简短的将整个过程贯穿起来。

首先点击付费按钮之后,调用StoreKit.Install(产品的部分ID);//完整这样com.XXX.XXXX.iap.50,此处填com.XXX.XXXX.iap。StoreKit.Install(产品的部分ID)会调用插件里_StoreKitInstall(productIdPrefix),_StoreKitInstall(productIdPrefix)跟OC建立起了连接,调用相应的OC函数,最后会在OC一个变量中保存产品的部分ID信息。

其次当用户点了某一个购买按钮,向OC发送一次请求,当OC受到请求后,会向App store发送请求,验证当前产品ID是否合法,合法的话,会返回BaseKey,productID,OrderId信息。 UnitySendMessage(“Config”, “BuyComplate_CallBack”, [json UTF8String]);通过这个函数,完成OC和C#一次回调。以json的形式返回给C#产品的订单信息。(UnitySendMessage函数中Config是放置购买脚本的GameObject,BuyComplate_CallBack是购买脚本里面的回调函数)

最后,当客户端收到产品订单后,传给本地服务器,本地服务器拿到产品订单后,再跟App store进行一次验证,返回给客户端验证结果,客户端在更新虚拟货币信息。

四、核心代码
StoreKitPluginEntry.mm和StoreKit.cs是连接OC和C#的桥梁,具体代码如下:

  1. StoreKitPluginEntry.mm
  2. static IAPTransactionObserver *observer;
  3. static NSString* CreateNSString (const char* string) {
  4. return [NSString stringWithUTF8String:(string ? string : "")];
  5. }
  6. extern "C" void _StoreKitInstall(const char *productIdPrefix) {
  7. if (observer == nil) {
  8. observer = [[IAPTransactionObserver alloc] initWithProductIdPrefix:CreateNSString(productIdPrefix)];
  9. }
  10. }
  11. extern "C" void _StoreKitBuy(const char *productName) {
  12. [observer queuePayment:CreateNSString(productName)];
  13. }

复制代码

  1. StoreKit.cs
  2. static string productIdPrefix_;
  3. public static void Install(string productIdPrefix) {
  4. productIdPrefix_ = productIdPrefix;
  5. #if UNITY_IPHONE && !UNITY_EDITOR
  6. _StoreKitInstall(productIdPrefix);
  7. #endif
  8. }
  9. public static void Buy(string productName) {
  10. #if UNITY_IPHONE && !UNITY_EDITOR
  11. _StoreKitBuy(productName);
  12. #endif
  13. }
  14. #if UNITY_IPHONE
  15. [DllImport("__Internal")]
  16. private static extern void _StoreKitInstall(string productIdPrefix);
  17. [DllImport ("__Internal")]
  18. private static extern void _StoreKitBuy(string productName);
  19. #endif

复制代码

  1. [DllImport ("__Internal")]

复制代码

是托管跟非托管的桥梁。以下是Mono官网对 [DllImport ("__Internal")] 的说明

To make the runtime lookup the symbol in the current executable, use the special library name __Internal like this, in your DllImport attribute:

  1. using System.Runtime.InteropServices; [DllImport ("__Internal", EntryPoint="DoSomething")]static extern void DoSomething

复制代码

The “__Internal” library name will instruct Mono not to look this up in an external library, but to try to satisfy the symbol referenced (DoSomething) in the current executable image.
Buy.cs购买代码

  1. public void BuyComplate_CallBack(string result){
  2. string url="";
  3. print("result:"+ result);
  4. url+="m=XXX&a=XXX&uid="+player.PlayerID;
  5. Hashtable json=(Hashtable)MiniJSON.JsonDecode(result);//json解析器
  6. productInfo=json["productID"].ToString().Substring(productInfo.Length+1);//截取购买的类型
  7. WWWForm resultPost=new WWWForm();//由于json字节过长,不能采用get方式提交,所以选用Post方式提交
  8. resultPost.AddField("basyKey",json["BaseKey"].ToString());
  9. resultPost.AddField("OrderId",json["OrderId"].ToString());
  10. resultPost.AddField("productID",json["productID"].ToString());
  11. StartCoroutine(BuyComplate(url,str,resultPost));
  12. }
  13. /*验证是否购买成功,如果成功,更新虚拟货币数量*/
  14. IEnumerator BuyComplate(string url,string productId,WWWForm buyInfo)//
  15. {
  16. WWW productInfo=new WWW(url,buyInfo);
  17. yield return productInfo;
  18. //print("data:"+productInfo.text);
  19. if(productInfo.error==null)
  20. {
  21. Hashtable result=(Hashtable)MiniJSON.JsonDecode(productInfo.text);
  22. if(result["status"].ToString()=="ok")
  23. {
  24. switch(productId)
  25. {
  26. case "tier1":player.Gemstone+=50;break;
  27. }
  28. }
  29. }
  30. }

复制代码

到此,Unity之IAP讲述完毕,以下附上原工程和对应的Json解析器。ECPurchase和testIap下载
水平有限,不足之处望大家指正。

原文链接 http://blog.chukong-inc.com/index.php/2012/01/05/unity3d-%e4%b9%8biap/

Unity3D 之IAP的更多相关文章

  1. Unity3D如何有效地组织代码?(转)

    问题: Unity3D可以说是高度的Component-Based Architecture,同时它的库提供了大量的全局变量.如何来组织代码呢? 答: - Unity有一些自身的约定,譬如项目里的Ed ...

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

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

  3. Unity3D如何有效地组织代码?

    本文整理自知乎,原文链接:http://www.zhihu.com/question/21070379 问题: Unity3D可以说是高度的Component-Based Architecture,同 ...

  4. Unity3D与iOS的交互

    1. 关于Unity3D Unity3D(以下简称U3D)是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开 ...

  5. Unity3d学习 预设体(prefab)的一些理解

    之前一直在想如果要在Unity3d上创建很多个具有相同结构的对象,是如何做的,后来查了相关资料发现预设体可以解决这个问题! 预设体的概念: 组件的集合体 , 预制物体可以实例化成游戏对象. 创建预设体 ...

  6. Unity3d入门 - 关于unity工具的熟悉

    上周由于工作内容较多,花在unity上学习的时间不多,但总归还是学习了一些东西,内容如下: .1 根据相关的教程在mac上安装了unity. .2 学习了unity的主要的工具分布和对应工具的相关的功 ...

  7. TDD在Unity3D游戏项目开发中的实践

    0x00 前言 关于TDD测试驱动开发的文章已经有很多了,但是在游戏开发尤其是使用Unity3D开发游戏时,却听不到特别多关于TDD的声音.那么本文就来简单聊一聊TDD如何在U3D项目中使用以及如何使 ...

  8. warensoft unity3d 更新说明

    warensoft unity3d 组件的Alpha版本已经发布了将近一年,很多网友发送了改进的Email,感谢大家的支持. Warensoft Unity3D组件将继续更新,将改进的功能如下: 1. ...

  9. Unity3D框架插件uFrame实践记录(一)

    1.概览 uFrame是提供给Unity3D开发者使用的一个框架插件,它本身模仿了MVVM这种架构模式(事实上并不包含Model部分,且多出了Controller部分).因为用于Unity3D,所以它 ...

随机推荐

  1. [POJ 2329] Nearest number-2

    Link: POJ 2329 传送门 Solution: 比较明显的$dp$,但爆搜好像也能过 用多个方向$dp$来解决此题,最后汇总答案即可 一开始我写了4个,但后来发现只要相反的2个方向即可,同时 ...

  2. POJ 2441 Arrange the Bulls(状压DP)

    [题目链接] http://poj.org/problem?id=2441 [题目大意] 每个人有过个喜欢的篮球场地,但是一个场地只能给一个人, 问所有人都有自己喜欢的场地的方案数. [题解] 状态S ...

  3. (转)Unity3D 开发优秀技术资源汇总

    原文:http://www.j2megame.com/html/xwzx/ty/3179.html Unity3D 博客 http://www.dapp.com.br/  by Dapp http:/ ...

  4. 线程流量控制工具之Semaphore

    简介 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源.很多年以来,我都觉得从字面上很难理解Semaphore所表达的含义,只能把它比作是 ...

  5. webpack2.x基础属性讲解

    webpack作为构建工具平时作为前端作为优化.模块编程.和分片打包的重要组成部分,大家可能并不陌生,如果没有时刻的去关注文档,那么大家可能不太清楚webpack已经默默然的升级到2.x了,对比1.x ...

  6. 咏南3层数据集控件--TYNDataSet

    咏南3层数据集控件--TYNDataSet 和2层CS数据集的语法非常近似.有了这个控件,学习掌握3层开发变得如此地简单. 新增数据: procedure Tfunit.btnappendClick( ...

  7. 设计模式之迭代器模式(PHP实现)

    github地址:https://github.com/ZQCard/design_pattern/** * 迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常 ...

  8. Spark jdbc postgresql数据库连接和写入操作源代码解读

    概述:Spark postgresql jdbc 数据库连接和写入操作源代码解读.具体记录了SparkSQL对数据库的操作,通过java程序.在本地开发和执行.总体为,Spark建立数据库连接,读取数 ...

  9. osx中Grapher的使用

    Grapher 是一个可创建方程图形的应用程序,因此您能够使结果可视化.您能够输入各种数学函数,以二维和三维图形方式查看它们. 您甚至能够让图形动起来.用图形制作影片文件. 打开osx中的Graphe ...

  10. Win7 无法将快捷方式从任务栏移除怎么办

    不知道是什么修改了系统的属性了.在网上找到了这个方法解决了:一:为了解决这个问题,你可以尝试下面的方法:    把以下命令分别输入到开始-运行中    1.cmd /k reg add "H ...