IAP 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


์‚ฌ์ „ ์ค€๋น„

SDK ๋‹ค์šด๋กœ๋“œ

์›์Šคํ† ์–ด์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ / ์†Œ์Šค์ฝ”๋“œ / ํ…Œ์ŠคํŠธ APK ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•œ๋‹ค.

๊ฐ€์ด๋“œ ๋ฌธ์„œ๋Š” ์›น์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋ณ„๋„์˜ ํŒŒ์ผ ๋ฐฐํฌ๋Š” ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ƒ˜ํ”Œ์ฝ”๋“œ๋Š” GitHub์— ๊ณต์œ  ๋˜๋ฉฐ, ๋ณ„๋„์˜ ๋ฐฐํฌ๋Š” ํ•˜์ง€ ์•Š๋Š”๋‹ค.

ํ”„๋กœ์ ํŠธ์˜ ๊ตฌ๋ถ„์€ branch๋กœ ํ•˜๋ฉฐ, ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ๋ถ„ํ•œ๋‹ค.

  • master : ๊ธฐ๋ณธ ์„ค๋ช…
  • iap_sample_dev : IAP๋ฅผ ์ ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์ ํŠธ
  • unity_adaptor : Unity ํ™˜๊ฒฝ์—์„œ IAP ์ ์šฉ์„ ์œ„ํ•œ ์ƒ˜ํ”Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ”„๋กœ์ ํŠธ
  • unity_sample : unity_adaptor๋ฅผ ์ ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ Unity ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์ ํŠธ

IAP ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์„œ๋น„์Šค ์ •์ฑ…์˜ ๋ณ€๊ฒฝ, ๊ธฐ๋Šฅ์˜ ์ถ”๊ฐ€ ๋˜๋Š” ๋ฒ„๊ทธ ํŒจ์น˜๋ฅผ ๋ชฉ์ ์œผ๋กœ ๋น„ ์ •๊ธฐ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋  ์ˆ˜ ์žˆ๋‹ค. IAP ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋ฉด ์›์Šคํ† ์–ด ๊ฐœ๋ฐœ์ž์„ผํ„ฐ์— ๊ณต์ง€์‚ฌํ•ญ์œผ๋กœ ์•ˆ๋‚ด ๋˜๊ณ , ์›์Šคํ† ์–ด ๊ฐœ๋ฐœ์ž์„ผํ„ฐ์— ๋“ฑ๋กํ•œ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ e-mail ์„ ํ†ตํ•ด ๊ณต์ง€ํ•œ๋‹ค.

App์„ ๊ฐœ๋ฐœํ•˜๋Š” ์‹œ์ ์— ์›์Šคํ† ์–ด ๊ฐœ๋ฐœ์ž์„ผํ„ฐ์— ๋“ฑ๋ก๋˜์–ด ์žˆ๋Š” ์ตœ์‹ ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉ ํ•˜์—ฌ ๊ฐœ๋ฐœํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, App ๋‚ด์—์„œ์˜ ์ธ์•ฑ ์ƒํ’ˆ ๊ตฌ๋งค๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๊ณ , ์›์Šคํ† ์–ด ๊ฐœ๋ฐœ์ž์„ผํ„ฐ์— App ๋“ฑ๋ก์ด ๋ถˆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ธ์•ฑ ์ƒํ’ˆ ๋“ฑ๋ก

IAP ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ƒํ’ˆ์˜ AID์™€ ์ธ์•ฑ์ƒํ’ˆID๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•˜๋ฉฐ, ๋”ฐ๋ผ์„œ ์‚ฌ์ „์— ๊ฐœ๋ฐœ์ž์„ผํ„ฐ์— ํŒ๋งคํ•  ์ƒํ’ˆ๊ณผ ์ธ์•ฑ ์ƒํ’ˆ์„ ๋“ฑ๋กํ•ด์•ผ ํ•œ๋‹ค. ์ธ์•ฑ์ƒํ’ˆ์˜ ์ข…๋ฅ˜๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

AID๋งŒ ๋ฐœ๊ธ‰ํ•˜๋ฉด ๋˜๋ฏ€๋กœ APKํŒŒ์ผ์„ ๋ฏธ๋ฆฌ ์—…๋กœ๋“œ ํ•  ํ•„์š”๋Š” ์—†๋‹ค.

์›์Šคํ† ์–ด ๊ฒฐ์ œ๋Š” ๊ตฌ๊ธ€ IAB์™€ ๋‹ฌ๋ฆฌ ์ธ์•ฑ์ƒํ’ˆ Type ์„ ๋ฏธ๋ฆฌ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•˜๋ฉฐ ๊ฐœ๋ฐœ์‚ฌ๊ฐ€ ์ง์ ‘ consume ์ฒ˜๋ฆฌ ๊ฐœ๋…์ด ๋”ฐ๋กœ ์—†๋‹ค.

๊ตฌ๋ถ„ ๋‚ด์šฉ ๋น„๊ณ 
์†Œ๋ฉธ์„ฑ ์ƒํ’ˆ ์ƒ์‹œ ์žฌ๊ตฌ๋งค/๋ฐ˜๋ณต๊ตฌ๋งค๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ƒํ’ˆํƒ€์ž… consumeํ•˜์ง€ ์•Š์•„๋„ ๋ฐ˜๋ณต ์žฌ๊ตฌ๋งค๊ฐ€ ๊ฐ€๋Šฅํ•จ
์˜๊ตฌ์„ฑ ์ƒํ’ˆ ํ•œ ๋ฒˆ ๊ตฌ๋งคํ•œ ๋’ค ์žฌ๊ตฌ๋งค๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํ’ˆ ํƒ€์ž…
๊ธฐ๊ฐ„์ œ ์ƒํ’ˆ ํ•œ ๋ฒˆ ๊ตฌ๋งคํ•œ ๋’ค ํŠน์ • ๊ธฐ๊ฐ„ ๋™์•ˆ ์žฌ๊ตฌ๋งค๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํ’ˆ ํƒ€์ž… ์ž”์—ฌ๊ธฐ๊ฐ„์€ SDK์—์„œ query๋กœ ํ™•์ธ ๊ฐ€๋Šฅํ•จ
์›”์ž๋™๊ฒฐ์ œ ์ƒํ’ˆ ๋งค์›” ์ผ์ • ๊ธˆ์•ก์ด ์ž๋™๊ฒฐ์ œ๊ฐ€ ๋˜๋Š” ์ƒํ’ˆํƒ€์ž… ์›”์ •์•ก ํ•ด์ง€๋Š” SDK์—์„œ query๋กœ ์ƒํƒœ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

์ •์‹ํŒ ์ „ํ™˜ ์ƒํ’ˆ์€ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Œ

๋“ฑ๋ก ๋ฐฉ๋ฒ•

์ธ์•ฑ์ƒํ’ˆ์„ ๋“ฑ๋ก์€ ์ผ๊ด„๋“ฑ๋ก๊ณผ ๊ฐœ๋ณ„๋“ฑ๋ก 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

์ธ์•ฑ ์ƒํ’ˆ ์ผ๊ด„ ๋“ฑ๋กํ•˜๊ธฐ

๊ตฌ๊ธ€ ํ”Œ๋ ˆ์ด ๊ฐœ๋ฐœ์ž ์ฝ˜์†”, ๋„ค์ด๋ฒ„ ์•ฑ์Šคํ† ์–ด ๊ฐœ๋ฐœ์ž์„ผํ„ฐ ๋“ฑ์—์„œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ ์ธ์•ฑ์ƒํ’ˆ ๋ชฉ๋ก(CSV)๋ฅผ ๊ฐ„๋‹จํ•œ ํŽธ์ง‘ ํ›„ ํ•œ๋ฒˆ์— ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. ํƒ€์‚ฌ ๊ฐœ๋ฐœ์ž์ฝ˜์†”์—์„œ ์ธ์•ฑ ์ƒํ’ˆ ๋ชฉ๋ก์„ csv ๋กœ ๋‹ค์šด๋กœ๋“œ
  2. ์›์Šคํ† ์–ด ๊ฐœ๋ฐœ์ž์„ผํ„ฐ ์—…๋กœ๋“œ ์–‘์‹ ๋‹ค์šด๋กœ๋“œ ๋˜๋Š” ๋งํฌ ํด๋ฆญ (๊ทธ๋ฆผ ๋‚ด โ‘ )
  3. ํƒ€์‚ฌ์—์„œ ๋ฐ›์€ CSVํŒŒ์ผ์„ ์–‘์‹์— ๋ณต์‚ฌ/๋ถ™์—ฌ๋„ฃ๊ธฐ
  4. ์™„์„ฑ๋œ ์–‘์‹ ํŒŒ์ผ(xls)๋ฅผ ์›์Šคํ† ์–ด ๊ฐœ๋ฐœ์ž์„ผํ„ฐ์— ์—…๋กœ๋“œ (๊ทธ๋ฆผ ๋‚ด โ‘ก)
  5. ๋“ฑ๋ก๋œ ์ธ์•ฑ์ƒํ’ˆ์„ ํ™•์ธํ•˜์—ฌ AID์™€ product_id๋ฅผ ํ™•์ธํ•œ๋‹ค.

