[Unity]内购插件Unibill

因为工作需要,最近一直在研究Unibill这个插件,分享一个研究成果。

苹果内购流程就不详细述说了,如果有需要的童鞋可以去看看点击打开链接,里面讲的很详细,这里就不细说了。

[Unity]内购插件Unibill_第1张图片

物品的信息可能通过上图手动添加,也可动态添加,需要注意的是物品Id必顺和iTunes申请的一致,否则会导致购买失败

[Unity]内购插件Unibill_第2张图片

从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 onPurchaseRefunded;退款,用户购买物品介绍和实际购买金额不符造成的损失

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"]);
			}
		}
	}
 

你可能感兴趣的:(unity经验分享)