IAP Game Unity Developer Guide - ONE-store/inapp-sdk GitHub Wiki

< ์ฐธ๊ณ  >

๋ณธ ๋ฌธ์„œ๋Š” ์›์Šคํ† ์–ด ์ธ์•ฑ SDK v16(API v4)์— ๋Œ€ํ•œ ๊ฐ€์ด๋“œ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค. ์ตœ์‹  ์›์Šคํ† ์–ด ์ธ์•ฑ SDK v17(API v5)์— ๋Œ€ํ•œ ๊ฐ€์ด๋“œ ๋ฌธ์„œ๋Š” ์›์Šคํ† ์–ด ๊ฐœ๋ฐœ์ž์„ผํ„ฐ์—์„œ ์ œ๊ณต๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ์‹  ์ธ์•ฑ SDK v17 ๊ฐ€์ด๋“œ ๋ฌธ์„œ ๋งํฌ : https://dev.onestore.co.kr/devpoc/reference/view/IAP_v17


ํ•ด๋‹น ๋‚ด์šฉ์€ Unity3D ํ™˜๊ฒฝ์˜ ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ์—์„œ IAP SDK ์ ์šฉ์„ ๋•๊ธฐ ์œ„ํ•œ ์„ค๋ช…์„œ์ด๋‹ค.

Unity ๊ด€๋ จ ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(unity_adaptor)์™€ ํ…Œ์ŠคํŠธ์•ฑ์€ ๋‹ค์šด๋กœ๋“œ ํŽ˜์ด์ง€์—์„œ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

Unity ๊ด€๋ จ ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ…Œ์ŠคํŠธ์•ฑ์€ ์†Œ์Šค์™€ ํ”„๋กœ์ ํŠธ๋„ ํ•จ๊ป˜ ์ œ๊ณตํ•˜๋ฉฐ, ํ•„์š”์— ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์‚ฌ์—์„œ ์ˆ˜์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

  • unity_adaptor : Unity์— IAP๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ”„๋กœ์ ํŠธ
  • unity_sample : unity_adaptor๋ฅผ ์ ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ Unity ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์ ํŠธ

Unity 3D์—์„œ ์ธ์•ฑ ๊ฒฐ์ œ ๋ชจ๋ธ

IAP SDK์™€์˜ ๊ด€๊ณ„

์ธ์•ฑ๊ฒฐ์ œ๋ฅผ ์œ„ํ•ด ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(iap_plugin)๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ฅผ Unity3D ๋ ˆ์ด์–ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก, ์ถ”๊ฐ€๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(unity_adaptor)๋ฅผ ๋งŒ๋“ค์—ˆ์œผ๋ฉฐ, ์ด๋Š” ์Šคํฌ๋ฆฝํŠธํŒŒ์ผ(IapSample.cs)์—์„œ ์ง์ ‘ ์‚ฌ์šฉํ•œ๋‹ค.

enter image description here


๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค๋ช…

์ œ๊ณตํŒŒ์ผ ์„ค๋ช… ๋น„๊ณ 
libs/iap_plugin_[๋ฒ„์ „]_[๋นŒ๋“œ๋‚ ์งœ].jar IAP ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
libs/unity_adaptor_[๋ฒ„์ „]_[๋นŒ๋“œ๋‚ ์งœ].jar Unity3D Adaptor ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
src/IapSample.cs ์š”์ฒญ๊ณผ ์ฝœ๋ฐฑ์ด ๊ตฌํ˜„๋œ ์˜ˆ์‹œ ํŒŒ์ผ
src/AndroidManifest.xml meta-data์™€ ๊ธฐ๋ณธ Activity๊ฐ€ ์„ ์–ธ๋œ ํŒŒ์ผ
src/Response.cs jsonํ˜•ํƒœ์˜ ๊ฒฐ๊ณผ๋ฅผ ํŒŒ์‹ฑํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ
src/Error.cs jsonํ˜•ํƒœ์˜ ๊ฒฐ๊ณผ๋ฅผ ํŒŒ์‹ฑํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ
src/Response.cs jsonํ˜•ํƒœ์˜ ๊ฒฐ๊ณผ๋ฅผ ํŒŒ์‹ฑํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ

์ธ์•ฑ๊ฒฐ์ œ ๊ตฌํ˜„

์•„๋ž˜์˜ ์„ค๋ช…์€ _unity_sample_ํ”„๋กœ์ ํŠธ์™€ _IapSample.cs_๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ•œ๋‹ค.

Unity3Dํ”„๋กœ์ ํŠธ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€