enter image description here

์ธ์•ฑ ์ƒํ’ˆ ๊ฐœ๋ณ„ ๋“ฑ๋กํ•˜๊ธฐ

์›์Šคํ† ์–ด ๊ฐœ๋ฐœ์ž์„ผํ„ฐ์— ๋กœ๊ทธ์ธ ํ•œ ํ›„ Apps ๋ฉ”๋‰ด์— ๋“ค์–ด๊ฐ€์„œ ์ƒํ’ˆ๋“ฑ๋ก ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ ํ›„ ์ƒํ’ˆ์„ ๋“ฑ๋กํ•œ๋‹ค.

enter image description here


In-App์ •๋ณด ์—์„œ ์ธ์•ฑ์ƒํ’ˆ์„ ๋“ฑ๋กํ•œ๋‹ค.

์ธ์•ฑ์ƒํ’ˆ ๋“ฑ๋ก ์ „์— ํ†ต์žฅ ๋“ฑ ์ •์‚ฐ์ •๋ณด๋ฅผ ๋จผ์ € ๋“ฑ๋กํ•ด์•ผ ํ•œ๋‹ค.

enter image description here


์ƒํ’ˆ๋“ฑ๋ก์„ ํด๋ฆญํ•˜์—ฌ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํŒ๋งคํ•  ์ƒํ’ˆ ์ •๋ณด๋ฅผ ๋“ฑ๋กํ•œ๋‹ค.

  • ์ƒํ’ˆ์ œ๋ชฉ์€ ํŒ๋งคํ•  ์ƒํ’ˆ์˜ ์ œ๋ชฉ์„ ์ž…๋ ฅํ•˜๊ณ , ํ•ด๋‹น ์ƒํ’ˆ์˜ ์ข…๋ฅ˜๋ฅผ ์„ ํƒํ•˜์—ฌ ์ž…๋ ฅํ•œ๋‹ค.
  • ์ธ์•ฑ ์ƒํ’ˆ๊ฒฝ๋กœ๋Š” ์ถ”ํ›„ ํ†ตํ•ฉ ๊ฐœ๋ฐœ์ž์„ผํ„ฐ ๊ฒ€์ฆ์‹œ ์ด์šฉ๋˜๋Š” ์ •๋ณด์ด๋ฏ€๋กœ ํ•ด๋‹น ์ƒํ’ˆ์ด ์œ„์น˜ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.
  • ์ƒํ’ˆ๊ฐ€๊ฒฉ์€ ๋ถ€๊ฐ€์„ธ ํฌํ•จ ๊ธˆ์•ก์„ ์ž…๋ ฅํ•œ๋‹ค.
  • ๋ชจ๋“  ์ž…๋ ฅ์ด ์™„๋ฃŒ๋˜์—ˆ์œผ๋ฉด ์ €์žฅ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ๋‹ค.

enter image description here


๋“ฑ๋ก๋œ ์ธ์•ฑ์ƒํ’ˆ์„ ํ™•์ธํ•˜์—ฌ AID์™€ product_id๋ฅผ ํ™•์ธํ•œ๋‹ค.

enter image description here

์›์Šคํ† ์–ด ๋ฐ ์„œ๋น„์Šค ์•ฑ ๋‹ค์šด๋กœ๋“œ

์›์Šคํ† ์–ด IAP 4๋ฒ„์ „์€ ์‚ฌ์šฉ์ž์˜ ๋‹จ๋ง๊ธฐ์— ์ตœ์‹  ๋ฒ„์ „์˜ ์›์Šคํ† ์–ด ์•ฑ๊ณผ ์„œ๋น„์Šค๋ชจ๋“ˆ (ONE store service)์ด ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

์›์Šคํ† ์–ด ์•ฑ์„ ์‹คํ–‰ํ•˜๋ฉด ์ž๋™์œผ๋กœ ์„œ๋น„์Šค ๋ชจ๋“ˆ์„ ๋‹ค์šด๋กœ๋“œํ•œ๋‹ค.


์ธ์•ฑ๊ฒฐ์ œ ๋ชจ๋ธ (Model) ๊ณ ๋ คํ•˜๊ธฐ

IAP SDK๋ฅผ ์ ์šฉ ํ•˜๊ธฐ์— ์•ž์„œ, ๋ชจ๋ธ์„ ๊ณ ๋ ค ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ชจ๋ธ(Model) ์ด๋ผ๋Š” ๊ฒƒ์€ ์•„๋ž˜ ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•œ ์ „์ฒด์ ์ธ Flow๋ฅผ ๋งํ•œ๋‹ค.

  • IAP SDK๋ฅผ ํ†ตํ•ด ๊ตฌ๋งค(๊ฒฐ์ œ)
  • ๊ตฌ๋งค(๊ฒฐ์ œ)์— ๋Œ€ํ•œ ์ธ์ฆ
  • App ๋‚ด์—์„œ ๊ถŒํ•œ์„ ์–ป๋Š” ๋ฐฉ์‹

Built-in Model

๋ณธ ๋ฐฉ์‹์€ App Server์™€์˜ ์ ‘์† ์—†์ด, Smart Phone์— ์„ค์น˜๋œ App ๋‹จ๋…์œผ๋กœ ์ธ์•ฑ ์ƒํ’ˆ๋ฅผ ์ฆ‰์‹œ ์ œ๊ณตํ•˜๊ณ ์ž ํ•  ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋œ๋‹ค.

App ๋‚ด์— ์ธ์•ฑ ์ƒํ’ˆ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ๊ณ , ๊ฒฐ์ œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด App๋‚ด์—์„œ ๊ตฌ๋งคํ•œ ์ธ์•ฑ ์ƒํ’ˆ์˜ ์‚ฌ์šฉ ์ž ๊ธˆ์„ ํ•ด์ œํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

enter image description here

Flow

  1. App์€ IAP API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฒฐ์ œ ์š”์ฒญํ•œ๋‹ค.
  2. IAP Plug-in์€ IAP Server์— ๊ฒฐ์ œ ์š”์ฒญ์„ ์†ก์‹ ํ•˜๊ณ  IAP Server๋Š” ๊ฒฐ์ œ ์š”์ฒญ ์ฒ˜๋ฆฌ ํ›„ ๊ฒฐ์ œ ๊ฒฐ๊ณผ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
  3. IAP Plug-in ์€ ๊ฒฐ์ œ ๊ฒฐ๊ณผ๋ฅผ App์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.
  4. ๊ตฌ๋งคํ•œ ์ธ์•ฑ ์ƒํ’ˆ์˜ ์‚ฌ์šฉ์„ ์Šน์ธํ•œ๋‹ค.

[๊ฐ•๋ ฅ ๊ถŒ๊ณ  ํ๋ฆ„(Flow)] 3-1, 3-2 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๊ฒฐ์ œ ๊ฒฐ๊ณผ ์ˆ˜์‹  ํ›„, TxID ์ „์ž์˜์ˆ˜์ฆ ๊ฒ€์ฆ ํ›„ ์ธ์•ฑ ์ƒํ’ˆ์˜ ์‚ฌ์šฉ์„ ์Šน์ธํ•œ๋‹ค.

Server Model

