从0开始接入unity iap
欢迎进入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、给按钮点击事件赋值。
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
发表评论