AndroidManifest.xml๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ /Assets/Plugins/Android ์— ์œ„์น˜์‹œํ‚จ๋‹ค

enter image description here

์ดˆ๊ธฐํ™”

	//-----------------
	// Initialize
	//-----------------
	unityPlayerClass = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
	currentActivity = unityPlayerClass.GetStatic<AndroidJavaObject> ("currentActivity");

	if (currentActivity != null) {
		// RequestAdapter๋ฅผ ์ดˆ๊ธฐํ™”
		// ---------------------------------
		// ํ•จ์ˆ˜ parameter ์ •๋ฆฌ
		// ---------------------------------
		// (1) ์ฝœ๋ฐฑ์„ ๋ฐ›์„ ํด๋ž˜์Šค ์ด๋ฆ„
		// (2) Activity Context
		// (3) debug ์—ฌ๋ถ€
		iapRequestAdapter = new AndroidJavaObject("com.onestore.iap.unity.RequestAdapter", "IapSample", currentActivity, false); //Release
		//iapRequestAdapter = new AndroidJavaObject("com.onestore.iap.unity.RequestAdapter", "IapSample", currentActivity, true); //Debug
	}

์ฟผ๋ฆฌ(Command)์ฒ˜๋ฆฌ

_iapRequestAdapter_๋ฅผ ์ด์šฉํ•˜์—ฌ ์š”์ฒญ์„ ํ•˜๋ฉฐ, ์ฝœ๋ฐฑ์€ ๊ณตํ†ต์œผ๋กœ ๋ฐ›๋Š”๋‹ค.

	//------------------------------------------------
	//
	// Command - Request
	//
	//------------------------------------------------
	public void RequestPurchaseHistory() 
	{
		// ---------------------------------
		// ํ•จ์ˆ˜ parameter ์ •๋ฆฌ
		// ---------------------------------
		// (0) ๋ฉ”์†Œ๋“œ์ด๋ฆ„ : ๊ตฌ๋งค๋‚ด์—ญ ์กฐํšŒ
		// ---------------------------------
		// (1) ํ•„์š”์‹œ์—๋Š” UI ๋…ธ์ถœ
		// (2) appId
		// (3) productIds
		// ----------------------------------
		string[] productIds = {"0910024112"};
		iapRequestAdapter.Call ("requestPurchaseHistory", false, "OA00679020", productIds);
		//iapRequestAdapter.Call ("requestPurchaseHistory", true, "OA00679020", productIds); // UI๋…ธ์ถœ ์—†์ด Background๋กœ๋งŒ ์ง„ํ–‰
	}

	public void RequestProductInfo() 
	{
		// ---------------------------------
		// ํ•จ์ˆ˜ parameter ์ •๋ฆฌ
		// ---------------------------------
		// (0) ๋ฉ”์†Œ๋“œ์ด๋ฆ„ : ์ƒํ’ˆ์ •๋ณด ์กฐํšŒ
		// ---------------------------------
		// (1) ํ•„์š”์‹œ์—๋Š” UI ๋…ธ์ถœ
		// (2) appId
		// ----------------------------------
		iapRequestAdapter.Call ("requestProductInfo", false, "OA00679020");
		//iapRequestAdapter.Call ("requestProductInfo", true, "OA00679020"); // UI๋…ธ์ถœ ์—†์ด Background๋กœ๋งŒ ์ง„ํ–‰
	}

	public void RequestCheckPurchasability() 
	{
		// ---------------------------------
		// ํ•จ์ˆ˜ parameter ์ •๋ฆฌ
		// ---------------------------------
		// (0) ๋ฉ”์†Œ๋“œ์ด๋ฆ„ : ๊ตฌ๋งค๊ฐ€๋Šฅ์—ฌ๋ถ€ ์กฐํšŒ
		// ---------------------------------
		// (1) ํ•„์š”์‹œ์—๋Š” UI ๋…ธ์ถœ
		// (2) appId
		// (3) productIds
		// ----------------------------------
		string[] productIds = {"0910024112"};
		iapRequestAdapter.Call ("requestCheckPurchasability", false, "OA00679020", productIds);
		//iapRequestAdapter.Call ("requestCheckPurchasability", true, "OA00679020", productIds); // UI๋…ธ์ถœ ์—†์ด Background๋กœ๋งŒ ์ง„ํ–‰
	}

	public void RequestSubtractPoints() 
	{
		// ---------------------------------
		// ํ•จ์ˆ˜ parameter ์ •๋ฆฌ
		// ---------------------------------
		// (0) ๋ฉ”์†Œ๋“œ์ด๋ฆ„ : ์ƒํ’ˆ ์†์„ฑ๋ณ€๊ฒฝ ์š”์ฒญ 
		// ---------------------------------
		// (1) ํ•„์š”์‹œ์—๋Š” UI ๋…ธ์ถœ
		// (2) action(์•„์ดํ…œ์ฐจ๊ฐ)
		// (3) appId
		// (4) productIds
		// ----------------------------------
		string[] productIds = {"0910024112"};
		iapRequestAdapter.Call ("requestChangeProductProperties", false, "subtract_points", "OA00679020", productIds);
		//iapRequestAdapter.Call ("requestChangeProductProperties", true, "subtract_points", "OA00679020", productIds); // UI๋…ธ์ถœ ์—†์ด Background๋กœ๋งŒ ์ง„ํ–‰
	}

	public void RequestCancelSubscription() 
	{
		// ---------------------------------
		// ํ•จ์ˆ˜ parameter ์ •๋ฆฌ
		// ---------------------------------
		// (0) ๋ฉ”์†Œ๋“œ์ด๋ฆ„ : ์ƒํ’ˆ ์†์„ฑ๋ณ€๊ฒฝ ์š”์ฒญ 
		// ---------------------------------
		// (1) ํ•„์š”์‹œ์—๋Š” UI ๋…ธ์ถœ
		// (2) action(์ž๋™๊ฒฐ์ œ ์ทจ์†Œ)
		// (3) appId
		// (4) productIds
		// ----------------------------------
		string[] productIds = {"0910042744"};
		iapRequestAdapter.Call ("requestChangeProductProperties", false, "cancel_subscription", "OA00697454", productIds);
		//iapRequestAdapter.Call ("requestChangeProductProperties", true, "cancel_subscription", "OA00697454", productIds); // UI๋…ธ์ถœ ์—†์ด Background๋กœ๋งŒ ์ง„ํ–‰
	}


	//------------------------------------------------
	//
	// Command - Callback
	//
	//------------------------------------------------
	public void CommandResponse(string response) 
	{
		Debug.Log ("[UNITY] CommandResponse >>> " + response);
		// Parsing Json string to "Reponse" class
		Response data = JsonUtility.FromJson<Response> (response);
	}

	public void CommandError(string message) 
	{
		Debug.Log ("[UNITY] CommandError >>> " + message);
		// Parsing Json string to "Error" class
		Error data = JsonUtility.FromJson<Error> (message);
	}