์ธ์•ฑ ์ƒํ’ˆ์˜ ๊ฒฐ์ œ ์™„๋ฃŒ ํ›„, App์—์„œ ๊ฐœ๋ฐœ์‚ฌ์˜ App Server๋กœ ์ ‘์†ํ•˜์—ฌ ์ธ์•ฑ ์ƒํ’ˆ์— ๋Œ€ํ•œ ์‚ฌ์šฉ ๊ถŒํ•œ์„ ์š”์ฒญํ•˜๊ณ  ํ—ˆ๊ฐ€๋ฅผ ๋ฐ›๊ฑฐ๋‚˜ ํ•ด๋‹น ์ƒํ’ˆ์„ ๋‹ค์šด๋กœ๋“œ ํ•  ํ•„์š”์„ฑ์ด ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

์›์Šคํ† ์–ด์—์„œ๋Š” App Server์—์„œ ์‚ฌ์šฉ ๊ถŒํ•œ ํ™•์ธ์„ ์œ„ํ•ด ์‹ค์‹œ๊ฐ„์œผ๋กœ IAP Server์— ๊ตฌ๋งค ์ด๋ ฅ ์กฐํšŒ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก TID ๊ตฌ๋งค๋‚ด์—ญ ์กฐํšŒ API ๋ฐ TxID ์ „์ž์˜์ˆ˜์ฆ ๊ฒ€์ฆ API ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

enter image description here

Flow

  1. App์€ IAP API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฒฐ์ œ ์š”์ฒญํ•œ๋‹ค.
  2. IAP Plug-in์€ IAP Server์— ๊ฒฐ์ œ ์š”์ฒญ์„ ์†ก์‹ ํ•˜๊ณ  IAP Server๋Š” ๊ฒฐ์ œ ์š”์ฒญ ์ฒ˜๋ฆฌ ํ›„ ๊ฒฐ์ œ ๊ฒฐ๊ณผ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
  3. IAP Plug-in ์€ ๊ฒฐ์ œ ๊ฒฐ๊ณผ๋ฅผ App์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.
  4. App์€ App Server์— ๊ตฌ๋งคํ•œ ์ธ์•ฑ ์ƒํ’ˆ์˜ ๊ถŒํ•œ ํ™•์ธ์„ ์š”์ฒญํ•œ๋‹ค.
  5. App Server์—์„œ ์‚ฌ์šฉ ๊ถŒํ•œ์„ ํ™•์ธํ•œ๋‹ค.
  6. App Server์˜ ๊ถŒํ•œ ํ™•์ธ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ์ธ์•ฑ ์ƒํ’ˆ์˜ ์‚ฌ์šฉ์„ ์Šน์ธํ•œ๋‹ค.

[๊ฐ•๋ ฅ ๊ถŒ๊ณ  ํ๋ฆ„(Flow)] 5-1 App Server๋Š” IAP ์„œ๋ฒ„์— ๊ตฌ๋งค ์žฌํ™•์ธ ์š”์ฒญ ํ›„ ์ธ์•ฑ ์ƒํ’ˆ์˜ ์‚ฌ์šฉ์„ ์Šน์ธํ•œ๋‹ค.


์ธ์•ฑ๊ฒฐ์ œ ๊ตฌํ˜„ (IAP SDK ์ ์šฉ)

IAP SDK๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์›์Šคํ† ์–ด ๊ฒฐ์ œ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐœ๋ฐœ ๋„๊ตฌ์ด๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์•„๋ž˜ ๋‘ ๊ฐ€์ง€ ํ˜•ํƒœ๋กœ ์ œ๊ณต๋œ๋‹ค. (ํ˜„์žฌ aarํ˜•ํƒœ์˜ ์ œ๊ณต์€ ๊ณ ๋ ค ์ค‘)

  • Android Library (.aar)
  • Java Library (.jar)

Android์šฉ Java ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜•ํƒœ๋กœ ์ œ๊ณต๋˜๋ฉฐ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๋˜์–ด ์žˆ๋‹ค.

iap_plugin ํด๋”
    L iap_plugin_[version].aar
    L iap_plugin_[version].jar

์ž์„ธํ•œ ์„ค๋ช…์€ ๋ ˆํผ๋Ÿฐ์Šค์™€ ์ƒ˜ํ”Œ์ฝ”๋“œ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.


๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Library) ์„ค์ •

IAP SDK์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ ์ ˆํžˆ ์œ„์น˜์‹œํ‚จ๋‹ค.

ex: [Projectํด๋”]/app/libs/

๋นŒ๋“œ์Šคํฌ๋ฆฝํŠธ(ex: app/build.gradle)ํŒŒ์ผ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํฌํ•จ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•œ๋‹ค.

  • Java Library (.jar)
dependencies {
    compile files('libs/iap_plugin_[๋ฒ„์ „]_[๋นŒ๋“œ๋‚ ์งœ].jar')
}
  • Android Library (.aar)
allprojects {
    repositories {
        flatDir {
            dirs 'libs'
        }
    }
}

dependencies {
    compile(name:'iap_plugin_[๋ฒ„์ „]_[๋นŒ๋“œ๋‚ ์งœ]', ext:'aar')
}

AndroidManifest.xml ์„ค์ •

IAP ๋ชจ๋“ˆ์ด ์ •์ƒ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด AndroidManifest.xml ํŒŒ์ผ์— IAP ๋ฒ„์ „ ์ •๋ณด์„ ๋ฐ˜๋“œ์‹œ ์„ค์ •๋˜์–ด์•ผ ํ•œ๋‹ค. ์•„๋ž˜์˜ ๋‚ด์šฉ์ด ์„ค์ •๋˜์ง€ ์•Š์œผ๋ฉด, ์ •์ƒ์ ์ธ ๋™์ž‘์ด ์–ด๋ ค์šธ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, App์˜ ์ƒํ’ˆ ๋“ฑ๋ก์ด ์‹คํŒจํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹ ๊ทœ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” AndroidManifest.xml์— ํผ๋ฏธ์…˜์„ ์„ ์–ธํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

๋˜ํ•œ, SDK์—์„œ ํ•„์š”๋กœ ํ•˜๋Š” ๋Ÿฐํƒ€์ž„ํผ๋ฏธ์…˜์— ๋Œ€ํ•œ ๋Œ€์‘๋„, SDK์—์„œ ์ฒ˜๋ฆฌ ํ•˜๋ฏ€๋กœ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

iap:api_version ์„ค์ •

App์€ ๋ฐ˜๋“œ์‹œ ๋‚˜์—ด๋œ meta-data๋ฅผ ๋ชจ๋‘ ์„ค์ • ํ•ด์•ผ ํ•œ๋‹ค. name ์˜ ๊ฐ’์€ ๊ณ ์ •์ด์ง€๋งŒ, value ์˜ ๊ฐ’์€ API ๋ฒ„์ „์— ๋”ฐ๋ผ์„œ ๋ฐ”๋€๋‹ค.

๋ฒ„์ „ 16.XX.XX์˜ ๊ฒฝ์šฐ, ์•„๋ž˜์™€ ๊ฐ™์ด ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

<application ...... >
   <meta-data
      android:name="iap:api_version" 
      android:value="4" />

orientation ๋ณ€๊ฒฝ ๊ณ ๋ คํ•˜๊ธฐ

๊ฒฐ์ œ ๋˜๋Š” ์ฟผ๋ฆฌ(UI ๋…ธ์ถœ ๋˜๋Š” ๊ฒฝ์šฐ) ์š”์ฒญ ์‹œ์ ์—๋Š” portrait ์†์„ฑ์„ ์ง€๋‹Œ ๊ฒฐ์ œ Activity๊ฐ€ ๋ณด์—ฌ์ง„๋‹ค.

๊ฒฐ์ œ๋ฅผ ์š”์ฒญํ•˜๋Š” Activity๊ฐ€ landscape ์†์„ฑ์ด์˜€๋‹ค๋ฉด, ์‹œ์Šคํ…œ ํ™˜๊ฒฝ ๋ณ€ํ™” ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๊ณ  ํŠน๋ณ„ํ•œ ์„ค์ •์ด ์—†๋‹ค๋ฉด ์ƒ๋ช…์ฃผ๊ธฐํ•จ์ˆ˜(ex: onDestroy)๊ฐ€ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ๋‹ค.

