Unity接入IAP内购(Android,IOS)最新流程,第一篇:内购接入
创始人
2024-11-16 07:06:07
0次

从0开始接入Unity IAP

  • 欢迎进入Unity内购系列
    • 整体流程介绍
    • 第一篇(内购接入)
    • 接入环境
    • 一、创建空工程
    • 二、添加IAP插件
    • 三、写代码
    • 四、Google后台配置
    • 五、IOS后台配置
    • 六、打包测试
    • 七、Demo

欢迎进入Unity内购系列

你好! 这将是一个系列的文章
第一篇 介绍客户端里支付的调起以及购买。
第二篇 介绍后台对购买结果的验证以及发货(IOS)。
第三篇 介绍后台对购买结果的验证以及发货(Android)。
第四篇 介绍后台对内购退单问题的处理(IOS欺诈检测以及欺诈信息反馈)。

整体流程介绍

我们是用的Unity客户端+PHP后台。

客户端内完成内购 -> 内购结果发送给PHP后台 -> PHP后台向IOS或Google后台请求验证订单真实性 -> 验证通过则进行发货 -> 正常情况到此就结束了

非正常情况:如果玩家后期在IOS或Google申请退款,如果退款成功,则IOS或Google会向我们提供的接口发送通知,这时我们需要对退款订单进行处理

第一篇(内购接入)

本篇介绍unity里内购插件IAP的接入,这一篇只包含客户端内支付的调起以及购买。
流程非常简单,不需要开启Unity Service等服务,也不需要Google后台服务公钥,只需5分钟即可完成接入,只需要按照我的流程,就一定能成功。

接入环境

本篇介绍unity里内购插件IAP的接入,这一篇只包含客户端内支付的调起以及购买。

  1. unity版本: 2021.3.21f1;其中JDK、NDK、SDK使用unity自带的。
  2. IAP版本: 4.10.0;

一、创建空工程

使用2021.3.21f1创建3D核心模板空工程

二、添加IAP插件

1、打开Package Manager,选择Unity Register,找到In App Purchasing,点击Install。
在这里插入图片描述

2、IAP导入完成之后会有一个弹窗让我们Link Project,这里我们不用管,选Close就可以了。
不要选Link Project,因为那些是给单机游戏用的,需要客户端内自己验证订单的情况下要选Link Project,然后还要填入Google的公钥以及其他设置。
在这里插入图片描述

三、写代码

1、创建UI,新建2个按钮,一个挂载脚本的空物体。
2、新建脚本,代码如下,将脚本拖到空物体上。
3、给按钮点击事件赋值。
在这里插入图片描述