๊ฒฐ์ œ(Payment)์ฒ˜๋ฆฌ

	//------------------------------------------------
	//
	// Payment - Request
	//
	//------------------------------------------------
	public void RequestPaymenet()
	{
		// ---------------------------------
		// ํ•จ์ˆ˜ parameter ์ •๋ฆฌ
		// ---------------------------------
		// (0) ๋ฉ”์†Œ๋“œ์ด๋ฆ„ : ๊ตฌ๋งค์š”์ฒญ
		// ---------------------------------
		// (1) appId
		// (2) productId
		// (3) proudtName
		// (4) tId
		// (5) bpInfo
                // (6) gameuserId  ํ”„๋กœ๋ชจ์…˜ ์ค‘๋ณต ์ฐธ์—ฌ ๋ฐฉ์ง€ ๊ธฐ๋Šฅ (16.04 ์ถ”๊ฐ€)์‚ฌ์šฉ์‹œ ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ๋ถ€๋ถ„ ์‚ฌ์šฉ
                // (7) promotionApplicable ํ”„๋กœ๋ชจ์…˜ ์ค‘๋ณต ์ฐธ์—ฌ ๋ฐฉ์ง€ ๊ธฐ๋Šฅ (16.04 ์ถ”๊ฐ€)์‚ฌ์šฉ์‹œ ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ๋ถ€๋ถ„ ์‚ฌ์šฉ
		// ----------------------------------
		iapRequestAdapter.Call ("requestPayment", "OA00679020", "0910024112", "UNITY๊ฒฐ์ œ", "TID_0123", "BPINFO_0123");
          //iapRequestAdapter.Call ("requestPayment", "OA00679020", "0910024112", "UNITY๊ฒฐ์ œ", "TID_0123"     ,"BPINFO_0123", "", false);
	}


	//------------------------------------------------
	//
	// Payment - Callback
	//
	//------------------------------------------------
	public void PaymentResponse(string response) 
	{
		Debug.Log ("[UNITY] PaymentResponse >>> " + response);
		// Parsing Json string to "Reponse" class
		Response data = JsonUtility.FromJson<Response> (response);
		// Try ReceiptVerification
		iapRequestAdapter.Call ("verifyReceipt", "OA00679020", data.result.txid, data.result.receipt);
	}

	public void PaymentError(string message) 
	{
		Debug.Log ("[UNITY] PaymentError >>> " + message);
		// Parsing Json string to "Error" class
		Error data = JsonUtility.FromJson<Error> (message);
	}