๋งŒ์•ฝ, Activity ์—์„œ IapPlugin ์ธ์Šคํ„ด์Šค์™€ ์ฝœ๋ฐฑ ์ธ์Šคํ„ด์Šค๊ฐ€ ์žฌ์ƒ์„ฑ๋˜์–ด, ์‘๋‹ต(์ฝœ๋ฐฑ)์ด ์ •์ƒ์ ์œผ๋กœ ์ˆ˜์‹ ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” IapPlugin์„ ์‚ฌ์šฉํ•˜๋Š” Activity์— ์•„๋ž˜์™€ ๊ฐ™์ด configChanges๊ฐ’์„ ์„ค์ •ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.

<activity 
    ...
    android:configChanges="orientation|screenSize" />

ํŒจํ‚ค์ง€ ์„ค๋ช…

IAP SDK๋Š” 3๊ฐœ์˜ ์ฃผ์š” ํŒจํ‚ค์ง€๋ฅผ ์ œ๊ณตํ•œ๋‹ค. com.skplanet.dodo ํŒจํ‚ค์ง€๋งŒ์„ ์ด์šฉํ•˜์—ฌ, ๋ชจ๋“  ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด์ „ ๋ฒ„์ „์—์„œ๋Š” ๊ตฌํ˜„์— ๋„์›€์„ ์ฃผ๊ธฐ ์œ„ํ•ด, helper์™€ pdu ํŒจํ‚ค์ง€ ๋ณ„๋„๋กœ ์ œ๊ณตํ–ˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ, API_VERSION 4 ๋ถ€ํ„ฐ๋Š” ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ, ์•ˆ์ •์„ฑ์„ ๊ฐ•ํ™”ํ•˜์—ฌ SDK์— ํฌํ•จ ์‹œ์ผฐ๋‹ค.

์ปดํฌ๋„ŒํŠธ ์„ค๋ช…
com.skplanet.dodo ๊ตฌํ˜„์„ ์œ„ํ•œ ํ•„์ˆ˜ ํด๋ž˜์Šค๊ฐ€ ์กด์žฌ
com.skplanet.dodo.helper ๊ธฐ์กด ์ƒ˜ํ”Œ์—์„œ ์ œ๊ณตํ•˜๋˜ ๋‚ด์šฉ
com.skplanet.dodo.pdu ๊ธฐ์กด ์ƒ˜ํ”Œ์—์„œ ์ œ๊ณตํ•˜๋˜ ๋‚ด์šฉ

ํด๋ž˜์Šค ์„ค๋ช…

IAP SDK๋Š” IapPlugin ์ธ์Šคํ„ด์Šค์— ์š”์ฒญ์„ ํ•˜๊ณ , ๋ฆฌ์Šค๋„ˆ๋ฅผ ํ†ตํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ์ „๋‹ฌ ๋ฐ›๋Š” ๋น„๋™๊ธฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

์ธ์•ฑ ์ƒํ’ˆ ๊ตฌ๋งค ์š”์ฒญ ํ˜ธ์ถœ/์‘๋‹ต ๊ฒฐ๊ณผ์— ๋”ฐ๋ฅธ ์ ํ•ฉํ•œ ์ฒ˜๋ฆฌ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ •์˜ํ•˜์—ฌ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.


IapPlugin ํด๋ž˜์Šค ์„ค๋ช…

์›ํ•˜๋Š” ์š”์ฒญ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค์ด๋‹ค. ์ค‘๋ณต ๊ฐ์ฒด๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ ๊ฐ์ฒด ๋ณ„๋กœ Development/Release๊ฐ€ ์„ค์ • ๋œ๋‹ค.

์‚ฌ์šฉ์ด ์ข…๋ฃŒ ๋˜๋ฉด exit() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ ํ•ด์•ผ ํ•˜๋ฉฐ, ์ดํ›„ IapPlugin์— ์š”์ฒญ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ๋Ÿฐํƒ€์ž„ Exception์ด ๋ฐœ์ƒํ•œ๋‹ค.


/**
 * ์š”์ฒญ์„ ์œ„ํ•œ IapPlugin ๊ฐ์ฒด ์ƒ์„ฑ
 */
IapPlugin getPlugin(Context context, String pluginmMode)

...

// ๋””๋ฒ„๊ทธ์šฉ
//mPlugin = IapPlugin.getPlugin(activity, IapPlugin.DEVELOPMENT_MODE);

// ์ƒ์šฉ
mPlugin = IapPlugin.getPlugin(activity, IapPlugin.RELEASE_MODE);

/**
 * ๊ฒฐ์ œ ์š”์ฒญ (๊ถŒ์žฅ)
 */
String sendPaymentRequest(IapPlugin.RequestCallback requestCallback, PaymentParams params)


/**
 * ๊ฒฐ์ œ ์š”์ฒญ
 */
Bundle sendPaymentRequest(String appId, String pId, String productName, String tId, String bpInfo, IapPlugin.RequestCallback requestCallback)

/**
 * ๊ตฌ๋งค๋‚ด์—ญ ์กฐํšŒ
 * ๋‹จ์ผ, ๋‹ค์ค‘, ์ „์ฒด ์ƒํ’ˆ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
 */
String sendCommandPurchaseHistory(IapPlugin.RequestCallback requestCallback, ProcessType type, String appId, String... productIds)

/**
 * ์ƒํ’ˆ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
 */
String sendCommandProductInfo(IapPlugin.RequestCallback requestCallback, ProcessType type, String appId)

/**
 * ๊ตฌ๋งค ๊ฐ€๋Šฅ์—ฌ๋ถ€ ์ฒดํฌ
 * ๋‹จ์ผ, ๋‹ค์ค‘ ์ƒํ’ˆ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
 */
String sendCommandCheckPurchasability(IapPlugin.RequestCallback requestCallback, ProcessType type, String appId, String... productIds)

/**
 * ๊ตฌ๋งคํ•œ ์ƒํ’ˆ ์ƒํƒœ ๋ณ€๊ฒฝ
 * ์ •์•ก์ œ ์ƒํ’ˆ์˜ ๊ฒฝ์šฐ ๊ฐ€์ž… ํ•ด์ง€, ์†Œ๋ฉธ์„ฑ ์ƒํ’ˆ์˜ ๊ฒฝ์šฐ ํฌ์ธํŠธ ์ฐจ๊ฐ ๋“ฑ์„ ์š”์ฒญ
 */
String sendCommandChangeProductProperties(IapPlugin.RequestCallback requestCallback, ProcessType type, String appId, String action, String... productIds)

/**
 * ์ „์ž ์˜์ˆ˜์ฆ ๊ฒ€์ฆ์„ ์œ„ํ•œ ํ•จ์ˆ˜
 */
void sendReceiptVerificationRequest(String appId, String txId, String signData, ReceiptVerificationTask.RequestCallback callback)

/**
 * ์ข…๋ฃŒ ํ•จ์ˆ˜
 * ์ดํ›„์—๋Š” send(์š”์ฒญ) ๋ถˆ๊ฐ€ (IllegalStateException ๋ฐœ์ƒ)
 */
void exit()

IapPlugin.RequestCallback ์ธํ„ฐํŽ˜์ด์Šค


public interface RequestCallback {
    void onResponse(IapResponse data);
    void onError(String reqid, String errcode, String errmsg);
}

์š”์ฒญ(์ฟผ๋ฆฌ/๊ฒฐ์ œ)์— ๋Œ€ํ•œ ์ฝœ๋ฐฑ์€ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด์–ด์•ผ ํ•œ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ ํ•˜๊ธฐ ๋ณด๋‹ค๋Š” IapPlugin.AbsRequestCallback๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค.


IapPlugin.AbsRequestCallback ์ถ”์ƒํด๋ž˜์Šค

IapPlugin.RequestCallback ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์š”์ฒญ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•œ ์ถ”์ƒ ํด๋ž˜์Šค์ด๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ์—, json๊ฒฐ๊ณผ๋ฅผ String ์ „๋ฌธ์œผ๋กœ ํš๋“ํ•˜๊ฒŒ ๋˜๊ณ  ๊ฐœ๋ณ„์ ์œผ๋กœ ํŒŒ์‹ฑ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ, IapPlugin.AbsRequestCallback ์ถ”์ƒํด๋ž˜์Šค๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•˜์—ฌ ์š”์ฒญ(์ฟผ๋ฆฌ, ๊ฒฐ์ œ) ์‹œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•˜๊ฒŒ ๋˜๋ฉด, ์š”์ฒญ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค ํ˜•ํƒœ๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌ์Šค๋„ˆ๋Š” WeakReference๋กœ ๊ด€๋ฆฌ ๋˜๋ฏ€๋กœ ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ, ์ต๋ช… ํด๋ž˜์Šค๋กœ ์ƒ์„ฑํ•˜์—ฌ ๋„˜๊ธฐ๋ฉด ์•ˆ๋œ๋‹ค. (SDK v16.03.00 ๋ถ€ํ„ฐ๋Š” StrongReference๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์‚ฌํ•ญ ์—†์Œ)


