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
์์คํ ์ด์์ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ / ์์ค์ฝ๋ / ํ
์คํธ 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)๋ฅผ ๊ฐ๋จํ ํธ์ง ํ ํ๋ฒ์ ๋ฑ๋กํ ์ ์๋ค.
- ํ์ฌ ๊ฐ๋ฐ์์ฝ์์์ ์ธ์ฑ ์ํ ๋ชฉ๋ก์ csv ๋ก ๋ค์ด๋ก๋
- ์์คํ ์ด ๊ฐ๋ฐ์์ผํฐ ์ ๋ก๋ ์์ ๋ค์ด๋ก๋ ๋๋ ๋งํฌ ํด๋ฆญ (๊ทธ๋ฆผ ๋ด โ )
- ํ์ฌ์์ ๋ฐ์ CSVํ์ผ์ ์์์ ๋ณต์ฌ/๋ถ์ฌ๋ฃ๊ธฐ
- ์์ฑ๋ ์์ ํ์ผ(xls)๋ฅผ ์์คํ ์ด ๊ฐ๋ฐ์์ผํฐ์ ์ ๋ก๋ (๊ทธ๋ฆผ ๋ด โก)
- ๋ฑ๋ก๋ ์ธ์ฑ์ํ์ ํ์ธํ์ฌ
AID
์product_id
๋ฅผ ํ์ธํ๋ค.
์์คํ ์ด ๊ฐ๋ฐ์์ผํฐ์ ๋ก๊ทธ์ธ ํ ํ Apps ๋ฉ๋ด์ ๋ค์ด๊ฐ์ ์ํ๋ฑ๋ก ๋ฒํผ์ ๋๋ฅธ ํ ์ํ์ ๋ฑ๋กํ๋ค.
In-App์ ๋ณด ์์ ์ธ์ฑ์ํ์ ๋ฑ๋กํ๋ค.
์ธ์ฑ์ํ ๋ฑ๋ก ์ ์ ํต์ฅ ๋ฑ ์ ์ฐ์ ๋ณด๋ฅผ ๋จผ์ ๋ฑ๋กํด์ผ ํ๋ค.
์ํ๋ฑ๋ก์ ํด๋ฆญํ์ฌ ์ดํ๋ฆฌ์ผ์ด์ ์์ ํ๋งคํ ์ํ ์ ๋ณด๋ฅผ ๋ฑ๋กํ๋ค.
- ์ํ์ ๋ชฉ์ ํ๋งคํ ์ํ์ ์ ๋ชฉ์ ์ ๋ ฅํ๊ณ , ํด๋น ์ํ์ ์ข ๋ฅ๋ฅผ ์ ํํ์ฌ ์ ๋ ฅํ๋ค.
- ์ธ์ฑ ์ํ๊ฒฝ๋ก๋ ์ถํ ํตํฉ ๊ฐ๋ฐ์์ผํฐ ๊ฒ์ฆ์ ์ด์ฉ๋๋ ์ ๋ณด์ด๋ฏ๋ก ํด๋น ์ํ์ด ์์นํ ๊ฒฝ๋ก๋ฅผ ์ ๋ ฅํ๋ค.
- ์ํ๊ฐ๊ฒฉ์ ๋ถ๊ฐ์ธ ํฌํจ ๊ธ์ก์ ์ ๋ ฅํ๋ค.
- ๋ชจ๋ ์ ๋ ฅ์ด ์๋ฃ๋์์ผ๋ฉด ์ ์ฅ ๋ฒํผ์ ํด๋ฆญํ๋ค.
๋ฑ๋ก๋ ์ธ์ฑ์ํ์ ํ์ธํ์ฌ AID
์ product_id
๋ฅผ ํ์ธํ๋ค.
์์คํ ์ด IAP 4๋ฒ์ ์ ์ฌ์ฉ์์ ๋จ๋ง๊ธฐ์ ์ต์ ๋ฒ์ ์ ์์คํ ์ด ์ฑ๊ณผ ์๋น์ค๋ชจ๋ (ONE store service)์ด ์ค์น๋์ด ์์ด์ผ ์ ์์ ์ผ๋ก ๋์ํ๋ค.
์์คํ ์ด ์ฑ์ ์คํํ๋ฉด ์๋์ผ๋ก ์๋น์ค ๋ชจ๋์ ๋ค์ด๋ก๋ํ๋ค.
IAP SDK๋ฅผ ์ ์ฉ ํ๊ธฐ์ ์์, ๋ชจ๋ธ์ ๊ณ ๋ ค ํ ํ์๊ฐ ์๋ค.
์ฌ๊ธฐ์ ๋ชจ๋ธ(Model)
์ด๋ผ๋ ๊ฒ์ ์๋ ์ฌํญ์ ๊ณ ๋ คํ ์ ์ฒด์ ์ธ Flow๋ฅผ ๋งํ๋ค.
- IAP SDK๋ฅผ ํตํด ๊ตฌ๋งค(๊ฒฐ์ )
- ๊ตฌ๋งค(๊ฒฐ์ )์ ๋ํ ์ธ์ฆ
- App ๋ด์์ ๊ถํ์ ์ป๋ ๋ฐฉ์
๋ณธ ๋ฐฉ์์ App Server์์ ์ ์ ์์ด, Smart Phone์ ์ค์น๋ App ๋จ๋ ์ผ๋ก ์ธ์ฑ ์ํ๋ฅผ ์ฆ์ ์ ๊ณตํ๊ณ ์ ํ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋๋ค.
App ๋ด์ ์ธ์ฑ ์ํ์ด ๋ด์ฅ๋์ด ์๊ณ , ๊ฒฐ์ ๊ฐ ์๋ฃ๋๋ฉด App๋ด์์ ๊ตฌ๋งคํ ์ธ์ฑ ์ํ์ ์ฌ์ฉ ์ ๊ธ์ ํด์ ํ๋ ๋ฐฉ์์ด๋ค.
Flow
- App์ IAP API๋ฅผ ํธ์ถํ์ฌ ๊ฒฐ์ ์์ฒญํ๋ค.
- IAP Plug-in์ IAP Server์ ๊ฒฐ์ ์์ฒญ์ ์ก์ ํ๊ณ IAP Server๋ ๊ฒฐ์ ์์ฒญ ์ฒ๋ฆฌ ํ ๊ฒฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฌํ๋ค.
- IAP Plug-in ์ ๊ฒฐ์ ๊ฒฐ๊ณผ๋ฅผ App์๊ฒ ์ ๋ฌํ๋ค.
- ๊ตฌ๋งคํ ์ธ์ฑ ์ํ์ ์ฌ์ฉ์ ์น์ธํ๋ค.
[๊ฐ๋ ฅ ๊ถ๊ณ ํ๋ฆ(Flow)] 3-1, 3-2 ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฐ์ ๊ฒฐ๊ณผ ์์ ํ, TxID ์ ์์์์ฆ ๊ฒ์ฆ ํ ์ธ์ฑ ์ํ์ ์ฌ์ฉ์ ์น์ธํ๋ค.
์ธ์ฑ ์ํ์ ๊ฒฐ์ ์๋ฃ ํ, App์์ ๊ฐ๋ฐ์ฌ์ App Server๋ก ์ ์ํ์ฌ ์ธ์ฑ ์ํ์ ๋ํ ์ฌ์ฉ ๊ถํ์ ์์ฒญํ๊ณ ํ๊ฐ๋ฅผ ๋ฐ๊ฑฐ๋ ํด๋น ์ํ์ ๋ค์ด๋ก๋ ํ ํ์์ฑ์ด ์์ ๋ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค.
์์คํ ์ด์์๋ App Server์์ ์ฌ์ฉ ๊ถํ ํ์ธ์ ์ํด ์ค์๊ฐ์ผ๋ก IAP Server์ ๊ตฌ๋งค ์ด๋ ฅ ์กฐํ๋ฅผ ํ ์ ์๋๋ก TID ๊ตฌ๋งค๋ด์ญ ์กฐํ API ๋ฐ TxID ์ ์์์์ฆ ๊ฒ์ฆ API ๋ฅผ ์ ๊ณตํ๋ค.
Flow
- App์ IAP API๋ฅผ ํธ์ถํ์ฌ ๊ฒฐ์ ์์ฒญํ๋ค.
- IAP Plug-in์ IAP Server์ ๊ฒฐ์ ์์ฒญ์ ์ก์ ํ๊ณ IAP Server๋ ๊ฒฐ์ ์์ฒญ ์ฒ๋ฆฌ ํ ๊ฒฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฌํ๋ค.
- IAP Plug-in ์ ๊ฒฐ์ ๊ฒฐ๊ณผ๋ฅผ App์๊ฒ ์ ๋ฌํ๋ค.
- App์ App Server์ ๊ตฌ๋งคํ ์ธ์ฑ ์ํ์ ๊ถํ ํ์ธ์ ์์ฒญํ๋ค.
- App Server์์ ์ฌ์ฉ ๊ถํ์ ํ์ธํ๋ค.
- App Server์ ๊ถํ ํ์ธ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์ธ์ฑ ์ํ์ ์ฌ์ฉ์ ์น์ธํ๋ค.
[๊ฐ๋ ฅ ๊ถ๊ณ ํ๋ฆ(Flow)] 5-1 App Server๋ IAP ์๋ฒ์ ๊ตฌ๋งค ์ฌํ์ธ ์์ฒญ ํ ์ธ์ฑ ์ํ์ ์ฌ์ฉ์ ์น์ธํ๋ค.
IAP SDK๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์คํ ์ด ๊ฒฐ์ ๊ธฐ๋ฅ์ ์ง์ํ๊ธฐ ์ํ ๊ฐ๋ฐ ๋๊ตฌ์ด๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋ ๋ ๊ฐ์ง ํํ๋ก ์ ๊ณต๋๋ค. (ํ์ฌ aarํํ์ ์ ๊ณต์ ๊ณ ๋ ค ์ค)
- Android Library (.aar)
- Java Library (.jar)
Android์ฉ Java ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํํ๋ก ์ ๊ณต๋๋ฉฐ ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋์ด ์๋ค.
iap_plugin ํด๋
L iap_plugin_[version].aar
L iap_plugin_[version].jar
์์ธํ ์ค๋ช ์ ๋ ํผ๋ฐ์ค์ ์ํ์ฝ๋๋ฅผ ์ฐธ์กฐํ๋ค.
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')
}
IAP ๋ชจ๋์ด ์ ์ ๋์ํ๊ธฐ ์ํด AndroidManifest.xml
ํ์ผ์ IAP ๋ฒ์ ์ ๋ณด
์ ๋ฐ๋์ ์ค์ ๋์ด์ผ ํ๋ค. ์๋์ ๋ด์ฉ์ด ์ค์ ๋์ง ์์ผ๋ฉด, ์ ์์ ์ธ ๋์์ด ์ด๋ ค์ธ ๋ฟ๋ง ์๋๋ผ, App์ ์ํ ๋ฑ๋ก์ด ์คํจํ ์ ์๋ค.
์ ๊ท๋ฒ์ ๋ถํฐ๋
AndroidManifest.xml
์ ํผ๋ฏธ์ ์ ์ ์ธํ ํ์๊ฐ ์๋ค.๋ํ, SDK์์ ํ์๋ก ํ๋ ๋ฐํ์ํผ๋ฏธ์ ์ ๋ํ ๋์๋, SDK์์ ์ฒ๋ฆฌ ํ๋ฏ๋ก ๊ตฌํํ ํ์๊ฐ ์๋ค.
App์ ๋ฐ๋์ ๋์ด๋ meta-data๋ฅผ ๋ชจ๋ ์ค์ ํด์ผ ํ๋ค.
name
์ ๊ฐ์ ๊ณ ์ ์ด์ง๋ง, value
์ ๊ฐ์ API ๋ฒ์ ์ ๋ฐ๋ผ์ ๋ฐ๋๋ค.
๋ฒ์ 16.XX.XX์ ๊ฒฝ์ฐ, ์๋์ ๊ฐ์ด ์ ๋ ฅํ๋ฉด ๋๋ค.
<application ...... >
<meta-data
android:name="iap:api_version"
android:value="4" />
๊ฒฐ์ ๋๋ ์ฟผ๋ฆฌ(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 ์ธ์คํด์ค์ ์์ฒญ์ ํ๊ณ , ๋ฆฌ์ค๋๋ฅผ ํตํด์ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฌ ๋ฐ๋ ๋น๋๊ธฐ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์๋ค.
์ธ์ฑ ์ํ ๊ตฌ๋งค ์์ฒญ ํธ์ถ/์๋ต ๊ฒฐ๊ณผ์ ๋ฐ๋ฅธ ์ ํฉํ ์ฒ๋ฆฌ๋ ๊ฐ๋ฐ์๊ฐ ์ ์ํ์ฌ ๊ตฌํํด์ผ ํ๋ค.
์ํ๋ ์์ฒญ์ ํ ์ ์๋ ํด๋์ค์ด๋ค. ์ค๋ณต ๊ฐ์ฒด๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ๊ฐ ๊ฐ์ฒด ๋ณ๋ก 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()
public interface RequestCallback {
void onResponse(IapResponse data);
void onError(String reqid, String errcode, String errmsg);
}
์์ฒญ(์ฟผ๋ฆฌ/๊ฒฐ์ )์ ๋ํ ์ฝ๋ฐฑ์ ํด๋น ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฒ์ด์ด์ผ ํ๋ค.
์ธํฐํ์ด์ค๋ฅผ ์ง์ ๊ตฌํ ํ๊ธฐ ๋ณด๋ค๋ 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 ์คํจ ๋ฉ์์ง
์์คํ ์ด ์ธ์ฑ SDK 16.04๋ถํฐ ๋ถ์ ํ ๋ฐฉ๋ฒ์ ํตํ ์์คํ ์ด ํ๋ก๋ชจ์ ์ ์ค๋ณต ์ฐธ์ฌ๋ฅผ ๋ง๊ธฐ ์ํ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์๋ค.
๊ฐ๋ฐ์ฌ๋ ๊ตฌ๋งค ์์ฒญ ์, ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํ๋ ๊ฐ์ธ์ ๊ณ ์ ์๋ณ์๋ฅผ ์ ๋ฌํ๊ณ ํด๋น ์ฌ์ฉ์์ ํ๋ก๋ชจ์ ์ฐธ์ฌ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ๊ฐ์ด ์ ๋ฌํ๋ค.
๋ฐ์ดํฐ ๋ณ์กฐ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ณ ์ ์๋ณ์๋ฅผ Hashํ ํ์ฌ ์ ๋ฌํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
ํ๋ก๋ชจ์ ์ค๋ณต ์ฐธ์ฌ ๋ฐฉ์ง ํ๋ผ๋ฉํฐ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ ํผ๋ฐ์ค(SDK) ํญ์ sendPaymentRequest ํญ๋ชฉ์ ์ฐธ์กฐํ๋ฉด ๋๋ค.
ํด๋น ๊ธฐ๋ฅ์ ์ฐธ์ฌ ์ ํ์ด ์ค์ ๋ ํ๋ก๋ชจ์ ์์๋ง ๋์ํ๋ฉฐ, ์ด๋ ์์คํ ์ด์์ ์ค์ /๊ด๋ฆฌํ๋ค.
๊ฐ ์ค์ ๋ณ๋ก ์ฌ์ฉ์ ์ฐธ์ฌ ๊ฐ๋ฅ ์ฌ๋ถ๋ ์๋ ํ๋ฅผ ์ฐธ๊ณ .
์ฌ์ฉ์ ๊ณ ์ ์ ๋ณด ์ ๋ฌ |
promotion ํ์ฉ ์ฌ๋ถ ์ ๋ฌ |
์ฌ์ฉ์(gameUserID)์ ์ฐธ์ฌ ํ์๊ฐ ์ค์ ๋ ํ๋ก๋ชจ์ |
๊ธฐ์กด ์์คํ ์ด ํ๋ก๋ชจ์ |
---|---|---|---|
O | O | ์ด๋ฒคํธ ์ฐธ์ฌ ๊ฐ๋ฅํ๋ฉฐ, ์ฐธ์ฌ ํ์๋ ์ค์ ๋ ๊ธฐ์ค์ ๋ฐ๋ฆ |
์ด๋ฒคํธ ์ค๋ณต ์ฐธ์ฌ ๊ฐ๋ฅ |
O | X | ์ด๋ฒคํธ ์ฐธ์ฌ ๋ถ๊ฐ | ์ด๋ฒคํธ ์ค๋ณต ์ฐธ์ฌ ๊ฐ๋ฅ |
X | O | ์ด๋ฒคํธ ์ฐธ์ฌ ๋ถ๊ฐ | ์ด๋ฒคํธ ์ค๋ณต ์ฐธ์ฌ ๊ฐ๋ฅ |
X | X | ์ด๋ฒคํธ ์ฐธ์ฌ ๋ถ๊ฐ | ์ด๋ฒคํธ ์ค๋ณต ์ฐธ์ฌ ๊ฐ๋ฅ |
ํด๋น ๊ธฐ๋ฅ์ android OS 4.0 ์ด์์ ๋จ๋ง์์๋ง ๋์ํ๋ค.
์๋ต ํด๋์ค (๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ฒด ํํ๋ก ๊ฐ์ง๊ณ ์์)์ด๋ค. 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;
...
}
์์ฒญ ์ฒ๋ฆฌ ํ์ ์ ์ ์ํ enum์ด๋ค.
public enum ProcessType {
BACKGROUND_ONLY,
FOREGROUND_IF_NEEDED,
}
๊ธฐ๋ณธ์ ์ผ๋ก FOREGROUND_IF_NEEDED
์ ์ค์ ์ ์ถ์ฒํ๋ค.
์์ฒญ ์ฒ๋ฆฌ ๊ณผ์ ์์ Ui ๋ ธ์ถ์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์๋ฅผ ๋ค์ด,
- ํผ๋ฏธ์ ์๊ตฌ ํ๋ฉด
- ONE Store Service(OSS) ์ค์น ์๊ตฌ ํ๋ฉด
์์ ๊ฐ์ ์ํฉ๋ค์ด ์กด์ฌํ๋ค. ์ด๋ฐ ์ํฉ์ ๋ํด์ ์์ฒญ์ ์ค์ง ์ํค๊ณ ์๋ฌ๋ฅผ ๋ฐ๊ณ ์ถ๋ค๋ฉด, BACKGROUND_ONLY
๋ก ์์ฒญ์ ํ๋ฉด ๋๋ค.
- ์ด๊ธฐํ
// 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);
- ๊ฒฐ์ ์๋ต
@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)๋ฅผ ์๋ฃ ํ ํ, ์์ฉ์๋ฒ์ธํ ์ผ๋ก ์ ํ๋ง ํ์ฌ ์งํํด๋ ๋๋ค.
[์ํํํฉ]ํ์ด์ง์์ [In-App]ํญ์ ์ ํํ์ฌ [ํ ์คํธ]๋ฒํผ์ ํด๋ฆญํ๋ค.
[ํ ์คํธ]๋ฒํผ์ ํด๋ฆญํ๋ฉด, ์๋์ ๊ฐ์ Self Test Pop-up ์ฐฝ์ด ๋ํ๋๋ค. [ํ ์คํธ๋จ๋ง]ํญ์์ ํ ์คํธ์ ์ฌ์ฉํ ๋จ๋ง๋ค์ MDN๊ณผ ์ํ์ฉ T stroe Cash ๋ฑ์ ๋ฑ๋กํ๋ค. ํ ์คํธ ๋จ๋ง์ ๋ฑ๋ก๋ ํ ์คํธ๋ฒํธ๋ฅผ ์ฌ์ฉํด์ผ ํ ์คํธ๊ฐ ๊ฐ๋ฅํ๋ค.
Self Test ๊ฐ์ ์ค์
selfTest ๋ฅผ ํ๊ธฐ ์ด๋ ค์ด ํด์ธ๊ฐ๋ฐ์ฌ ๋๋ ์์คํ ์ด ๋ฏธ์ง์ ๋จ๋ง๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๋ถ๋ค์ "IAP Setting App" ์ ์ฌ์ฉํ์๋ฉด ์ ์์ ์ผ๋ก ํ ์คํธ๋ฅผ ํ ์ ์์ต๋๋ค. ์์ APP์ ๋ค์ด๋ฐ๊ณ ์๋ ์ค๋ช ์ ๋ฐ๋ผ์ ์ค์ ์ ํ๊ธฐ์ ๋ฐ๋๋๋ค.
- "Enable Setting" ์ ์ฒดํฌํ์ธ์.
- "ํต์ ์ฌ(Carrier)"๋ฅผ ์ค์ ํ๊ณ "ํธ๋ํฐ๋ฒํธ(MDN)"๋ฅผ ์ ๋ ฅํ์ธ์.
- ์ค์ ์ฑ์ ๋๊ณ , ์ฑ์ ํ ์คํธ ํ์ธ์.
Self Test Pop-Up ์ฐฝ์ [์ํ๋ณ ์ค์ ] ํญ์์๋ ํ ์คํธํ๊ณ ์ ํ๋ App์ ์ธ์ฑ ์ํ ๋ฆฌ์คํธ๊ฐ ํ๋ก ๋ํ๋๋ค. ๋ฆฌ์คํธ์์ ์ํํ๊ณ ์ ํ๋ ์์์ ์ธ์ฑ ์ํ๋ฅผ ์ ํํ์ฌ ๊ฐ๋ณ ์ธ์ฑ ์ํ ์ํ ํ๊ฒฝ ์ค์ ํ์ด์ง๋ก ์ด๋ํ๋ค. ์ด๋ ๋ฐฉ๋ฒ์ ์ธ์ฑ ์ํ์ ์ ๋ชฉ์ ์ ํํ์ฌ ํด๋ฆญํ๋ฉด ๋๋ค.
์ธ์ฑ ์ํ ์ํ ํ๊ฒฝ ์ค์ ํ์ด์ง์์๋ ๋ค์ํ ๊ฒฐ์ ์ํฉ์ ์ ํํ๋ฉด์ ์ํํด ๋ณผ ์ ์๋ค. [๊ฒฐ๊ณผ์ค์ ]์ ์ ์๋ ๊ฐ๋ค ์ค ํ๋๋ฅผ ์ ํํ์ฌ [์ ์ฅ] ๋ฒํผ์ ๋๋ฅด๋ฉด ์์์ ์ธ์ฑ ์ํ ๋ชฉ๋ก ํ๋ฉด์ผ๋ก ์ด๋ํ๋ค.
[๊ฒฐ๊ณผ์ค์ ]์์ "์ ์"์ ์ ํํ์ ๋๋ง ๊ณผ๊ธ์ด ์ด๋ฃจ์ด์ง๊ณ , ๋๋จธ์ง ๊ฐ์ ์ ํํ๋ฉด ๊ณผ๊ธ์ด ์ด๋ฃจ์ด ์ง์ง ์์์ผ ํ๋ค.
๊ฐ๋ฐ ์๋ฃํ ์ฑ์ ์คํํ ๋ค ๊ฒฐ๊ณผ ์ค์ ์ ์๋ฃํ ์ธ์ฑ ์ํ์ ๊ตฌ๋งคํ์ฌ ํ ์คํธํ๋ค. ๊ฒฐ์ ๊ฐ ์ฑ๊ณตํ๋ฉด ํด๋น ์ธ์ฑ ์ํ์ ํ ์คํธ ๊ฒฐ๊ณผ๊ฐ ์๋์ ๊ฐ์ด Y๋ก ๋ณ๊ฒฝ๋๋ค.
Self Test Pop-up ์ฐฝ์ [๊ณผ๊ธ ๋ก๊ทธ ์กฐํ] ํญ์์๋ ์ด์ ๋จ๊ณ์์ ์ค์ ํ ์ํ ํ๊ฒฝ์ ๋ง์ถ์ด ์ํํ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ค. [๊ฒฐ๊ณผ์ค์ ๊ณผ๊ธ๊ฒฐ๊ณผ]์ด์๋ ์ด์ ๋จ๊ณ์์ ์ค์ ํ "๊ฒฐ๊ณผ์ค์ " ๊ฐ๊ณผ ๊ณผ๊ธ์ ์ ์ ์ฌ๋ถ๊ฐ "์ฑ๊ณต" ๋๋ "์คํจ"๋ก ํ์๋๋ค.
๊ณผ๊ธ ๊ฒฐ๊ณผ๊ฐ "์คํจ"์ธ ๊ณผ๊ธ ๋ก๊ทธ๋ฅผ ์ ํํ๋ฉด ์๋์ ๊ฐ์ด ๊ณผ๊ธ ๋ก๊ทธ ์์ธ ํ์ด์ง๋ก ๋ฐ๋๋ฉด์, ์คํจ ์์ธ์ ๋ํ ์ค๋ช ์ ๋ณผ ์ ์๋ค.
์ํ์ ์ํ์ ๋ฐ๋ผ์, ์์ฉํ ์คํธ๊ฐ ๊ฐ๋ฅํ ๊ฒ์ด ๋ค๋ฅด๋ฉฐ ๋ถ๊ฐ ํ ์๋ ์๋ค.
- ๋ฑ๋ก์ค : ํ ์คํธ ๋ถ๊ฐ, ์ธ์ฑSDK์ ์ฐ๋ ๊ณผ์ ์์, -1001์๋ฌ๊ฐ ๋ฐ์ (์ฐธ๊ณ : ๋ ํผ๋ฐ์ค(Result-Code))
-
๊ฒ์ฆ์ค
- ์ ๊ท ๊ฒ์ฆ์ ๊ฒฝ์ฐ : ํ ์คํธ ๋ถ๊ฐ (ํ๋งค์ค์ธ ์ํ์ด ์๋ ์ํ)
- ์ฑ ์ ๋ฐ์ดํธ ๊ฒ์ฆ์ ๊ฒฝ์ฐ : ํ๋งค์ค์ธ ์ํ ์ ๋ํด์๋ง ํ ์คํธ ๊ฐ๋ฅ
- ํ๋งค์ค : ํ ์คํธ ๊ฐ๋ฅ
IAP ์ํ์ ์์คํ ์ด ๊ฐ๋ฐ์์ผํฐ์ App ๊ฒ์ฆ์ ํตํด์ ์์ฉ ๊ฒฐ์ ํ ์คํธ๋ฅผ ์๋ฃํด์ผ๋ง ๋ฐฐํฌ ๋ฐ ํ๋งค๊ฐ ๊ฐ๋ฅํ๋ค. Self Test๊ฐ ์๋ฃ๋๋ฉด, ๊ฐ๋ฐ์๋ ์ฑ์ ์ ์ฉ๋ ๊ฐ๋ฐ์ฉ ์๋ฒ ์ธํ ์ ์์ฉ ์๋ฒ ์ธํ ์ผ๋ก ๋ณ๊ฒฝํ์ฌ ๋น๋ํ ๋ค์ ๊ฒ์ฆ์ ์์ฒญํ๋ค.
์ธ์ฑ ์ํ์ ํ ์คํธ ๊ฒฐ๊ณผ๊ฐ
Y
๊ฐ ์๋ ์ํ์ด ํ๋๋ผ๋ ์์ผ๋ฉด ๊ฒ์ฆ ์์ฒญ ๋ฒํผ์ด ํ์ฑํ ๋์ง ์๋๋ค. ๋ณด๋ค ์์ธํ ๋ด์ฉ์ ์ํ ๋ฑ๋ก ๊ฐ์ด๋ ๋ฅผ ์ฐธ๊ณ
// ๋๋ฒ๊ทธ์ฉ
//mPlugin = IapPlugin.getPlugin(activity, IapPlugin.DEVELOPMENT_MODE);
// ์์ฉ
mPlugin = IapPlugin.getPlugin(activity, IapPlugin.RELEASE_MODE);
์ด์ฉ์๊ฐ ๊ตฌ๋งคํ ์ธ์ฑ์ํ์ ๋ํด์ ์์ดํ ๋ฏธ์ง๊ธ ๋ฑ์ ์ด์ ๋ก ๊ตฌ๋งค์ทจ์๋ฅผ ์์ฒญํ ๊ฒฝ์ฐ, ์ทจ์ ์ ์ฐจ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ด์ฉ์๊ฐ ๊ฐ๋ฐ์ฌ ๋๋ ์์คํ ์ด ๊ณ ๊ฐ์ผํฐ์ ๊ตฌ๋งค์ทจ์ ์์ฒญ
- ๊ฐ๋ฐ์ฌ๊ฐ ๊ฐ๋ฐ์์ผํฐ์์ ๊ฒฐ์ ์ด๋ ฅ ํ์ธ ํ ๊ตฌ๋งค์ทจ์ ์์ฒญ
- ์์คํ ์ด ๋ด๋น๋ถ์์์ ํ์ธ ํ ๊ตฌ๋งค์ทจ์ ์ฒ๋ฆฌ
๊ณ ๊ฐ์ ๊ตฌ๋งค์ด๋ ฅ์ ํ์ผํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
- ๊ฐ๋ฐ์์ผํฐ > ๊ณ ๊ฐ์ง์ > TxID ๊ตฌ๋งค์ด๋ ฅ ๊ด๋ฆฌ
- ๊ฐ๋ฐ์์ผํฐ > ์ง์ ๋ฌธ์ํ๊ธฐ > ๊ณ ๊ฐVOC > ์์ธ๋ณด๊ธฐ(ํ์ )
๋ณด๋ค ์์ธํ ๋ด์ฉ์ ๊ณ ๊ฐ ๊ด๋ฆฌํ๊ธฐ๊ฐ์ด๋๋ฅผ ์ฐธ๊ณ ํ๋ค.