因为工作需要,最近一直在研究Unibill这个插件,分享一个研究成果。
苹果内购流程就不详细述说了,如果有需要的童鞋可以去看看点击打开链接,里面讲的很详细,这里就不细说了。
物品的信息可能通过上图手动添加,也可动态添加,需要注意的是物品Id必顺和iTunes申请的一致,否则会导致购买失败
从Unibill接收数据
Unibill初使化完成调用(Unibiller.Initialise()),并有返回值
SUCCESS:初使化成功,可以进行购买
SUCCESS_WITH_ERRORS:有一个或多个错误,不影响购物,可通过Unibiller去检索错误。
CRITICAL_ERROR: 初使化失败,会在XCode控制台输出错误信息。
如果初使化成功,就可以通过按钮进行购买,进行购买的函数是
需要传入的参数是物品的ID和开发都平台,ID是必填,开发者平台可不填,如何获得购买的物品ID,旧版本unibill会收到服务器发送的一个可购买列表,新版本把这个函数已经移除了,只能通过Unibiller.AllPurchasableItems获得本地物品列表(也可通过AllNonConsumablePurchasableItems获得非消耗物品列表,AllConsumablePurchasableItems可消耗物品列表),所以这个上面物品的ID必顺和iTunes完全一致。
购买之后,会进入iTunes的购买界面,这个不用我们进行操作,iTunes会进行处理。
购买成功,返回一个物品列表,里面包含物品的各种信息。
取消购买。
购买失败,返回购买失败的物品列表,如果购买失败,最好检查 一下物品的ID。
publicstaticevent Action
publicstaticevent Action<bool> onTransactionsRestored;恢复购买,只有未消耗品才有此功能(用户把游戏卸载后,重新安装,恢复购买才应该有作用),返回为true时,需要判断Unibiller.getPurchaseCount("levelPack1") > 0(这个获得的Count是通过苹果平台获取到的,大于0说明用户已经购买过),可以恢复,false不可以进行恢复,恢复购买函数Unibiller.restoreTransactions();
如果想知道某个物品在平台上购买了多少次,可通过Unibiller.getPurchaseCount("levelPack1")这个函数查询,传入参数是物品的ID。
Unibiller.clearTransactions();消除本地采购记录
以上是不需要和自己服务器进行联通的情况,如果需要和服务器进入验证,需要在购买成功后向自己服务器进行一下校正,首先要把购买成功后的信息解析出来,
返回一个购买数据,需要从receipt中解析出“Status”,如果status==0说明购买成功,如果返回其他说明购买失败,具体返回数据是什么意思,大家可以百度一下
IEnumerator SuccessCheck(PurchaseEvent e )
{
#if SANDOBX_TEST
logstring += e.PurchasedItem.name.ToString();
#endif
Debug.Log("从服务器获得的Receipt"+e.Receipt);
WWWForm Post = new WWWForm();
string josnstring = string.Format("{{\"receipt-data\":\"{0}\"}}",e.Receipt);
Post.AddField("Receipt",josnstring);
Debug.Log("服务器Jonstring"+josnstring);
string str = "http://"网站地址"/VerifyReceipt_SandBox.aspx";
WWW SendCheck = new WWW(str,Post);
Debug.Log(str);
yield return SendCheck;
if(SendCheck == null
|| SendCheck.error != null)
{
Debug.Log("效验失败");
#if SANDOBX_TEST
logstring += "效验错误:" + SendCheck.error + "\n";
#endif
if(BuyFailed != null)
{
BuyFailed(e.PurchasedItem.Id,Unibiller.GetPurchaseCount(e.PurchasedItem),-1);
}
yield break;
}
Debug.Log("从服务器获得的ScndCheck"+SendCheck.text);
Dictionary SendCheckDir = (Dictionary)Unibill.Impl.MiniJSON.jsonDecode(SendCheck.text);//SendCheck.text.dictionaryFromJson();//.dictionaryFromJson
Debug.Log(SendCheckDir["status"].ToString());
if(SendCheckDir == null)
{
Debug.Log("SendCheckDir "+SendCheckDir);
}
else if(SendCheckDir["status"].ToString().CompareTo("0") == 0)
{
#if SANDOBX_TEST
logstring += "效验成功\n";
#endif
// TalkingDataManager.PaySuccess(ISuccess.transactionIdentifier);
if(BuySuccess != null)
{
BuySuccess(e.PurchasedItem.Id,Unibiller.GetPurchaseCount(e.PurchasedItem));
}
}
else
{
#if SANDOBX_TEST
logstring += "效验失败\n";
#endif
if(BuyFailed != null)
{
BuyFailed(e.PurchasedItem.Id,Unibiller.GetPurchaseCount(e.PurchasedItem),(int)SendCheckDir["status"]);
}
}
}