private IapPlugin.AbsRequestCallback mAbsRequestCallback = new IapPlugin.AbsRequestCallback() {
        @Override
        protected void onResponse(Response response) {
            // ์ •์ƒ์ ์ธ ์‘๋‹ต์„ ๋ฐ›์Œ
        }

        @Override
        public void onError(String reqid, String errcode, String errmsg) {
            // ์—๋Ÿฌ๋ฐœ์ƒ
        }
    };

RequestCallback ์ธํ„ฐํŽ˜์ด์Šค์˜ `onError()` ๋ฉ”์„œ๋“œ๋กœ ์—๋Ÿฌ ์ฝ”๋“œ์™€ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค.

onError ์—๋Ÿฌ ์ฝ”๋“œ, ๋ฉ”์‹œ์ง€ ์ •์˜๋Š” ๋ ˆํผ๋Ÿฐ์Šค ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

  • reqid ์š”์ฒญ ์•„์ด๋””
  • errcode ์‹คํŒจ ์ฝ”๋“œ
  • errmsg ์‹คํŒจ ๋ฉ”์‹œ์ง€

ํ”„๋กœ๋ชจ์…˜ ์ค‘๋ณต ์ฐธ์—ฌ ๋ฐฉ์ง€ ๊ธฐ๋Šฅ (16.04 ์ถ”๊ฐ€)

์›์Šคํ† ์–ด ์ธ์•ฑ SDK 16.04๋ถ€ํ„ฐ ๋ถ€์ •ํ•œ ๋ฐฉ๋ฒ•์„ ํ†ตํ•œ ์›์Šคํ† ์–ด ํ”„๋กœ๋ชจ์…˜์˜ ์ค‘๋ณต ์ฐธ์—ฌ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

๊ฐœ๋ฐœ์‚ฌ๋Š” ๊ตฌ๋งค ์š”์ฒญ ์‹œ, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ์ธ์˜ ๊ณ ์œ  ์‹๋ณ„์ž๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ํ”„๋กœ๋ชจ์…˜ ์ฐธ์—ฌ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ๊ฐ™์ด ์ „๋‹ฌํ•œ๋‹ค.

๋ฐ์ดํ„ฐ ๋ณ€์กฐ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์œ  ์‹๋ณ„์ž๋ฅผ Hashํ™” ํ•˜์—ฌ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

ํ”„๋กœ๋ชจ์…˜ ์ค‘๋ณต ์ฐธ์—ฌ ๋ฐฉ์ง€ ํŒŒ๋ผ๋ฉ”ํ„ฐ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ๋ ˆํผ๋Ÿฐ์Šค(SDK) ํƒญ์˜ sendPaymentRequest ํ•ญ๋ชฉ์„ ์ฐธ์กฐํ•˜๋ฉด ๋œ๋‹ค.

ํ•ด๋‹น ๊ธฐ๋Šฅ์€ ์ฐธ์—ฌ ์ œํ•œ์ด ์„ค์ •๋œ ํ”„๋กœ๋ชจ์…˜์—์„œ๋งŒ ๋™์ž‘ํ•˜๋ฉฐ, ์ด๋Š” ์›์Šคํ† ์–ด์—์„œ ์„ค์ •/๊ด€๋ฆฌํ•œ๋‹ค.

๊ฐ ์„ค์ • ๋ณ„๋กœ ์‚ฌ์šฉ์ž ์ฐธ์—ฌ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋Š” ์•„๋ž˜ ํ‘œ๋ฅผ ์ฐธ๊ณ .

์‚ฌ์šฉ์ž ๊ณ ์œ 
์ •๋ณด ์ „๋‹ฌ
promotion ํ—ˆ์šฉ
์—ฌ๋ถ€ ์ „๋‹ฌ
์‚ฌ์šฉ์ž(gameUserID)์˜
์ฐธ์—ฌ ํšŒ์ˆ˜๊ฐ€ ์„ค์ •๋œ ํ”„๋กœ๋ชจ์…˜
๊ธฐ์กด ์›์Šคํ† ์–ด ํ”„๋กœ๋ชจ์…˜
O O ์ด๋ฒคํŠธ ์ฐธ์—ฌ ๊ฐ€๋Šฅํ•˜๋ฉฐ,
์ฐธ์—ฌ ํšŒ์ˆ˜๋Š” ์„ค์ •๋œ ๊ธฐ์ค€์— ๋”ฐ๋ฆ„
์ด๋ฒคํŠธ ์ค‘๋ณต ์ฐธ์—ฌ ๊ฐ€๋Šฅ
O X ์ด๋ฒคํŠธ ์ฐธ์—ฌ ๋ถˆ๊ฐ€ ์ด๋ฒคํŠธ ์ค‘๋ณต ์ฐธ์—ฌ ๊ฐ€๋Šฅ
X O ์ด๋ฒคํŠธ ์ฐธ์—ฌ ๋ถˆ๊ฐ€ ์ด๋ฒคํŠธ ์ค‘๋ณต ์ฐธ์—ฌ ๊ฐ€๋Šฅ
X X ์ด๋ฒคํŠธ ์ฐธ์—ฌ ๋ถˆ๊ฐ€ ์ด๋ฒคํŠธ ์ค‘๋ณต ์ฐธ์—ฌ ๊ฐ€๋Šฅ

ํ•ด๋‹น ๊ธฐ๋Šฅ์€ android OS 4.0 ์ด์ƒ์˜ ๋‹จ๋ง์—์„œ๋งŒ ๋™์ž‘ํ•œ๋‹ค.


Response ํด๋ž˜์Šค

์‘๋‹ต ํด๋ž˜์Šค (๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์Œ)์ด๋‹ค. IapPlugin.AbsRequestCallback์˜ onResponse ํ˜ธ์ถœ(์ฝœ๋ฐฑ) ์‹œ์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ ๋œ๋‹ค.

์ด ํด๋ž˜์Šค๋Š” ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ ๋ฐ›์€ Stringํ˜•ํƒœ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ดํ„ฐํด๋ž˜์Šค์˜ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒƒ์ด๋‹ค.

๊ธฐ์กด์—๋Š” ์ƒ˜ํ”Œํ”„๋กœ์ ํŠธ์˜ helper ํŒจํ‚ค์ง€๋ฅผ ํ†ตํ•ด์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋ณ€ํ™˜ํ•˜์˜€์œผ๋‚˜, ์ด๋ฒˆ ๋ฒ„์ „ ๋ถ€ํ„ฐ๋Š” ๋ณ€ํ™˜ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ์ฃผ๋Š” ๊ฒƒ์œผ๋กœ ์ˆ˜์ • ๋˜์—ˆ๋‹ค.

๋ชจ๋“  ํ•„๋“œ๋Š” public์œผ๋กœ์„œ ์ง์ ‘ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ชจ๋“  ํ•„๋“œ๋Š” null ์ผ ์ˆ˜ ์žˆ๋‹ค. ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ ์ •๋ณด๋ฅผ ๋ฐ›์ง€ ๋ชปํ•œ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ null์ด ์…‹ํŒ… ๋œ๋‹ค.


public class Response {
    public final String api_version;
    public final String identifier;
    public final String method;
    public final Result result;
    ...
}

public static class Result {
    public final String message;
    public final String code;
    public final String txid;
    public final String receipt;
    public final Integer count;
    public final List<Product> product;
    ...
}

public static class Product {
    public String appid;
    public String id;
    public String name;
    public String type;
    public String kind;
    public Integer validity;
    public Double price;
    public String startDate;
    public String endDate;
    public Boolean purchasability;
    public Status status;
    ...
}

public static class Status {
    public String code;
    public String message;
    ...
}

ProcessType Enum ์„ค๋ช…

์š”์ฒญ ์ฒ˜๋ฆฌ ํƒ€์ž…์„ ์ •์˜ํ•œ enum์ด๋‹ค.