์ „์ž์˜์ˆ˜์ฆ๊ฒ€์ฆ ์ฒ˜๋ฆฌ

	//------------------------------------------------
	//
	// ์ „์ž์˜์ˆ˜์ฆ๊ฒ€์ฆ - Request
	//
	//------------------------------------------------
	public void VerifyReceipt() 
	{
		// ---------------------------------
		// ํ•จ์ˆ˜ parameter ์ •๋ฆฌ
		// ---------------------------------
		// (0) ๋ฉ”์†Œ๋“œ์ด๋ฆ„ : ๊ตฌ๋งค์š”์ฒญ
		// ---------------------------------
		// (1) appId
		// (2) txId
		// (3) signData
		// ----------------------------------
		iapRequestAdapter.Call ("verifyReceipt", appId, txId, signData);
	}


	//------------------------------------------------
	//
	// ์ „์ž์˜์ˆ˜์ฆ๊ฒ€์ฆ - Callback
	//
	//------------------------------------------------
	public void ReceiptVerificationResponse(string result) 
	{
		Debug.Log ("[UNITY] ReceiptVerificationResponse >>> " + result);
		// Parsing Json string to "VerifyReceipt" class
		VerifyReceipt data = JsonUtility.FromJson<VerifyReceipt> (result);
	}

	public void ReceiptVerificationError(string message) 
	{
		Debug.Log ("[UNITY] ReceiptVerificationError >>> " + message);
		// Parsing Json string to "Error" class
		Error data = JsonUtility.FromJson<Error> (message);
	}

์ข…๋ฃŒ์ฒ˜๋ฆฌ

iapRequestAdapter.Call ("exit");

์ „๋‹ฌ๋˜๋Š” ๊ฒฐ๊ณผ์˜ ํŒŒ์‹ฑ

Unity๋ ˆ์ด์–ด๋กœ ์ „๋‹ฌ๋˜๋Š” ๋ชจ๋“  ๊ฒฐ๊ณผ๋Š” json ํ˜•ํƒœ์˜ string์œผ๋กœ ์ „๋‹ฌ ๋œ๋‹ค.

๋˜ํ•œ, ๊ฒฐ๊ณผ์˜ ํŒŒ์‹ฑ์„ ๋•๊ธฐ ์œ„ํ•ด, ํŒŒ์‹ฑ ๊ฒฐ๊ณผ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๋„ C#ํŒŒ์ผ๋กœ ์ œ๊ณตํ•œ๋‹ค.

  • Response.cs : ์š”์ฒญ(์ฟผ๋ฆฌ, ๊ฒฐ์ œ)๊ฒฐ๊ณผ๋ฅผ ํŒŒ์‹ฑํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์„ ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค
  • VerifyReceipt.cs : ์ „์ž์˜์ˆ˜์ฆ ๊ฒ€์ฆ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์„ ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค
  • Error.cs : ์—๋Ÿฌ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์„ ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค

unity_sample ์—์„œ ํŒŒ์‹ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Unity ๋ฒ„์ „5์ด์ƒ์—์„œ ์ œ๊ณตํ•˜๋Š” JsonUtility ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ดํ•˜ ๋ฒ„์ „์˜ ๊ฒฝ์šฐ, ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ Json Parser ๋ฅผ ์ด์šฉํ•˜์—ฌ ํŒŒ์‹ฑ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

Response ์˜ˆ์‹œ (๊ฒฐ์ œ)

์„ฑ๊ณต ๊ฒฐ๊ณผ์˜ ๊ฒฝ์šฐ, ์ธ์•ฑSDK๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋˜๋Š” ๊ฒฐ๊ณผ์™€ ๋™์ผํ•˜๋ฉฐ, ์š”์ฒญ ๋ฐ ์‘๋‹ต ์˜ˆ์‹œ์„ ํ†ตํ•ด ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค.

