I’m testing the Unity Tizen IAP plugin, but I’m encountring a problem, after doing any request (GetAvailableItems, GetCountries… ) the app hangs on “Waiting for Plugin Callback” and the callBackHandler never called!
To reproduce the issue, create a new project using the latest Unity version, import the Tizen IAP plugin from Asset Store, open the TizenSampleAppScene in the examples folder , build it and run it in your Tizen device.
There is someone that can help me to make Unity Tizen IAP working?
Thanks
The source code of the scene:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System.Collections.Generic;
using Tizen.IAP;
public class SampleClass
{
public int Value { get; set;}
public SampleClass(int x)
{
Value = x;
}
}
public class TizenSampleApp : MonoBehaviour {
string userMCC = null;
string userMNC = null;
string userGrpId = null;
string userItemTypeCd = null;
string userBuyItemName = null;
public SampleClass userData = null;
//IAP object initialization
StoreProvider storeObj = StoreProvider.Instance;
IAP_AppRequest appReq = new IAP_AppRequest ();
void Start () {
//valid data
appReq.Mode = "1";
appReq.StartNumber = 1;
appReq.EndNumber = 200;
appReq.StartDate = "2014-01-01";
appReq.EndDate = "2020-12-31";
appReq.ItemId = "000000581522";
appReq.ItemName = "item1";
appReq.ItemGroupId = "100000070614";
appReq.LanguageCd = "ENG";
appReq.ItemTypeCd = "10";
appReq.Mcc = "404";
appReq.Mnc = "01";
//calbackHandler
appReq.RequestCallbackHandler = callBackHandler;
userData = new SampleClass (12);
appReq.RequestCallbackUserData = userData;
}
void Update (){
}
//for debug
public void printAllDetails(string a, string b , string c,string d)
{
//for Logs only
Debug.Log ("[UnityAppLOG]" + a);
Debug.Log ("[UnityAppLOG]" + b);
Debug.Log ("[UnityAppLOG]" + c);
Debug.Log ("[UnityAppLOG]" + d);
}
//for debug
void LogCheck(string log){
Debug.Log(log);
}
//CallBackHandler Definition
public void callBackHandler(IAP_AppResponse response)
{
Debug.Log ("[ENTER CALLBACK ........... UNITY APP");
if(response.ErrorCode == ErrorType.ERROR_ALL_SUCCESS)
{
if (response.RequestCode == RequestType.FUNC_GET_COUNTRY_LIST) {
List<IAP_Country> countries = response.Countries;
int i;
for (i=0; i<countries.Count; i++) {
Debug.LogError ("[UnityAppLOG]" + countries [i].Name);
Debug.LogError ("[UnityAppLOG]" + countries [i].Mcc);
}
}
if (response.RequestCode == RequestType.FUNC_GET_ITEM_LIST) {
List<IAP_Item> AvailableItems = response.AvailableItems;
int i;
for(i = 0; i < AvailableItems.Count ; i++){
Debug.LogError("[UnityAppLOG]" + AvailableItems [i].ItemName);
}
}
if (response.RequestCode == RequestType.FUNC_GET_PURCHASED_ITEM_LIST) {
List<IAP_Item> PurchasedItems = response.PurchasedItems;
int i;
for (i = 0; i < PurchasedItems.Count ; i++){
Debug.LogError("[UnityAppLOG]" + PurchasedItems [i].ItemName);
}
}
if (response.RequestCode == RequestType.FUNC_PURCHASE) {
IAP_Purchase PurchaseOrder = response.PurchaseOrder;
Debug.LogError("[UnityAppLOG]" + "Purchased Item is "+PurchaseOrder.ItemName);
}
if (response.RequestCode == RequestType.FUNC_NONE) {
Debug.LogError("[UnityAppLOG]" + "No Request type came in Callback ");
}
SampleClass receivedData = (SampleClass) response.UserData;
Debug.LogError("User Data Value : " + receivedData.Value);
}
else if (response.ErrorCode == ErrorType.ERROR_ALLOC_FAIL){
Debug.Log("[UnityAppLOG]" + "Alloc Failed \n");
}
else if (response.ErrorCode == ErrorType.ERROR_APP_CONTROL_ERROR){
Debug.Log ("[UnityAppLOG]" + "APP CONTROL ERROR\n");
}
else if (response.ErrorCode == ErrorType.ERROR_RESULT_FAIL ){
Debug.Log ("[UnityAppLOG]" + "Result Failed \n");
}
else if (response.ErrorCode == ErrorType.ERROR_RESULT_CANCELLED){
Debug.Log ("[UnityAppLOG]" + " Result cancelled\n");
}
else if (response.ErrorCode == ErrorType.ERROR_INVALID_INPUT_FPTR ){
Debug.Log ("[UnityAppLOG]" + " Invalid Input Fptr\n");
}
else if (response.ErrorCode == ErrorType.ERROR_INVALID_INPUT_PARAM){
Debug.Log ("[UnityAppLOG]" + " Invalid Input Param \n");
}
else if (response.ErrorCode == ErrorType.ERROR_INVALID_ITEM_GRP_ID){
Debug.Log ("[UnityAppLOG]" + " Invalid Item Group ID\n");
}
else if (response.ErrorCode == ErrorType.ERROR_INVALID_ITEM_ID){
Debug.Log ("[UnityAppLOG]" + " Invalid Item Id \n");
}
else if (response.ErrorCode == ErrorType.ERROR_INVALID_TRANSACTION_ID){
Debug.Log ("[UnityAppLOG]" + " Invalid Transaction Id\n");
}
else if (response.ErrorCode == ErrorType.ERROR_INVALID_ITEM_TYPE_ID){
Debug.Log ("[UnityAppLOG]" + " Invalid Item Type \n");
}
else if (response.ErrorCode == ErrorType.ERROR_INVALID_PARAM_MCC ){
Debug.Log ("[UnityAppLOG]" + " Invalid Mcc Param\n");
}
else if (response.ErrorCode == ErrorType.ERROR_INVALID_PARAM_MNC){
Debug.Log ("[UnityAppLOG]" + " Invalid Param Mnc\n");
}
else if (response.ErrorCode == ErrorType.ERROR_UNKNOWN_ERROR ){
Debug.Log ("[UnityAppLOG]" + " Unknown Error \n");
}
}
public void reEnableButton(Button button){
button.interactable = true;
}
IEnumerator MyMethod(Button button) {
Debug.Log("[UnityAppLOG]" + "Before Waiting 10 seconds");
yield return new WaitForSeconds(10);
Debug.Log("[UnityAppLOG]" + "After Waiting 10 Seconds");
Debug.Log ("[UnityAppLOG]" + "ReEnabling Button\n");
reEnableButton (button);
}
public void getMcclist(Button button){
//calling IAP GET Countries API
storeObj.GetCountries(appReq);
Debug.Log ("[UnityAppLOG]" + "Disabling button\n");
button.interactable = false;
Debug.Log ("[UnityAppLOG]" + "Fetching Mcc list\n");
StartCoroutine(MyMethod(button));
}
public void getMnclist(Button button){
//automatically filled
Debug.Log ("[UnityAppLOG]" + "Disabling button\n");
button.interactable = false;
Debug.Log ("[UnityAppLOG]" + "Fetching Mnc list\n");
GameObject.Find ("MNC").GetComponent<InputField> ().placeholder.GetComponent<Text>().text = "01";
StartCoroutine(MyMethod(button));
}
public void userMccInput(Text text){
Debug.Log ("User Input Data Being Fetched \n");
userMCC = text.text;
if(!string.IsNullOrEmpty(userMCC)){
LogCheck(userMCC);
}
}
public void userMncInput(Text text){
Debug.Log ("User Input Data Being Fetched \n");
userMNC = text.text;
LogCheck(userMNC);
}
public void userGrpIdInput(Text text){
Debug.Log ("User Input Data Being Fetched \n");
userGrpId = text.text;
LogCheck(userGrpId);
}
public void userItemTypeCode(Text text){
Debug.Log ("User Input Data Being Fetched \n");
userItemTypeCd = text.text;
LogCheck(userItemTypeCd);
}
public void userBuyItemNameInput(Text text){
Debug.Log ("User Input Data Being Fetched \n");
userBuyItemName = text.text;
LogCheck(userBuyItemName);
}
public void getItemList(Button button)
{
Debug.Log ("[UnityAppLOG]" + "Get Item List Button Pressed\n");
Debug.Log ("[UnityAppLOG]" + "Disabling button\n");
button.interactable = false;
StartCoroutine(MyMethod(button));
GameObject.Find ("Buy").GetComponent<Button> ().interactable = true;
//setting user input values
if(!string.IsNullOrEmpty(userMCC)){
appReq.Mcc = userMCC;
}
else{
GameObject.Find ("MCC").GetComponent<InputField> ().placeholder.GetComponent<Text>().text = appReq.Mcc;
}
if(!string.IsNullOrEmpty(userMNC)){
appReq.Mnc = userMNC;
}
else{
GameObject.Find ("MNC").GetComponent<InputField> ().placeholder.GetComponent<Text>().text = appReq.Mnc;
}
if(!string.IsNullOrEmpty(userGrpId)){
appReq.ItemGroupId = userGrpId;
}
else{
GameObject.Find ("GrpIdInput").GetComponent<InputField> ().placeholder.GetComponent<Text>().text = appReq.ItemGroupId;
}
if(!string.IsNullOrEmpty(userItemTypeCd)){
appReq.ItemTypeCd = userItemTypeCd;
}
else{
GameObject.Find ("ItemTypeCode").GetComponent<InputField> ().placeholder.GetComponent<Text>().text = appReq.ItemTypeCd;
}
//calling IAP Get Item List API
storeObj.GetAvailableItems(appReq);
//for debugging
//printAllDetails (userMCC, userMNC, userGrpId, userItemTypeCd);
printAllDetails (appReq.Mcc,appReq.Mnc , appReq.ItemGroupId, appReq.ItemTypeCd);
}
public void getPurchasedList(Button button){
//Calling IAP Get Purchase List API
storeObj.GetPurchasedItems(appReq);
button.interactable = false;
StartCoroutine(MyMethod(button));
GameObject.Find ("Buy").GetComponent<Button> ().interactable = true;
}
public void doBuying(Button button){
if(!string.IsNullOrEmpty(userBuyItemName)){
appReq.ItemName = userBuyItemName;
}
else{
GameObject.Find ("BuyItem").GetComponent<InputField> ().placeholder.GetComponent<Text>().text = appReq.ItemName;
}
//Calling IAP Purchase API
storeObj.PurchaseItem (appReq);
button.interactable = false;
StartCoroutine(MyMethod(button));
}
}
Unity&IAP
Hello,
I’m testing the Unity Tizen IAP plugin, but I’m encountring a problem, after doing any request (GetAvailableItems, GetCountries… ) the app hangs on “Waiting for Plugin Callback” and the callBackHandler never called!
To reproduce the issue, create a new project using the latest Unity version, import the Tizen IAP plugin from Asset Store, open the TizenSampleAppScene in the examples folder , build it and run it in your Tizen device.
There is someone that can help me to make Unity Tizen IAP working?
Thanks
The source code of the scene:
using UnityEngine; using System.Collections; using UnityEngine.UI; using System.Collections.Generic; using Tizen.IAP; public class SampleClass { public int Value { get; set;} public SampleClass(int x) { Value = x; } } public class TizenSampleApp : MonoBehaviour { string userMCC = null; string userMNC = null; string userGrpId = null; string userItemTypeCd = null; string userBuyItemName = null; public SampleClass userData = null; //IAP object initialization StoreProvider storeObj = StoreProvider.Instance; IAP_AppRequest appReq = new IAP_AppRequest (); void Start () { //valid data appReq.Mode = "1"; appReq.StartNumber = 1; appReq.EndNumber = 200; appReq.StartDate = "2014-01-01"; appReq.EndDate = "2020-12-31"; appReq.ItemId = "000000581522"; appReq.ItemName = "item1"; appReq.ItemGroupId = "100000070614"; appReq.LanguageCd = "ENG"; appReq.ItemTypeCd = "10"; appReq.Mcc = "404"; appReq.Mnc = "01"; //calbackHandler appReq.RequestCallbackHandler = callBackHandler; userData = new SampleClass (12); appReq.RequestCallbackUserData = userData; } void Update (){ } //for debug public void printAllDetails(string a, string b , string c,string d) { //for Logs only Debug.Log ("[UnityAppLOG]" + a); Debug.Log ("[UnityAppLOG]" + b); Debug.Log ("[UnityAppLOG]" + c); Debug.Log ("[UnityAppLOG]" + d); } //for debug void LogCheck(string log){ Debug.Log(log); } //CallBackHandler Definition public void callBackHandler(IAP_AppResponse response) { Debug.Log ("[ENTER CALLBACK ........... UNITY APP"); if(response.ErrorCode == ErrorType.ERROR_ALL_SUCCESS) { if (response.RequestCode == RequestType.FUNC_GET_COUNTRY_LIST) { List<IAP_Country> countries = response.Countries; int i; for (i=0; i<countries.Count; i++) { Debug.LogError ("[UnityAppLOG]" + countries [i].Name); Debug.LogError ("[UnityAppLOG]" + countries [i].Mcc); } } if (response.RequestCode == RequestType.FUNC_GET_ITEM_LIST) { List<IAP_Item> AvailableItems = response.AvailableItems; int i; for(i = 0; i < AvailableItems.Count ; i++){ Debug.LogError("[UnityAppLOG]" + AvailableItems [i].ItemName); } } if (response.RequestCode == RequestType.FUNC_GET_PURCHASED_ITEM_LIST) { List<IAP_Item> PurchasedItems = response.PurchasedItems; int i; for (i = 0; i < PurchasedItems.Count ; i++){ Debug.LogError("[UnityAppLOG]" + PurchasedItems [i].ItemName); } } if (response.RequestCode == RequestType.FUNC_PURCHASE) { IAP_Purchase PurchaseOrder = response.PurchaseOrder; Debug.LogError("[UnityAppLOG]" + "Purchased Item is "+PurchaseOrder.ItemName); } if (response.RequestCode == RequestType.FUNC_NONE) { Debug.LogError("[UnityAppLOG]" + "No Request type came in Callback "); } SampleClass receivedData = (SampleClass) response.UserData; Debug.LogError("User Data Value : " + receivedData.Value); } else if (response.ErrorCode == ErrorType.ERROR_ALLOC_FAIL){ Debug.Log("[UnityAppLOG]" + "Alloc Failed \n"); } else if (response.ErrorCode == ErrorType.ERROR_APP_CONTROL_ERROR){ Debug.Log ("[UnityAppLOG]" + "APP CONTROL ERROR\n"); } else if (response.ErrorCode == ErrorType.ERROR_RESULT_FAIL ){ Debug.Log ("[UnityAppLOG]" + "Result Failed \n"); } else if (response.ErrorCode == ErrorType.ERROR_RESULT_CANCELLED){ Debug.Log ("[UnityAppLOG]" + " Result cancelled\n"); } else if (response.ErrorCode == ErrorType.ERROR_INVALID_INPUT_FPTR ){ Debug.Log ("[UnityAppLOG]" + " Invalid Input Fptr\n"); } else if (response.ErrorCode == ErrorType.ERROR_INVALID_INPUT_PARAM){ Debug.Log ("[UnityAppLOG]" + " Invalid Input Param \n"); } else if (response.ErrorCode == ErrorType.ERROR_INVALID_ITEM_GRP_ID){ Debug.Log ("[UnityAppLOG]" + " Invalid Item Group ID\n"); } else if (response.ErrorCode == ErrorType.ERROR_INVALID_ITEM_ID){ Debug.Log ("[UnityAppLOG]" + " Invalid Item Id \n"); } else if (response.ErrorCode == ErrorType.ERROR_INVALID_TRANSACTION_ID){ Debug.Log ("[UnityAppLOG]" + " Invalid Transaction Id\n"); } else if (response.ErrorCode == ErrorType.ERROR_INVALID_ITEM_TYPE_ID){ Debug.Log ("[UnityAppLOG]" + " Invalid Item Type \n"); } else if (response.ErrorCode == ErrorType.ERROR_INVALID_PARAM_MCC ){ Debug.Log ("[UnityAppLOG]" + " Invalid Mcc Param\n"); } else if (response.ErrorCode == ErrorType.ERROR_INVALID_PARAM_MNC){ Debug.Log ("[UnityAppLOG]" + " Invalid Param Mnc\n"); } else if (response.ErrorCode == ErrorType.ERROR_UNKNOWN_ERROR ){ Debug.Log ("[UnityAppLOG]" + " Unknown Error \n"); } } public void reEnableButton(Button button){ button.interactable = true; } IEnumerator MyMethod(Button button) { Debug.Log("[UnityAppLOG]" + "Before Waiting 10 seconds"); yield return new WaitForSeconds(10); Debug.Log("[UnityAppLOG]" + "After Waiting 10 Seconds"); Debug.Log ("[UnityAppLOG]" + "ReEnabling Button\n"); reEnableButton (button); } public void getMcclist(Button button){ //calling IAP GET Countries API storeObj.GetCountries(appReq); Debug.Log ("[UnityAppLOG]" + "Disabling button\n"); button.interactable = false; Debug.Log ("[UnityAppLOG]" + "Fetching Mcc list\n"); StartCoroutine(MyMethod(button)); } public void getMnclist(Button button){ //automatically filled Debug.Log ("[UnityAppLOG]" + "Disabling button\n"); button.interactable = false; Debug.Log ("[UnityAppLOG]" + "Fetching Mnc list\n"); GameObject.Find ("MNC").GetComponent<InputField> ().placeholder.GetComponent<Text>().text = "01"; StartCoroutine(MyMethod(button)); } public void userMccInput(Text text){ Debug.Log ("User Input Data Being Fetched \n"); userMCC = text.text; if(!string.IsNullOrEmpty(userMCC)){ LogCheck(userMCC); } } public void userMncInput(Text text){ Debug.Log ("User Input Data Being Fetched \n"); userMNC = text.text; LogCheck(userMNC); } public void userGrpIdInput(Text text){ Debug.Log ("User Input Data Being Fetched \n"); userGrpId = text.text; LogCheck(userGrpId); } public void userItemTypeCode(Text text){ Debug.Log ("User Input Data Being Fetched \n"); userItemTypeCd = text.text; LogCheck(userItemTypeCd); } public void userBuyItemNameInput(Text text){ Debug.Log ("User Input Data Being Fetched \n"); userBuyItemName = text.text; LogCheck(userBuyItemName); } public void getItemList(Button button) { Debug.Log ("[UnityAppLOG]" + "Get Item List Button Pressed\n"); Debug.Log ("[UnityAppLOG]" + "Disabling button\n"); button.interactable = false; StartCoroutine(MyMethod(button)); GameObject.Find ("Buy").GetComponent<Button> ().interactable = true; //setting user input values if(!string.IsNullOrEmpty(userMCC)){ appReq.Mcc = userMCC; } else{ GameObject.Find ("MCC").GetComponent<InputField> ().placeholder.GetComponent<Text>().text = appReq.Mcc; } if(!string.IsNullOrEmpty(userMNC)){ appReq.Mnc = userMNC; } else{ GameObject.Find ("MNC").GetComponent<InputField> ().placeholder.GetComponent<Text>().text = appReq.Mnc; } if(!string.IsNullOrEmpty(userGrpId)){ appReq.ItemGroupId = userGrpId; } else{ GameObject.Find ("GrpIdInput").GetComponent<InputField> ().placeholder.GetComponent<Text>().text = appReq.ItemGroupId; } if(!string.IsNullOrEmpty(userItemTypeCd)){ appReq.ItemTypeCd = userItemTypeCd; } else{ GameObject.Find ("ItemTypeCode").GetComponent<InputField> ().placeholder.GetComponent<Text>().text = appReq.ItemTypeCd; } //calling IAP Get Item List API storeObj.GetAvailableItems(appReq); //for debugging //printAllDetails (userMCC, userMNC, userGrpId, userItemTypeCd); printAllDetails (appReq.Mcc,appReq.Mnc , appReq.ItemGroupId, appReq.ItemTypeCd); } public void getPurchasedList(Button button){ //Calling IAP Get Purchase List API storeObj.GetPurchasedItems(appReq); button.interactable = false; StartCoroutine(MyMethod(button)); GameObject.Find ("Buy").GetComponent<Button> ().interactable = true; } public void doBuying(Button button){ if(!string.IsNullOrEmpty(userBuyItemName)){ appReq.ItemName = userBuyItemName; } else{ GameObject.Find ("BuyItem").GetComponent<InputField> ().placeholder.GetComponent<Text>().text = appReq.ItemName; } //Calling IAP Purchase API storeObj.PurchaseItem (appReq); button.interactable = false; StartCoroutine(MyMethod(button)); } }BY
16 Apr 2025
Tizen Studio
BY
04 Nov 2024
Tizen Studio
BY
02 Apr 2024
Tizen Studio