public enum ProcessType {
    BACKGROUND_ONLY,
    FOREGROUND_IF_NEEDED,
}

๊ธฐ๋ณธ์ ์œผ๋กœ FOREGROUND_IF_NEEDED์„ ์„ค์ •์„ ์ถ”์ฒœํ•œ๋‹ค.

์š”์ฒญ ์ฒ˜๋ฆฌ ๊ณผ์ •์—์„œ Ui ๋…ธ์ถœ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,

  • ํผ๋ฏธ์…˜ ์š”๊ตฌ ํ™”๋ฉด
  • ONE Store Service(OSS) ์„ค์น˜ ์š”๊ตฌ ํ™”๋ฉด

์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ๋“ค์ด ์กด์žฌํ•œ๋‹ค. ์ด๋Ÿฐ ์ƒํ™ฉ์— ๋Œ€ํ•ด์„œ ์š”์ฒญ์„ ์ค‘์ง€ ์‹œํ‚ค๊ณ  ์—๋Ÿฌ๋ฅผ ๋ฐ›๊ณ  ์‹ถ๋‹ค๋ฉด, BACKGROUND_ONLY๋กœ ์š”์ฒญ์„ ํ•˜๋ฉด ๋œ๋‹ค.


Example(์š”์ฒญ)

  • ์ดˆ๊ธฐํ™”

// IapPlugin ๋ ˆํผ๋Ÿฐ์Šค ์„ ์–ธ
private IapPlugin mPlugin;

// ์š”์ฒญ๊ฒฐ๊ณผ(์ฟผ๋ฆฌ/๊ฒฐ์ œ)๋ฅผ ๋ฐ›์„ ํด๋ž˜์Šค ์„ ์–ธ๊ณผ ์ƒ์„ฑ
private IapPlugin.AbsRequestCallback mAbsRequestCallback = new IapPlugin.AbsRequestCallback() {
	@Override
	protected void onResponse(Response response) {
		// ์‘๋‹ต
	}

	@Override
	public void onError(String reqid, String errcode, String errmsg) {
		// ์—๋Ÿฌ
	}
};

...

// ์š”์ฒญ์„ ์œ„ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ๋ ˆํผ๋Ÿฐ์Šค ์ €์žฅ
mPlugin = IapPlugin.getPlugin(activity, IapPlugin.RELEASE_MODE);

  • ๊ฒฐ์ œ ์š”์ฒญ

// ๊ฒฐ์ œ๋ฅผ ์œ„ํ•œ PaymentParams ๊ฐ์ฒด ์ƒ์„ฑ
PaymentParams params = new PaymentParams.Builder("OA00123456", "0910012345").build();

...

// ๊ฒฐ์ œ ์š”์ฒญ
mPlugin.sendPaymentRequest(mAbsRequestCallback, params);

  • ๊ตฌ๋งค ๋‚ด์—ญ ์กฐํšŒ

mPlugin.sendCommandPurchaseHistory(mAbsRequestCallback, ProcessType.FOREGROUND_IF_NEEDED, "OA00123456", "0910012345");

  • ์ƒํ’ˆ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ

mPlugin.sendCommandProductInfo(mAbsRequestCallback, ProcessType.FOREGROUND_IF_NEEDED, "OA00123456");

  • ๊ตฌ๋งค ๊ฐ€๋Šฅ์—ฌ๋ถ€ ์ฒดํฌ

mPlugin.sendCommandCheckPurchasability(mAbsRequestCallback, ProcessType.FOREGROUND_IF_NEEDED, "OA00123456", "0910012345");

  • ๊ตฌ๋งคํ•œ ์ƒํ’ˆ ์ƒํƒœ ๋ณ€๊ฒฝ

mPlugin.sendCommandChangeProductProperties(mAbsRequestCallback, ProcessType.FOREGROUND_IF_NEEDED, "OA00123456", Action.cancel_subscription.action(), "0910012345");

  • ์ „์ž ์˜์ˆ˜์ฆ ๊ฒ€์ฆ์„ ์œ„ํ•œ ํ•จ์ˆ˜

// ์š”์ฒญ๊ฒฐ๊ณผ(์ „์ž์˜์ˆ˜์ฆ๊ฒ€์ฆ)๋ฅผ ๋ฐ›์„ ํด๋ž˜์Šค ์„ ์–ธ๊ณผ ์ƒ์„ฑ
private ReceiptVerificationTask.AbsRequestCallback mRvRequestCallback = new ReceiptVerificationTask.AbsRequestCallback {
  
    @Override
    protected void onResponse(VerifyReceipt response) {
    	// ์‘๋‹ต
    }

    @Override
    public void onError(int code) {
    	// ์—๋Ÿฌ
    }
};
    
...

// ์ „์ž ์˜์ˆ˜์ฆ ๊ฒ€์ฆ ์š”์ฒญ
mPlugin.sendVerifyReceiptRequest(mRvRequestCallback, response.result.txid, "OA00123456", response.result.receipt);


Example(์‘๋‹ต)

  • ๊ฒฐ์ œ ์‘๋‹ต

@Override
protected void onResponse(Response response) {
	// ์„ฑ๊ณต์ฝ”๋“œ
	final String successCode = "0000";	
	
	// ์„ฑ๊ณตํ™•์ธ
	if (successCode.equals(response.result.code)) {
		// ๊ฒฐ์ œ ์„ฑ๊ณต
	}
}

  • ๊ตฌ๋งค ๋‚ด์—ญ ์กฐํšŒ

@Override
protected void onResponse(Response response) {
	final String successCode = "0000"; // ์กฐํšŒ ์„ฑ๊ณต์ฝ”๋“œ
	if (successCode.equals(response.result.code)) {
		// ํŠน์ • ์ƒํ’ˆ ๊ตฌ๋งค ๋‚ด์—ญ ํ™•์ธ
		// ๊ฒฐ๊ณผ์—๋Š” ๋ณต์ˆ˜๊ฐœ ์ƒํ’ˆ์ด ์กด์žฌ ํ•˜๋ฏ€๋กœ, ์›ํ•˜๋Š” ์ƒํ’ˆ์„ ํš๋“
        for (Response.Product p : response.result.product) {
            // ์ƒํ’ˆ ์ธ์ฆ์„ฑ๊ณต ์ฒดํฌ
            final String successStatusCode = "PH00";
            if (successStatusCode.equals(p.status.code)) {
                // Product p์—์„œ ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ํš๋“
            }
        }
	}
}

  • ์ƒํ’ˆ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ

@Override
protected void onResponse(Response response) {
	final String successCode = "0000"; // ์กฐํšŒ ์„ฑ๊ณต์ฝ”๋“œ
	if (successCode.equals(response.result.code)) {
		// ํŠน์ • ์ƒํ’ˆ ์ •๋ณด ํ™•์ธ
		// ๊ฒฐ๊ณผ์—๋Š” ๋ณต์ˆ˜๊ฐœ ์ƒํ’ˆ์ด ์กด์žฌ ํ•˜๋ฏ€๋กœ, ์›ํ•˜๋Š” ์ƒํ’ˆ์„ ํš๋“
        for (Response.Product p : response.result.product) {
	        // Product p์—์„œ ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ํš๋“
        }
	}
}

  • ๊ตฌ๋งค ๊ฐ€๋Šฅ์—ฌ๋ถ€ ์ฒดํฌ

@Override
protected void onResponse(Response response) {
	final String successCode = "0000"; // ์กฐํšŒ ์„ฑ๊ณต์ฝ”๋“œ
	if (successCode.equals(response.result.code)) {
		if (response.result.product != null && response.result.product.size() > 0) {
            Response.Product p = response.result.product.get(0);
			if (p.purchasability) {
				// ๊ตฌ๋งค๊ฐ€๋Šฅ
            }
        }
	}
}

  • ๊ตฌ๋งคํ•œ ์ƒํ’ˆ ์ƒํƒœ ๋ณ€๊ฒฝ