{
	"api_version":"4",
	"identifier":"1477984099815",
	"method":"purchase",
	"result":
		{
			"code":"0000",
			"message":"์š”์ฒญ์ด ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.",
			"count":1,
			"txid":"TSTOREXXXX_..",
			"receipt":"......."
		}
}

Error ์˜ˆ์‹œ (๊ฒฐ์ œ)

์—๋Ÿฌ์˜ ๊ฒฝ์šฐ, ์•„๋ž˜์˜ ๊ฐ’์„ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, ์„ ํƒ์ ์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค.

  • requestId : ์š”์ฒญ์‹๋ณ„์ž
  • errorCode : ์š”์ฒญ์— ๋Œ€ํ•œ ์—๋Ÿฌ์ฝ”๋“œ
  • errorMessage : ์—๋Ÿฌ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ ๋ฉ”์‹œ์ง€

๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ, ์ „๋‹ฌ ๋˜์ง€ ์•Š๋Š” ๊ฐ’๋„ ์žˆ์œผ๋‹ˆ ์ฃผ์˜ํ•˜๋ผ.

{
	"requestId":"",
	"errorCode":"-1001",
	"errorMessage":"Service has not allowed."
}

์ˆ˜์ •์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ

๊ฐœ๋ฐœ์‚ฌ์˜ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ, unity_adaptor ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

์ด ๊ฒฝ์šฐ, ํ”„๋กœ์ ํŠธ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ, unity_adaptor ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ

โ”œโ”€โ”€ build.gradle
โ”œโ”€โ”€ gradle
โ”‚   โ””โ”€โ”€ wrapper
โ”‚       โ””โ”€โ”€ gradle-wrapper.jar
โ”œโ”€โ”€ gradlew
โ”œโ”€โ”€ gradlew.bat
โ”œโ”€โ”€ library
โ”‚   โ”œโ”€โ”€ build.gradle
โ”‚   โ”œโ”€โ”€ libs
โ”‚   โ”‚   โ”œโ”€โ”€ classes.jar
โ”‚   โ”‚   โ””โ”€โ”€ iap_plugin_[๋ฒ„์ „]_[๋นŒ๋“œ๋‚ ์งœ].jar
โ”‚   โ”œโ”€โ”€ proguard-rules.pro
โ”‚   โ””โ”€โ”€ src
โ”‚       โ””โ”€โ”€ main
โ”‚           โ”œโ”€โ”€ AndroidManifest.xml
โ”‚           โ”œโ”€โ”€ java
โ”‚           โ”‚   โ””โ”€โ”€ com
โ”‚           โ”‚       โ””โ”€โ”€ onestore
โ”‚           โ”‚           โ””โ”€โ”€ iap
โ”‚           โ”‚               โ””โ”€โ”€ unity
โ”‚           โ”‚                   โ”œโ”€โ”€ AbsCallbackAdapter.java
โ”‚           โ”‚                   โ”œโ”€โ”€ MainActivity.java
โ”‚           โ”‚                   โ”œโ”€โ”€ MessageMaker.java
โ”‚           โ”‚                   โ”œโ”€โ”€ ReceiptVerificationCallbackAdapter.java
โ”‚           โ”‚                   โ”œโ”€โ”€ RequestAdapter.java
โ”‚           โ”‚                   โ””โ”€โ”€ RequestCallbackAdapter.java
โ”‚           โ””โ”€โ”€ res
โ”‚               โ””โ”€โ”€ values
โ”‚                   โ””โ”€โ”€ strings.xml
โ””โ”€โ”€ settings.gradle

์ฃผ์š”ํŒŒ์ผ ์„ค๋ช…

ํŒŒ์ผ ์„ค๋ช… ๋น„๊ณ 
RequestCallbackAdapter.java Unity๋ ˆ์ด์–ด๋กœ ๋ถ€ํ„ฐ ์š”์ฒญ์„ ๋ฐ›๊ณ , ์ฝœ๋ฐฑ ๋ฉ”์„œ๋“œ ์ •์˜ํ•œ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋นŒ๋“œ ๋ฐฉ๋ฒ•

ํ”„๋กœ์ ํŠธ์—์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด, gradle ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

./gradlew buildUnityAdaptorJar

๊ฒฐ๊ณผ๋ฌผ์€ ์•„๋ž˜ ๊ฒฝ๋กœ์— ์žˆ๋‹ค.

unity_adaptor/library/build/outputs/aar/unity_adaptor_[๋ฒ„์ „]_[๋นŒ๋“œ๋‚ ์งœ].jar

โš ๏ธ **GitHub.com Fallback** โš ๏ธ