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:
BY
16 Apr 2025
Tizen Studio
BY
04 Nov 2024
Tizen Studio
BY
02 Apr 2024
Tizen Studio