@Override
protected void onResponse(Response response) {
	final String successCode = "0000"; // ์กฐํšŒ ์„ฑ๊ณต์ฝ”๋“œ
    if (successCode.equals(response.result.code)) {
        if (response.result.product != null && response.result.product.size() > 0) {
            Response.Product p = response.result.product.get(0);
            final String successStatusCode = "CS00"; // ์ƒํ’ˆ ์ƒํƒœ ๋ณ€๊ฒฝ ์„ฑ๊ณต ๊ฒฐ๊ณผ ์ฝ”๋“œ
            if (successStatusCode.equals(p.status)) {
                // ์ž๋™ ๊ฒฐ์ œ ์ƒํ’ˆ ํ•ด์ง€
            }
        }
    }
}


@Override
protected void onResponse(Response response) {
	final String successCode = "0000"; // ์กฐํšŒ ์„ฑ๊ณต์ฝ”๋“œ
    if (successCode.equals(response.result.code)) {
        if (response.result.product != null && response.result.product.size() > 0) {
            Response.Product p = response.result.product.get(0);
            final String successStatusCode = "SP00"; // ์ƒํ’ˆ ์ƒํƒœ ๋ณ€๊ฒฝ ์„ฑ๊ณต ๊ฒฐ๊ณผ ์ฝ”๋“œ
            if (successStatusCode.equals(p.status)) {
                // ์•„์ดํ…œ ์ฐจ๊ฐ ์„ฑ๊ณต
            }
        }
    }
}

  • ์ „์ž ์˜์ˆ˜์ฆ ๊ฒ€์ฆ์„ ์œ„ํ•œ ํ•จ์ˆ˜

@Override
public void onResponse(final VerifyReceipt verifyReceipt) {
    // ์„ฑ๊ณต์ฝ”๋“œ
    final Integer successStatusCode = 0;
    final String successDetailCode = "0000";
    if (successStatusCode == verifyReceipt.status && successDetailCode.equals(verifyReceipt.detail)) {
        if (verifyReceipt.product != null && verifyReceipt.product.size() > 0) {
            VerifyReceipt.Product p = verifyReceipt.product.get(0);
            // Product p์—์„œ ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ํš๋“
        }
    }
}


์ธ์•ฑ๊ฒฐ์ œ ํ…Œ์ŠคํŠธ

์•ฑ์— IAP SDK ์ ์šฉ์ด ์™„๋ฃŒ ๋˜์—ˆ์œผ๋ฉด ๊ฒ€์ฆ์„ ์š”์ฒญํ•˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ Self Test ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผํ•œ๋‹ค. ์ •์ƒ์ ์ธ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋กœ ์ƒ์„ฑ๋œ ๊ณผ๊ธˆ ๋กœ๊ทธ์™€ ๊ตฌ๋งค ๋‚ด์—ญ์ด ์žˆ์–ด์•ผ๋งŒ, (๊ฐœ๋ฐœ์ž์„ผํ„ฐ) ๊ฒ€์ˆ˜ ์ ˆ์ฐจ๋ฅผ ๊ฑฐ์ณ ์ƒํ’ˆ ํŒ๋งค๋ฅผ ๊ฐœ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

์ƒ์šฉ ์„œ๋ฒ„์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ ์ธ ํ…Œ์ŠคํŠธ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ œ์•ฝ ์‚ฌํ•ญ์ด ์กด์žฌํ•œ๋‹ค.

๋”ฐ๋ผ์„œ, ๊ฒ€์ˆ˜์š”์ฒญ์€ ํ…Œ์ŠคํŠธ(Self Test)๋ฅผ ์™„๋ฃŒ ํ•œ ํ›„, ์ƒ์šฉ์„œ๋ฒ„์„ธํŒ…์œผ๋กœ ์ „ํ™˜๋งŒ ํ•˜์—ฌ ์ง„ํ–‰ํ•ด๋„ ๋œ๋‹ค.

Test ๋‹จ๋ง ๋“ฑ๋ก

[์ƒํ’ˆํ˜„ํ™ฉ]ํŽ˜์ด์ง€์—์„œ [In-App]ํƒญ์„ ์„ ํƒํ•˜์—ฌ [ํ…Œ์ŠคํŠธ]๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ๋‹ค.

enter image description here

[ํ…Œ์ŠคํŠธ]๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์€ Self Test Pop-up ์ฐฝ์ด ๋‚˜ํƒ€๋‚œ๋‹ค. [ํ…Œ์ŠคํŠธ๋‹จ๋ง]ํƒญ์—์„œ ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉํ•  ๋‹จ๋ง๋“ค์˜ MDN๊ณผ ์‹œํ—˜์šฉ T stroe Cash ๋“ฑ์„ ๋“ฑ๋กํ•œ๋‹ค. ํ…Œ์ŠคํŠธ ๋‹จ๋ง์— ๋“ฑ๋ก๋œ ํ…Œ์ŠคํŠธ๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

enter image description here

Self Test ๊ฐ•์ œ ์„ค์ •

selfTest ๋ฅผ ํ•˜๊ธฐ ์–ด๋ ค์šด ํ•ด์™ธ๊ฐœ๋ฐœ์‚ฌ ๋˜๋Š” ์›์Šคํ† ์–ด ๋ฏธ์ง€์› ๋‹จ๋ง๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ„๋“ค์€ "IAP Setting App" ์„ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ์ •์ƒ์ ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ APP์„ ๋‹ค์šด๋ฐ›๊ณ  ์•„๋ž˜ ์„ค๋ช…์— ๋”ฐ๋ผ์„œ ์„ค์ •์„ ํ•˜๊ธฐ์‹œ ๋ฐ”๋ž๋‹ˆ๋‹ค.

IAP์„ค์ • ์•ฑ ๋‹ค์šด๋กœ๋“œ

  1. "Enable Setting" ์„ ์ฒดํฌํ•˜์„ธ์š”.
  2. "ํ†ต์‹ ์‚ฌ(Carrier)"๋ฅผ ์„ค์ •ํ•˜๊ณ  "ํ•ธ๋“œํฐ๋ฒˆํ˜ธ(MDN)"๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”.
  3. ์„ค์ • ์•ฑ์„ ๋„๊ณ , ์•ฑ์„ ํ…Œ์ŠคํŠธ ํ•˜์„ธ์š”.

์ธ์•ฑ์ƒํ’ˆ ํ…Œ์ŠคํŠธ ์„ค์ •

Self Test Pop-Up ์ฐฝ์˜ [์ƒํ’ˆ๋ณ„ ์„ค์ •] ํƒญ์—์„œ๋Š” ํ…Œ์ŠคํŠธํ•˜๊ณ ์ž ํ•˜๋Š” App์˜ ์ธ์•ฑ ์ƒํ’ˆ ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ‘œ๋กœ ๋‚˜ํƒ€๋‚œ๋‹ค. ๋ฆฌ์ŠคํŠธ์—์„œ ์‹œํ—˜ํ•˜๊ณ ์ž ํ•˜๋Š” ์ž„์˜์˜ ์ธ์•ฑ ์ƒํ’ˆ๋ฅผ ์„ ํƒํ•˜์—ฌ ๊ฐœ๋ณ„ ์ธ์•ฑ ์ƒํ’ˆ ์‹œํ—˜ ํ™˜๊ฒฝ ์„ค์ • ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•œ๋‹ค. ์ด๋™ ๋ฐฉ๋ฒ•์€ ์ธ์•ฑ ์ƒํ’ˆ์˜ ์ œ๋ชฉ์„ ์„ ํƒํ•˜์—ฌ ํด๋ฆญํ•˜๋ฉด ๋œ๋‹ค.

enter image description here

์ธ์•ฑ ์ƒํ’ˆ ์‹œํ—˜ ํ™˜๊ฒฝ ์„ค์ • ํŽ˜์ด์ง€์—์„œ๋Š” ๋‹ค์–‘ํ•œ ๊ฒฐ์ œ ์ƒํ™ฉ์„ ์„ ํƒํ•˜๋ฉด์„œ ์‹œํ—˜ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. [๊ฒฐ๊ณผ์„ค์ •]์— ์ œ์‹œ๋œ ๊ฐ’๋“ค ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์—ฌ [์ €์žฅ] ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์•ž์„œ์˜ ์ธ์•ฑ ์ƒํ’ˆ ๋ชฉ๋ก ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•œ๋‹ค.