using System; using UnityEngine; using UnityEngine.Purchasing; using UnityEngine.Purchasing.Extension; using UnityEngine.UI;  public class MyIAP : MonoBehaviour, IDetailedStoreListener {     IStoreController m_StoreController; // The Unity Purchasing system.      void Start()     {         InitializePurchasing();     }      void InitializePurchasing()     {         var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());          //Add products that will be purchasable and indicate its type.         //初始化产品列表,这里要跟IOS和Google后台的产品列表一致         builder.AddProduct("acepro_diamond1", ProductType.Consumable);         builder.AddProduct("acepro_diamond2", ProductType.Consumable);         builder.AddProduct("acepro_diamond3", ProductType.Consumable);         builder.AddProduct("acepro_diamond4", ProductType.Consumable);         builder.AddProduct("acepro_diamond5", ProductType.Consumable);         builder.AddProduct("acepro_diamond6", ProductType.Consumable);          UnityPurchasing.Initialize(this, builder);     }     //测试用的,正式代码可删除     public void BuyDimaond1()     {         BuyProduct("acepro_diamond1");     }     //测试用的,正式代码可删除     public void BuyDimaond2()     {         BuyProduct("acepro_diamond2");     }     //购买时调用的接口,外部只需调用这一个接口即可     public void BuyProduct(string pruductid)     {         //开始购买         m_StoreController.InitiatePurchase(m_StoreController.products.WithID(pruductid));     }      public void OnInitialized(IStoreController controller, IExtensionProvider extensions)     {         //初始化成功         Debug.Log("In-App Purchasing successfully initialized");         m_StoreController = controller;     }      public void OnInitializeFailed(InitializationFailureReason error)     {         //初始化失败         OnInitializeFailed(error, null);     }      public void OnInitializeFailed(InitializationFailureReason error, string message)     {         //初始化失败         var errorMessage = $"Purchasing failed to initialize. Reason: {error}.";          if (message != null)         {             errorMessage += $" More details: {message}";         }          Debug.Log(errorMessage);     }      public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args)     {         //Retrieve the purchased product         var product = args.purchasedProduct;          //Add the purchased product to the players inventory         //付款成功,通知服务器发货         //此处需要自行添加逻辑,通知自己的服务器发货,我这边就省略了。         /*          ***          ***          ***          */         Debug.Log($"Purchase Complete - Product: {product.definition.id}");          //We return Complete, informing IAP that the processing on our side is done and the transaction can be closed.         return PurchaseProcessingResult.Complete;     }      public void OnPurchaseFailed(Product product, PurchaseFailureReason failureReason)     {         //付款失败         Debug.Log($"Purchase failed - Product: '{product.definition.id}', PurchaseFailureReason: {failureReason}");     }      public void OnPurchaseFailed(Product product, PurchaseFailureDescription failureDescription)     {         //付款失败         Debug.Log($"Purchase failed - Product: '{product.definition.id}'," +             $" Purchase failure reason: {failureDescription.reason}," +             $" Purchase failure details: {failureDescription.message}");     }  }  

四、Google后台配置

Google后台配置。(暂时无图,等有图了再补上)
只需要添加应用内商品,并激活即可,不需要其他设置。

五、IOS后台配置

IOS后台配置。(暂时无图,等有图了再补上)
只需要添加应用内商品,并激活即可,不需要其他设置。

六、打包测试

Google测试前提条件:
1、手机开启VPN,否则无法完成初始化而且无法调起内购。
2、需要Google账号添加可用的银行卡。如果可以正常调起内购,并且显示了价格等信息,基本上是没有问题的,客户端内购买的流程就算结束了。

打包设置里面需要注意的地方我已经用红框标记了
1、版本号需要比自己google商店的最新版本一样或者比google版本高,如果比google版本低,会提示当前版本不支持google结算等提示,另外google后台的商品也需要设置为激活状态,否则也会出现当前版本不支持google结算等提示

2、keystore换成自己的,而且要跟google上的一致。如果加入了Google Play 签名计划,那么也是无法完成内购的,需要提包到google测试轨道,如果没有加入Google Play 签名计划,可以本地打包直接测试。
3、包名肯定是需要一致的。

总的来说就是要和自己google上的应用,包名、签名、版本一致就可以了。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七、Demo

其中的代码可直接使用,APK可直接运行,第一个商品是有效的,第二个商品是无效的。
正常购买示例
非正常购买示例

Demo地址如下:
Unity IAP完整Demo,内含可运行APK

相关内容

热门资讯

每日必看!江岸多玩到底能开挂吗... 每日必看!江岸多玩到底能开挂吗(辅助挂),江岸多玩原来真的有辅助挂讲义1、江岸多玩脚本辅助下载、江岸...
玩家交流!颖河竞技怎么开挂(外... 玩家交流!颖河竞技怎么开挂(外挂),颖河竞技好像是有外挂教材一、颖河竞技游戏安装教程牌型概率发牌机制...
最新通报!皮皮四川麻将软件下载... 最新通报!皮皮四川麻将软件下载(辅助挂),皮皮四川麻将果然有辅助挂模块1、操作简单,无需皮皮四川麻将...
一分钟揭秘!52游戏开挂脚本(... 一分钟揭秘!52游戏开挂脚本(透视挂),52游戏切实有透视挂法子52游戏脚本下载中分为三种模型:52...
一分钟快速了解!堆堆乐开挂破解... 一分钟快速了解!堆堆乐开挂破解(外挂),堆堆乐竟然真的有外挂方针1、下载好堆堆乐正确养号方法之后点击...
重大通报!汇城贵州麻将开挂脚本... 重大通报!汇城贵州麻将开挂脚本(开挂),汇城贵州麻将原来真的有开挂法门1、重大通报!汇城贵州麻将开挂...
盘点一款!七色城透视挂件(外挂... 盘点一款!七色城透视挂件(外挂),七色城切实是真的有外挂经验1、全新机制【七色城ai辅助工具激活码】...
今日头条!多多休闲透视软件下载... 今日头条!多多休闲透视软件下载(外挂),多多休闲确实是真的有外挂攻略1、首先打开多多休闲辅助器下载最...
关于!钱柜麻将真的有透视吗(辅... 关于!钱柜麻将真的有透视吗(辅助器),钱柜麻将一贯是有辅助器练习钱柜麻将能透视中分为三种模型:钱柜麻...
今日焦点!河北家乡棋牌辅助工具... 今日焦点!河北家乡棋牌辅助工具(外挂),河北家乡棋牌果然是有外挂手册小薇(辅助器软件下载)致您一封信...