Unity接入IAP内购(Android,IOS)最新流程,第一篇:内购接入 ...

十念  金牌会员 | 2024-6-22 13:03:00 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 800|帖子 800|积分 2400

欢迎进入Unity内购系列

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

我们是用的Unity客户端+PHP后台。
客户端内完成内购 -> 内购效果发送给PHP后台 -> PHP后台向IOS或Google后台请求验证订单真实性 -> 验证通过则举行发货 -> 正常情况到此就结束了
非正常情况:如果玩家后期在IOS或Google申请退款,如果退款成功,则IOS或Google会向我们提供的接口发送通知,这时我们需要对退款订单举行处置惩罚
第一篇(内购接入)

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

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

  • unity版本: 2021.3.21f1;其中JDK、NDK、SDK使用unity自带的。
  • 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、给按钮点击事件赋值。

  1. using System;
  2. using UnityEngine;
  3. using UnityEngine.Purchasing;
  4. using UnityEngine.Purchasing.Extension;
  5. using UnityEngine.UI;
  6. public class MyIAP : MonoBehaviour, IDetailedStoreListener
  7. {
  8.     IStoreController m_StoreController; // The Unity Purchasing system.
  9.     void Start()
  10.     {
  11.         InitializePurchasing();
  12.     }
  13.     void InitializePurchasing()
  14.     {
  15.         var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
  16.         //Add products that will be purchasable and indicate its type.
  17.         //初始化产品列表,这里要跟IOS和Google后台的产品列表一致
  18.         builder.AddProduct("acepro_diamond1", ProductType.Consumable);
  19.         builder.AddProduct("acepro_diamond2", ProductType.Consumable);
  20.         builder.AddProduct("acepro_diamond3", ProductType.Consumable);
  21.         builder.AddProduct("acepro_diamond4", ProductType.Consumable);
  22.         builder.AddProduct("acepro_diamond5", ProductType.Consumable);
  23.         builder.AddProduct("acepro_diamond6", ProductType.Consumable);
  24.         UnityPurchasing.Initialize(this, builder);
  25.     }
  26.     //测试用的,正式代码可删除
  27.     public void BuyDimaond1()
  28.     {
  29.         BuyProduct("acepro_diamond1");
  30.     }
  31.     //测试用的,正式代码可删除
  32.     public void BuyDimaond2()
  33.     {
  34.         BuyProduct("acepro_diamond2");
  35.     }
  36.     //购买时调用的接口,外部只需调用这一个接口即可
  37.     public void BuyProduct(string pruductid)
  38.     {
  39.         //开始购买
  40.         m_StoreController.InitiatePurchase(m_StoreController.products.WithID(pruductid));
  41.     }
  42.     public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
  43.     {
  44.         //初始化成功
  45.         Debug.Log("In-App Purchasing successfully initialized");
  46.         m_StoreController = controller;
  47.     }
  48.     public void OnInitializeFailed(InitializationFailureReason error)
  49.     {
  50.         //初始化失败
  51.         OnInitializeFailed(error, null);
  52.     }
  53.     public void OnInitializeFailed(InitializationFailureReason error, string message)
  54.     {
  55.         //初始化失败
  56.         var errorMessage = $"Purchasing failed to initialize. Reason: {error}.";
  57.         if (message != null)
  58.         {
  59.             errorMessage += $" More details: {message}";
  60.         }
  61.         Debug.Log(errorMessage);
  62.     }
  63.     public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args)
  64.     {
  65.         //Retrieve the purchased product
  66.         var product = args.purchasedProduct;
  67.         //Add the purchased product to the players inventory
  68.         //付款成功,通知服务器发货
  69.         //此处需要自行添加逻辑,通知自己的服务器发货,我这边就省略了。
  70.         /*
  71.          ***
  72.          ***
  73.          ***
  74.          */
  75.         Debug.Log($"Purchase Complete - Product: {product.definition.id}");
  76.         //We return Complete, informing IAP that the processing on our side is done and the transaction can be closed.
  77.         return PurchaseProcessingResult.Complete;
  78.     }
  79.     public void OnPurchaseFailed(Product product, PurchaseFailureReason failureReason)
  80.     {
  81.         //付款失败
  82.         Debug.Log($"Purchase failed - Product: '{product.definition.id}', PurchaseFailureReason: {failureReason}");
  83.     }
  84.     public void OnPurchaseFailed(Product product, PurchaseFailureDescription failureDescription)
  85.     {
  86.         //付款失败
  87.         Debug.Log($"Purchase failed - Product: '{product.definition.id}'," +
  88.             $" Purchase failure reason: {failureDescription.reason}," +
  89.             $" Purchase failure details: {failureDescription.message}");
  90.     }
  91. }
复制代码
四、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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

十念

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表