[๊ฒฐ๊ณผ์„ค์ •]์—์„œ "์ •์ƒ"์„ ์„ ํƒํ–ˆ์„ ๋•Œ๋งŒ ๊ณผ๊ธˆ์ด ์ด๋ฃจ์–ด์ง€๊ณ , ๋‚˜๋จธ์ง€ ๊ฐ’์„ ์„ ํƒํ•˜๋ฉด ๊ณผ๊ธˆ์ด ์ด๋ฃจ์–ด ์ง€์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.

enter image description here

ํ…Œ์ŠคํŠธ ์ง„ํ–‰

๊ฐœ๋ฐœ ์™„๋ฃŒํ•œ ์•ฑ์„ ์‹คํ–‰ํ•œ ๋’ค ๊ฒฐ๊ณผ ์„ค์ •์„ ์™„๋ฃŒํ•œ ์ธ์•ฑ ์ƒํ’ˆ์„ ๊ตฌ๋งคํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•œ๋‹ค. ๊ฒฐ์ œ๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด ํ•ด๋‹น ์ธ์•ฑ ์ƒํ’ˆ์˜ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์ด Y๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค.

enter image description here

๊ณผ๊ธˆ ์กฐํšŒ

Self Test Pop-up ์ฐฝ์˜ [๊ณผ๊ธˆ ๋กœ๊ทธ ์กฐํšŒ] ํƒญ์—์„œ๋Š” ์ด์ „ ๋‹จ๊ณ„์—์„œ ์„ค์ •ํ•œ ์‹œํ—˜ ํ™˜๊ฒฝ์— ๋งž์ถ”์–ด ์‹œํ—˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•œ๋‹ค. [๊ฒฐ๊ณผ์„ค์ • ๊ณผ๊ธˆ๊ฒฐ๊ณผ]์—ด์—๋Š” ์ด์ „ ๋‹จ๊ณ„์—์„œ ์„ค์ •ํ•œ "๊ฒฐ๊ณผ์„ค์ •" ๊ฐ’๊ณผ ๊ณผ๊ธˆ์˜ ์ •์ƒ ์—ฌ๋ถ€๊ฐ€ "์„ฑ๊ณต" ๋˜๋Š” "์‹คํŒจ"๋กœ ํ‘œ์‹œ๋œ๋‹ค.

enter image description here

๊ณผ๊ธˆ ๊ฒฐ๊ณผ๊ฐ€ "์‹คํŒจ"์ธ ๊ณผ๊ธˆ ๋กœ๊ทธ๋ฅผ ์„ ํƒํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ณผ๊ธˆ ๋กœ๊ทธ ์ƒ์„ธ ํŽ˜์ด์ง€๋กœ ๋ฐ”๋€Œ๋ฉด์„œ, ์‹คํŒจ ์›์ธ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

enter image description here

์ƒ์šฉ ํ…Œ์ŠคํŠธ

์ƒํ’ˆ์˜ ์ƒํƒœ์— ๋”ฐ๋ผ์„œ, ์ƒ์šฉํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด ๋‹ค๋ฅด๋ฉฐ ๋ถˆ๊ฐ€ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

  • ๋“ฑ๋ก์ค‘ : ํ…Œ์ŠคํŠธ ๋ถˆ๊ฐ€, ์ธ์•ฑSDK์™€ ์—ฐ๋™ ๊ณผ์ •์—์„œ, -1001์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ (์ฐธ๊ณ  : ๋ ˆํผ๋Ÿฐ์Šค(Result-Code))
  • ๊ฒ€์ฆ์ค‘
    • ์‹ ๊ทœ ๊ฒ€์ฆ์˜ ๊ฒฝ์šฐ : ํ…Œ์ŠคํŠธ ๋ถˆ๊ฐ€ (ํŒ๋งค์ค‘์ธ ์ƒํ’ˆ์ด ์—†๋Š” ์ƒํƒœ)
    • ์•ฑ ์—…๋ฐ์ดํŠธ ๊ฒ€์ฆ์˜ ๊ฒฝ์šฐ : ํŒ๋งค์ค‘์ธ ์ƒํ’ˆ ์— ๋Œ€ํ•ด์„œ๋งŒ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ
  • ํŒ๋งค์ค‘ : ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ

๊ฒ€์ฆ ์š”์ฒญ

IAP ์ƒํ’ˆ์€ ์›์Šคํ† ์–ด ๊ฐœ๋ฐœ์ž์„ผํ„ฐ์˜ App ๊ฒ€์ฆ์„ ํ†ตํ•ด์„œ ์ƒ์šฉ ๊ฒฐ์ œ ํ…Œ์ŠคํŠธ๋ฅผ ์™„๋ฃŒํ•ด์•ผ๋งŒ ๋ฐฐํฌ ๋ฐ ํŒ๋งค๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. Self Test๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด, ๊ฐœ๋ฐœ์ž๋Š” ์•ฑ์— ์ ์šฉ๋œ ๊ฐœ๋ฐœ์šฉ ์„œ๋ฒ„ ์„ธํŒ…์„ ์ƒ์šฉ ์„œ๋ฒ„ ์„ธํŒ…์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋นŒ๋“œํ•œ ๋‹ค์Œ ๊ฒ€์ฆ์„ ์š”์ฒญํ•œ๋‹ค.

์ธ์•ฑ ์ƒํ’ˆ์˜ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๊ฐ€ Y๊ฐ€ ์•„๋‹Œ ์ƒํ’ˆ์ด ํ•˜๋‚˜๋ผ๋„ ์žˆ์œผ๋ฉด ๊ฒ€์ฆ ์š”์ฒญ ๋ฒ„ํŠผ์ด ํ™œ์„ฑํ™” ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋ณด๋‹ค ์ƒ์„ธํ•œ ๋‚ด์šฉ์€ ์ƒํ’ˆ ๋“ฑ๋ก ๊ฐ€์ด๋“œ ๋ฅผ ์ฐธ๊ณ 

// ๋””๋ฒ„๊ทธ์šฉ
//mPlugin = IapPlugin.getPlugin(activity, IapPlugin.DEVELOPMENT_MODE);

// ์ƒ์šฉ
mPlugin = IapPlugin.getPlugin(activity, IapPlugin.RELEASE_MODE);

์ธ์•ฑ๊ฒฐ์ œ ํ™˜๋ถˆ

์ด์šฉ์ž๊ฐ€ ๊ตฌ๋งคํ•œ ์ธ์•ฑ์ƒํ’ˆ์— ๋Œ€ํ•ด์„œ ์•„์ดํ…œ ๋ฏธ์ง€๊ธ‰ ๋“ฑ์˜ ์ด์œ ๋กœ ๊ตฌ๋งค์ทจ์†Œ๋ฅผ ์š”์ฒญํ•  ๊ฒฝ์šฐ, ์ทจ์†Œ ์ ˆ์ฐจ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์ด์šฉ์ž๊ฐ€ ๊ฐœ๋ฐœ์‚ฌ ๋˜๋Š” ์›์Šคํ† ์–ด ๊ณ ๊ฐ์„ผํ„ฐ์— ๊ตฌ๋งค์ทจ์†Œ ์š”์ฒญ
  2. ๊ฐœ๋ฐœ์‚ฌ๊ฐ€ ๊ฐœ๋ฐœ์ž์„ผํ„ฐ์—์„œ ๊ฒฐ์ œ์ด๋ ฅ ํ™•์ธ ํ›„ ๊ตฌ๋งค์ทจ์†Œ ์š”์ฒญ
  3. ์›์Šคํ† ์–ด ๋‹ด๋‹น๋ถ€์„œ์—์„œ ํ™•์ธ ํ›„ ๊ตฌ๋งค์ทจ์†Œ ์ฒ˜๋ฆฌ

๊ณ ๊ฐ์˜ ๊ตฌ๋งค์ด๋ ฅ์„ ํ™•์ผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. ๊ฐœ๋ฐœ์ž์„ผํ„ฐ > ๊ณ ๊ฐ์ง€์› > TxID ๊ตฌ๋งค์ด๋ ฅ ๊ด€๋ฆฌ
  2. ๊ฐœ๋ฐœ์ž์„ผํ„ฐ > ์ง์ ‘ ๋ฌธ์˜ํ•˜๊ธฐ > ๊ณ ๊ฐVOC > ์ƒ์„ธ๋ณด๊ธฐ(ํŒ์—…)

๋ณด๋‹ค ์ƒ์„ธํ•œ ๋‚ด์šฉ์€ ๊ณ ๊ฐ ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

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