本人是一个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. 51nod 1137.矩阵乘法-矩阵乘法

    1137 矩阵乘法 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题   给出2个N * N的矩阵M1和M2,输出2个矩阵相乘后的结果.   Input 第1行:1个数N, ...

  2. 干净卸载mysql

    一.在控制面板中卸载mysql软件 二.卸载过后删除C:\Program Files (x86)\MySQL该目录下剩余了所有文件,把mysql文件夹也删了 三.windows+R运行“regedit ...

  3. 使用CXF开发RESTFul服务

    相信大家在阅读CXF官方文档(http://cxf.apache.org/docs/index.html)时,总是一知半解.这里向大家推荐一本PacktPub.Apache.CXF.Web.Servi ...

  4. 洛谷 P3804 后缀自动机

    题目描述 给定一个只包含小写字母的字符串SS , 请你求出 SS 的所有出现次数不为 11 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字母的字符串SS 输出 ...

  5. 【noip2017 day2T2】【蚯蚓】巧用队列单调性线性处理

    (画师当然是武内崇啦) Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐 ...

  6. 解决android模拟器连接本机服务器”Connection refused”问题

      在本机用模拟器连接 localhost 的服务器不成功,经查询是我反了一个小错误. android 模拟器其本身的localhost就是它自己的ip,而如果我要连接本机的localhost则需要将 ...

  7. Android中Context详解 ---- 你所不知道的Context(转)

    Android中Context详解 ---- 你所不知道的Context(转)                                               本文出处 :http://b ...

  8. 《Flex 第一步》

    //什么是FlexFlex 是一个针对企业级富互联网应用的表示层解决方案.具体地说,Flex是一种应用程序框架.富互联网应用程序,Rich Internet Application,简称RIA,将桌面 ...

  9. Word交叉引用

    第一种:参考文献,用NE插入. 第二种:交叉引用. 先定义新的编号格式[1](主要解决参考文献格式自动编号的问题),感觉但是没有解决缩进的问题,需要Tab. 但是实验发现,通过谷歌学术引用的参考文献插 ...

  10. DATASNAP数据提交之FIREDAC的TFDJSONDeltas

    DATASNAP数据提交之FIREDAC的TFDJSONDeltas FIREDAC的TFDJSONDeltas相当于CLIENTDATASET的DELTA,是作为CLIENTDATASET.DELT ...