모든 문서(일반 문서, 분류 문서, 파일(이미지, 사운드 등) 문서)는 분류가 달려 있어야 합니다.
--Administrator (토론)
InApp Purchase 모듈 적용 가이드 (Android)
컴투스위키
Com2uS 공통모듈 | >> | InApp Purchase | >> | InApp Purchase 모듈 적용 가이드 (iOS)
InApp Purchase 모듈 적용 가이드 (Android) |
>> | InApp Purchase 모듈 레퍼런스 가이드 | >> | InApp Purchase 샘플 가이드 (Android) | >> | InApp Purchase FAQ |
역사
<작성법 참고>
Version | Date | SVN Revision | 담당자 | 변경 사항 |
---|---|---|---|---|
2.17.2 | 2020-09-25 | - | 최지수 |
|
2.17.0 | 2020-05-22 | - | 김현석 |
|
2.16.5 | 2020-03-12 | - | 김현석 |
|
2.16.4 | 2020-01-23 | - | 김현석 |
|
2.16.3 | 2019-12-12 | - | 최지수 |
|
2.16.2 | 2019-10-16 | - | 최지수 |
|
2.16.0 | 2019-06-27 | - | 최지수 |
|
2.15.5 | 2019-06-25 | - | 최지수 |
[라이브러리 및 리소스 배포 변경사항]
|
2.15.3 | 2019-04-01 | 2861 | 최지수 |
|
2.15.2 | 2019-03-25 | 2860 | 최지수 |
|
2.15.1 | 2019-03-14 | 2859 | 최지수 |
|
2.15.0 | 2018-11-20 | 2851 | 최지수 |
|
2.14.4 | 2018-10-01 | 2846 | 최지수 |
|
2.14.3 | 2018-08-31 | 2844 | 최지수 |
|
2.14.2 | 2018-06-27 | 2841 | 최지수 |
|
2.14.1 | 2018-05-02 | 2838 | 최지수 |
|
2.14.0 | 2018-02-07 | 2833 | 최지수 |
|
2.13.7 | 2017-08-28 | 2816 | 최지수 |
|
2.13.6 | 2017-07-25 | 2811 | 최지수 |
|
2.13.5 | 2017-03-07 | 2806 | 정다운 |
|
2.13.4 | 2017-01-26 | 2803 | 정다운 |
|
2.13.3 | 2016-12-08 | 2799 | 정다운 |
업데이트 되어 InAppTstoreSDK.jar 모듈 업데이트 재배포. 반드시 리비전 2799버전으로 이용부탁드립니다, (간헐적으로 콜백이 전달되지 않던 이슈 수정) |
2.13.2 | 2016-11-30 | 2798 | 정다운 |
|
2.13.1 | 2016-11-28 | 2796 | 정다운 |
|
2.13.0 | 2016-11-21 | 2795 | 정다운 |
|
2.12.4 | 2016-07-27 | 2783 | 정다운 |
|
2.12.3 | 2016-03-24 | 2760 | 김규진 |
|
2.12.2 | 2016-01-20 | 2745 | 김규진 |
|
2.12.1 | 2016-01-04 | 2738 | 김규진 |
|
2.10.1 | 2015-06-22 | 2690 | 김규진 |
|
2.10.0 | 2015-06-05 | 2674 | 김규진 |
|
2.9.9 | 2015-04-14 | 2659 | 박가진 |
|
2.9.8 | 2015-03-25 | 2653 | 박가진 |
|
2.9.7 | 2015-03-03 | 2645 | 박가진 |
|
2.9.6 | 2015/02/02 | 2637 | 안영철 |
|
2.9.5 | 2015/01/28 | 2636 | 안영철 |
|
2.9.5 | 2015/01/13 | 2633 | 안영철 |
|
2.9.4 | 2014/12/08 | 2615 | 안영철 |
|
2.9.3 | 2014/11/06 | 2605 | 임성훈 |
|
2.9.2 | 2014/10/28 | 2599 | 임성훈 |
|
2.9.2 | 2014/09/26 | 2576 | 임성훈 |
|
2.9.1 | 2014/08/05 | 2567 | 임성훈 |
|
2.8.5 | 2014/04/29 | 2552 | 임성훈 |
|
2.8.4.1 | 2014/04/09 | 2546 | 조태형(이덕신) |
|
모든 버전의 역사 보기
Android 유의 사항
<작성법 참고>
Wrapper Project 에서 Log on / off 설정 방법
- MainActivity.java 의 modulemanager 에서 수정
- mModuleManager.setLogged(boolean b);
- 그 외에는 InApp 객체의 setLogged(boolean b) 를 사용
<작성법 참고>
InApp Purchase v2.8.3 (Tstore SDK v13.01.00) 적용 시
- 아래 내용 참고
- Client side
- libs 폴더에 아래의 파일들을 업데이트 해 줍니다. (build path 체크해주세요)
- InAppDefaultLibrary.jar
- InAppTstoreLibrary.jar
- InAppTstoreSDK.jar
-
InAppTstoreSDK_Debug.jar(이번 버전부터는 SDK 파일이 통합되어 쓰이지 않습니다) - gson-2.2.2.jar (새로 추가 됨)
- libs / armeabi / libdodo.so (새로 추가 됨)
- libs / armeabi / libUSTOOLKIT.so (새로 추가 됨)
- libs / armeabi-v7a / libdodo.so (새로 추가 됨)
- libs / armeabi-v7a / libUSTOOLKIT.so (새로 추가 됨)
- + wrapper project 의 경우 C2SInApp.h 와 libinapp.a 도 업데이트 해 주세요.
- + TStore 마켓과 Hub2.1을 동시에 적용했을 때
- + Unable to execute dex: Multiple dex files define Landroid/net/http/SslError;
- + 이와 같은 에러가 발생한다면 Peppermint_dist/libs/weibo_sdk.jar 파일을 삭제하고 빌드하시면 됩니다.
- AndroidManifest.xml 을 아래와 같이 수정해 줍니다.
- <uses-permission android:name="android.permission.INTERNET"/>
- <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
- <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.RECEIVE_SMS" />
- <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> (새로 추가 됨)
- <uses-permission android:name="com.tmoney.vending.INBILLING" /> (삭제 됨) (Tstore SDK v14.01.01)
- <permission android:name="com.tmoney.vending.INBILLING" /> (삭제 됨) (Tstore SDK v14.01.01)
- (삭제 됨)
<activity
android:label="@string/app_name"
android:name="com.feelingk.iap.PwdActivity"
android:configChanges="orientation|screenSize" />
<activity
android:label="Tstore"
android:name="com.com2us.module.inapp.tstore.TstoreBillingView"
android:configChanges="orientation|screenSize"
android:theme="@android:style/Theme.Translucent" />
<receiver
android:name="com.feelingk.iap.SmsReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
android:label="@string/app_name"
android:name="com.feelingk.iap.PwdActivity"
android:configChanges="orientation|screenSize" />
<activity
android:label="Tstore"
android:name="com.com2us.module.inapp.tstore.TstoreBillingView"
android:configChanges="orientation|screenSize"
android:theme="@android:style/Theme.Translucent" />
<receiver
android:name="com.feelingk.iap.SmsReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
- (새로 추가 됨)
<!-- Tstore -->
<meta-data
android:name="iap:api_version"
android:value="1" />
<activity
android:name="com.skplanet.dodo.IapWeb"
android:configChanges="orientation|locale|keyboardHidden|layoutDirection|screenSize"
android:excludeFromRecents="true"
android:windowSoftInputMode="stateHidden" />
<meta-data
android:name="iap:api_version"
android:value="1" />
<activity
android:name="com.skplanet.dodo.IapWeb"
android:configChanges="orientation|locale|keyboardHidden|layoutDirection|screenSize"
android:excludeFromRecents="true"
android:windowSoftInputMode="stateHidden" />
- (Inapp v2.13.0 이후)
api_version이 4로 변경되었습니다.
<!-- Tstore -->
<meta-data
android:name="iap:api_version"
android:value="4" />
<meta-data
android:name="iap:api_version"
android:value="4" />
- Callback 부분에서 success stateValue 의 배열 index 값 중 기존에 TSTORE_TID = 4, TSTORE_DATELOCAL = 5 이 삭제 되고
- TSTORE_TRANSACTION = 4 로 수정되었습니다.
- TSTORE_TRANSACTION 에는 Tstore 에서 결제 시 내려주는 원본 json 형태의 string 값이 담겨 있으며 대략 아래와 같은 형태로 담겨져 있습니다. (길이상 개행이 들어가 있으므로 실제로는 붙여야 합니다)
{"api_version":"1", "identifier":"1383887598931", "method":"purchase", "result": {"code":"0000", "message":"\uc694\uccad\uc774\uc131\uacf5\ud588\uc2b5\ub2c8\ub2e4.", "count":1, "txid":"TX_00000000082861", "receipt":"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", "product": [{"name":"healingpotion", "kind":"consumable", "id":"0900395110", "price":100}] }}
- 위 내용을 Server 로 보내어 검증결과에 따라 아이템을 지급하면 됩니다.
- iapUseTestServer() 시 테스트 모드 (Debug mode) 로 전환됩니다. 기존에 jar 파일로 구분하던 방식이 소스단으로 옮겨 졌습니다. 납품전 테스트 시엔 iapUseTestServer() 를 호출 해 주세요.
- iapInitialize() 시 GET_ITEM_LIST 콜백을 지원합니다.
- 이번 버전부터 AppStore, GooglePlay 처럼 initialize 시 GET_ITEM_LIST 로 콜백이 옵니다. 하지만 마켓에서 localizedDescription 에 대한 부분은 지원하지 않아 "" 으로 가게 됩니다.
- iapRestoreItem(String uid) API 를 지원합니다.
- 이전버전에는 복구시, 다시 구매 해봤을때 기 구매한 상품이면 RESTORE_SUCCESS 콜백을 주는 방식이었으나, 마켓에서 지원으로 iapRestoreItem() API 를 호출하면 RESTORE_SUCCESS 콜백이 가게 됩니다.
- Server side
- - 기존의 TID 형식이 deprecated 되었습니다. (아직 사용은 가능 합니다.)
- - 기존처럼 발급하여 클라이언트에서 orderKey 부분에 TID 값을 넣어주면 동작은 합니다.
- - 영수증 처리에 관한 부분은 아래 링크의 pdf 를 참고 해 주세요.
<작성법 참고>
InApp Purchase v2.13.0+ (Tstore SDK v16.02.00+) 적용 시
- 아래 내용 참고
- Client side
- libs 폴더에 아래의 파일들을 업데이트 해 줍니다. (build path 체크해주세요)
- InAppDefaultLibrary.jar
- InAppTstoreLibrary.jar
- InAppTstoreSDK.jar
- gson-2.2.2.jar
- + wrapper project 의 경우 C2SInApp.h 와 libinapp.a 도 업데이트 해 주세요.
- + TStore 마켓(One Store)과 Hub2.6을 동시에 적용했을 때
- + Unable to execute dex: Multiple dex files define Landroid/net/http/SslError;
- + 이와 같은 에러가 발생한다면 Peppermint_dist/libs/weibo_sdk.jar 파일을 삭제하고 빌드하시면 됩니다.
- AndroidManifest.xml 을 아래와 같이 수정해 줍니다.
- <uses-permission android:name="android.permission.INTERNET"/>
- <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
- <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.RECEIVE_SMS" /> (삭제 됨)
- <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> (삭제 됨)
- (추가 필요)
<!-- One store -->
<meta-data
android:name="iap:api_version"
android:value="4" />
<activity
android:name="com.skplanet.dodo.IapWeb"
android:configChanges="orientation|locale|keyboardHidden|layoutDirection|screenSize"
android:excludeFromRecents="true"
android:windowSoftInputMode="stateHidden" />
<meta-data
android:name="iap:api_version"
android:value="4" />
<activity
android:name="com.skplanet.dodo.IapWeb"
android:configChanges="orientation|locale|keyboardHidden|layoutDirection|screenSize"
android:excludeFromRecents="true"
android:windowSoftInputMode="stateHidden" />
<작성법 참고>
InApp Purchase v2.15.0+ (Tstore SDK v16.05.00+) 적용 시
- 아래 내용 참고
- Client side
- libs 폴더에 아래의 파일들을 업데이트 해 줍니다. (build path 체크해주세요)
- InAppDefaultLibrary.jar
- InAppTstoreLibrary.jar
- InAppTstoreSDKv4-16.05.00.jar
- gson-2.2.2.jar
- + wrapper project 의 경우 C2SInApp.h 와 libinapp.a 도 업데이트 해 주세요.
- + TStore 마켓(One Store)과 Hub2.6을 동시에 적용했을 때
- + Unable to execute dex: Multiple dex files define Landroid/net/http/SslError;
- + 이와 같은 에러가 발생한다면 Peppermint_dist/libs/weibo_sdk.jar 파일을 삭제하고 빌드하시면 됩니다.
- AndroidManifest.xml 을 아래와 같이 수정해 줍니다.
- <uses-permission android:name="android.permission.INTERNET"/>
- <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
- <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- (추가 필요)
<!-- One store -->
<meta-data
android:name="iap:api_version"
android:value="4" />
<activity
android:name="com.skplanet.dodo.IapWeb"
android:configChanges="orientation|locale|keyboardHidden|layoutDirection|screenSize"
android:excludeFromRecents="true"
android:windowSoftInputMode="stateHidden" />
<meta-data
android:name="iap:api_version"
android:value="4" />
<activity
android:name="com.skplanet.dodo.IapWeb"
android:configChanges="orientation|locale|keyboardHidden|layoutDirection|screenSize"
android:excludeFromRecents="true"
android:windowSoftInputMode="stateHidden" />
<작성법 참고>
InApp Purchase v2.15.0+ (Tstore SDK v17.02.00+) 적용 시 (원스토어 IAP v5)
- 아래 내용 참고
- Client side
- libs 폴더에 아래의 파일들을 업데이트 해 줍니다. (build path 체크해주세요)
- InAppDefaultLibrary.jar
- InAppTstoreLibrary.jar
- InAppTstoreSDKv5-17.02.00.jar
- gson-2.2.2.jar
- + wrapper project 의 경우 C2SInApp.h 와 libinapp.a 도 업데이트 해 주세요.
- + TStore 마켓(One Store)과 Hub2.6을 동시에 적용했을 때
- + Unable to execute dex: Multiple dex files define Landroid/net/http/SslError;
- + 이와 같은 에러가 발생한다면 Peppermint_dist/libs/weibo_sdk.jar 파일을 삭제하고 빌드하시면 됩니다.
- 원스토어 IAP v4에서 IAP v5 으로 변경 시
- 원스토어 콘솔에서 기존 IAP v4로 설정된 셋팅을 IAP v5로 업데이트 할 수 없습니다.
- 새로운 앱아이디로 원스토어 콘솔에 등록해야하며 아이템도 새로 등록해야 합니다. (새 앱아이디 사용)
- 2018.11 시점 기준으로 원스토어에서 IAP v4와 IAP v5를 병행 서비스하고 있어 IAP v4가 서비스 제한되는 시기는 언급된바가 없습니다. 기존에 IAP v4를 사용하고 있다면 강제로 업데이트할 필요는 없습니다.
- 관련하여 구체적인 문의는 GCP 클라이언트팀으로 문의 바랍니다.
- 원스토어 콘솔에서 기존 IAP v4로 설정된 셋팅을 IAP v5로 업데이트 할 수 없습니다.
- 원스토어 IAP v5 적용 시 설정
- 원스토어 IAP v5는 Google IAP 결제와 유사한 구매 형태를 갖습니다. 아이템 구매, 구매 복구, 구매 완료 등 모듈에서 제공하는 API의 라이프사이클을 Google과 유사하게 맞춰 개발하면 보다 수월하게 적용이 가능합니다.
- 원스토어 IAP v5 콘솔 적용 시 주의사항
- (1) 원스토어 IAP v5 콘솔에 keystore 사이닝 된 apk 업로드
원스토어 구매 테스트 시 콘솔에 keystore 사이닝 된 apk를 업로드해야 합니다. 이후 구매 테스트는 꼭 keystore 사이닝 된 샘플로 진행해야 가능합니다. - (2) 패키지 네임(앱아이디) 일치
AndroidManifest.xml에 설정된 패키지 네임은 꼭 원스토어 콘솔에 등록된 패키지 네임과 일치해야 합니다. - (3) 구매 테스터 등록
테스터는 원스토어 계정으로 등록됩니다. 또한 정상 구매를 위해서는 원스토어 앱이 업데이트 되어있어야 하며, 테스트 계정이 원스토어 앱에 로그인되어 있어야 합니다.
- (1) 원스토어 IAP v5 콘솔에 keystore 사이닝 된 apk 업로드
- AndroidManifest.xml 을 아래와 같이 수정해 줍니다.
- <uses-permission android:name="android.permission.INTERNET"/>
- <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
- <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- (추가 필요)
<!-- One store -->
<meta-data
android:name="iap:api_version"
android:value="5" /> // version 5
<meta-data
android:name="iap:api_version"
android:value="5" /> // version 5
- API 호출 특이사항
- InApp 모듈 초기화 시 특이사항 (원스토어 IAP v5)
- iapInitialize(..) API(초기화 API) 호출 시 원스토어 앱에 로그인이 되어있지 않은 경우 원스토어 앱 로그인 화면으로 전환됩니다. 또는 원스토어 앱이 미설치 및 업데이트 되어있지 않은 경우 설치 혹은 업데이트 화면으로 전환됩니다.
- >> 이때 초기화 API가 별도의 콜백을 주지 않아 아이템 정보를 획득하지 못한 상태가 됩니다. 이런 경우 상점 진입 시 아이템 정보 획득 여부를 확인 후 초기화 API를 다시 호출해서 아이템 정보를 획득 바랍니다.
- >> 관련 작동은 추후 버전에서 별도의 콜백을 전달하도록 개선될 예정입니다. (v2.15.2 예상)
- >> [iapInitialize(..) API]
- 아이템 구매(iapBuyItem API 관련) 시 특이사항 (원스토어 IAP v5)
- iapBuyItem(..) API 호출 시 additionalInfo 값으로 현재 시간의 밀리세컨드(ms) 값을 넣어줍니다.
- >> Java의 경우 String addtionalInfo = String.valueOf(System.currentTimeMillis()); 와 같이 값을 획득할 수 있습니다.
- >> 단말이 내 시스템이 전달하는 API를 통해 자유롭게 반환받아 넣어줍니다.
- >> [iapBuyItem(..) API]
- 특정 버전에서 확인된 버그 (원스토어 IAP v5)
- v2.15.0, v2.15.1에서 원스토어 IAP v5 의 경우 iapRestoreItem API 호출 시 로컬 데이터에 구매복구할 아이템 정보가 없는 경우 크래시가 발생하는 이슈를 확인하여 v2.15.2에서 개선되었습니다.
- 때문에, v2.15.0, v2.15.1은 사용하지 말아주시고, v2.15.2 부터 적용을 부탁드립니다.
- 콜백 변경사항
- InApp v2.15.5부터 OneStore IAP v5에서 전달되는 콜백은 errorCode가 c2s가 아닌 onestore로 변경되었습니다.
- 때문에, 인앱 콜백에서 errorCode를 파싱하는 하려는 경우 원스토어 IAP v5는 onestore로 파싱해야 합니다. (errorCode의 경우 마켓별로 별도로 키카 정해져있지 않은 경우가 있습니다. 특별한 경우가 아니라면 errorValue로 콜백의 상태를 체크하는 것을 권장드립니다.)
<작성법 참고>
InApp Purchase v2.14.0+ 에서 Lebi 충전 수단으로 WeChat Pay 적용 시
- 아래 내용 참고
- Client side
- libs 폴더에 아래의 WeChat 라이브러리를 추가합니다.
- wechat-sdk-android-with-mta_5.0.8.jar
- + InAppLebiLibrary.jar 를 사용하고 러비 기능을 사용하고 있다면 wechat-sdk-android-with_5.0.8.jar를 필수로 추가해야 합니다. (WeChat 기능 사용 여부와 상관 없이 필수 추가)
- 또한 /res/values/strings.xml 에도 wechat_appid와 wechat_key를 필수로 설정해야합니다. 만약 WeChat을 사용하지 않는다면 태그를 선언만 하고 내용은 빈 값으로 두어야 합니다. (아래 strings.xml 관련 내용 확인)
- AndroidManifest.xml 에 아래와 같이 추가합니다. ( <application> 태그 안에 추가 )
- (추가 필요)
<!-- WeChat Pay -->
<activity
android:name="com.com2us.module.inapp.lebi.WeChatPayActivity" />
<activity-alias android:name=".wxapi.WXPayEntryActivity"
android:targetActivity="com.com2us.module.inapp.lebi.WeChatPayActivity"
android:exported="true" />
<activity
android:name="com.com2us.module.inapp.lebi.WeChatPayActivity" />
<activity-alias android:name=".wxapi.WXPayEntryActivity"
android:targetActivity="com.com2us.module.inapp.lebi.WeChatPayActivity"
android:exported="true" />
<작성법 참고>
InApp Purchase v2.14.0+ 에서 Lebi 충전 수단으로 WeChat Pay 적용 시
- 아래 내용 참고
- Client side
- libs 폴더에 아래의 WeChat 라이브러리를 추가합니다.
- wechat-sdk-android-with-mta_5.0.8.jar
- + InAppLebiLibrary.jar 를 사용하고 러비 기능을 사용하고 있다면 wechat-sdk-android-with_5.0.8.jar를 필수로 추가해야 합니다. (WeChat 기능 사용 여부와 상관 없이 필수 추가)
- 또한 /res/values/strings.xml 에도 wechat_appid와 wechat_key를 필수로 설정해야합니다. 만약 WeChat을 사용하지 않는다면 태그를 선언만 하고 내용은 빈 값으로 두어야 합니다. (아래 strings.xml 관련 내용 확인)
- AndroidManifest.xml 에 아래와 같이 추가합니다. ( <application> 태그 안에 추가 )
- (추가 필요)
<!-- WeChat Pay -->
<activity
android:name="com.com2us.module.inapp.lebi.WeChatPayActivity" />
<activity-alias android:name=".wxapi.WXPayEntryActivity"
android:targetActivity="com.com2us.module.inapp.lebi.WeChatPayActivity"
android:exported="true" />
<activity
android:name="com.com2us.module.inapp.lebi.WeChatPayActivity" />
<activity-alias android:name=".wxapi.WXPayEntryActivity"
android:targetActivity="com.com2us.module.inapp.lebi.WeChatPayActivity"
android:exported="true" />
- /res/values/strings.xml 에 아래와 같이 추가합니다.
- - wechat_appid : WeChat에 앱 사용 요청을 하여 발급받은 WeChat 앱 아이디 입니다.
- - wechat_key : WeChat에 앱 사용 및 페이 기능 사용을 요청하여 발급받은 Sign 값 생성용 key 입니다.
- (wechat_appid, wechat_key를 발급받는 절차는 가이드 문서로 추후 업데이트 할 예정입니다.)
- (추가 필요)
<!-- WeChat Pay -->
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="wechat_appid">wx815adfc016b5f4bd</string>
<string name="wechat_key">auITSZisSYHnAb5ISD58QRm7uTTdVW7d</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="wechat_appid">wx815adfc016b5f4bd</string>
<string name="wechat_key">auITSZisSYHnAb5ISD58QRm7uTTdVW7d</string>
</resources>
- - (v2.14.0) 만약, Lebi를 사용하나 WeChat을 지원하지 않는 경우 아래와 같이 태그만 선언합니다. (태그가 없을 경우 크래시가 발생합니다!)
- - (v2.14.1+) 태그를 선언하지 않아도 크래시가 발생하지 않습니다. 다만 위챗이 러비 충전 수단에서 제외되어 나타납니다.
- (v2.14.0 사용 시 아래 내용 추가 필요)
<!-- WeChat Pay -->
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="wechat_appid"></string>
<string name="wechat_key"></string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="wechat_appid"></string>
<string name="wechat_key"></string>
</resources>
<작성법 참고>
InApp Purchase v2.16.0+ 에서 Samsung GalaxyStore 적용 시
- 아래 내용 참고
- Client side
- libs 폴더에 아래의 Samsung GalaxyStore 라이브러리를 추가합니다.
- SamsungInAppPurchase_5.1.0.aar
- + InAppPurchase v2.15.5 이상부터 Android Studio 라이브러리인 .aar 파일로 배포되고 있습니다. 따라서 InAppPurchase-2.x.x.aar 라이브러리를 꼭 추가 바랍니다.
- AndroidManifest.xml 에 아래와 같이 추가합니다. ( <manifest> 태그 안에 추가 )
- (추가 필요)
<!-- Samsung GalaxyStore -->
<uses-permission android:name="com.samsung.android.iap.permission.BILLING"/>
<uses-permission android:name="com.samsung.android.iap.permission.BILLING"/>
- Samsung GalaxyStore 사용 시 반환되는 에러 정의
- 콜백으로 전달되는 errorCode에 대해서 아래 내용을 확인 바랍니다.
- Samsung GalaxyStore 사용 시 반환되는 에러 정의
/**
* Samsung IAP Response Code
* 0 Success
* 1 Payment canceled
* -1000 Failure during IAP initialization
* -1001 IAP upgrade is required
* -1002 Error while running IAP
* -1003 Error when a non-consumable product is re-purchased or a subscription product is re-purchased before its expiry date.
* -1004 Error when a payment request is made withoutbundle information.
* -1005 Error when the requested item list is not available.
* -1006 If the payment result is not received after making a payment request to the server, the purchased product list should be confirmed, because the payment may have occurred successfully. This error message appears in this situation.
* -1007 Error when item group ID does not exist.
* -1008 Error when network is not available.
* -1009 IOException
* -1010 SocketTimeoutException
* -1011 ConnectTimeoutException
* -1012 The item is not for sale in the country.
* -1013 IAP is not serviced in the country.
* -1014 Samsung account is not signed in.
*
* -2000 Need Initialize (스토어 초기화 함수를 호출하지 않은 상태 - 인앱 모듈에서 추가한 에러 코드임)
* -2001 Consume Item is empty.
* -2002 PurchaseId is null.
* -2003 Restore Not Owned Item. (리스토어할 아이템이 존재하지 않음)
** // v2.16.1부터는 -2003 에러코드가 전달되는 경우가 더이상 존재하지 않습니다.
** // v2.16.1부터 리스토어할 아이템이 없는 경우 BUY_SUCCESS 콜백이 내려가지만 pid는 빈 String 데이터로 전달됩니다.
* -9999 Unkwonw Error. (위 에러 코드 이외의에 모든 에러 - 인앱 모듈에서 추가한 에러 코드임)
*/
* Samsung IAP Response Code
* 0 Success
* 1 Payment canceled
* -1000 Failure during IAP initialization
* -1001 IAP upgrade is required
* -1002 Error while running IAP
* -1003 Error when a non-consumable product is re-purchased or a subscription product is re-purchased before its expiry date.
* -1004 Error when a payment request is made withoutbundle information.
* -1005 Error when the requested item list is not available.
* -1006 If the payment result is not received after making a payment request to the server, the purchased product list should be confirmed, because the payment may have occurred successfully. This error message appears in this situation.
* -1007 Error when item group ID does not exist.
* -1008 Error when network is not available.
* -1009 IOException
* -1010 SocketTimeoutException
* -1011 ConnectTimeoutException
* -1012 The item is not for sale in the country.
* -1013 IAP is not serviced in the country.
* -1014 Samsung account is not signed in.
*
* -2000 Need Initialize (스토어 초기화 함수를 호출하지 않은 상태 - 인앱 모듈에서 추가한 에러 코드임)
* -2001 Consume Item is empty.
* -2002 PurchaseId is null.
* -2003 Restore Not Owned Item. (리스토어할 아이템이 존재하지 않음)
** // v2.16.1부터는 -2003 에러코드가 전달되는 경우가 더이상 존재하지 않습니다.
** // v2.16.1부터 리스토어할 아이템이 없는 경우 BUY_SUCCESS 콜백이 내려가지만 pid는 빈 String 데이터로 전달됩니다.
* -9999 Unkwonw Error. (위 에러 코드 이외의에 모든 에러 - 인앱 모듈에서 추가한 에러 코드임)
*/
- Samsung GalaxyStore 사용 시 InAppPurhcase API 사용에 대해서
- Google, OneStore 등 기존의 구매 로직과 동일하게 진행이 됩니다. 때문에 기존에 다른 마켓에 대한 구현 로직이 있다면 라이브러리 추가 및 IapInitialize 시 마켓타겟을 GalaxyStore로만 해주신 다음 테스트하여 확인을 부탁드리겠습니다.
- Samsung GalaxyStore 사용 시 InAppPurhcase API 사용에 대해서
<작성법 참고>
InApp Purchase v2.16.5+ 에서 Lebi 마켓 사용시
- Lebi 사용 시 알리페이 앱을 이용한 충전 기능을 활성화하기 위해 alipaySdk-15.6.8-20191021122514.aar 반드시 추가
- Proguard 난독화를 사용중일 경우
- - Proguard 난독화를 적용중인 프로젝트에서는 아래의 항목을 추가해주세요.
-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
-keep class com.alipay.sdk.app.PayTask{ public *;}
-keep class com.alipay.sdk.app.AuthTask{ public *;}
-keep class com.alipay.sdk.app.H5PayCallback {
<fields>;
<methods>;
}
-keep class com.alipay.android.phone.mrpc.core.** { *; }
-keep class com.alipay.apmobilesecuritysdk.** { *; }
-keep class com.alipay.mobile.framework.service.annotation.** { *; }
-keep class com.alipay.mobilesecuritysdk.face.** { *; }
-keep class com.alipay.tscenter.biz.rpc.** { *; }
-keep class org.json.alipay.** { *; }
-keep class com.alipay.tscenter.** { *; }
-keep class com.ta.utdid2.** { *;}
-keep class com.ut.device.** { *;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
-keep class com.alipay.sdk.app.PayTask{ public *;}
-keep class com.alipay.sdk.app.AuthTask{ public *;}
-keep class com.alipay.sdk.app.H5PayCallback {
<fields>;
<methods>;
}
-keep class com.alipay.android.phone.mrpc.core.** { *; }
-keep class com.alipay.apmobilesecuritysdk.** { *; }
-keep class com.alipay.mobile.framework.service.annotation.** { *; }
-keep class com.alipay.mobilesecuritysdk.face.** { *; }
-keep class com.alipay.tscenter.biz.rpc.** { *; }
-keep class org.json.alipay.** { *; }
-keep class com.alipay.tscenter.** { *; }
-keep class com.ta.utdid2.** { *;}
-keep class com.ut.device.** { *;}
<작성법 참고>
InApp Purchase v2.17.0+ 에서 Huawei Billing 적용 시
- Project 폴더내 build.gradle에 아래 내용 추가
allprojects {
repositories {
//...
maven {url 'http://developer.huawei.com/repo/'} // huawei
}
}
repositories {
//...
maven {url 'http://developer.huawei.com/repo/'} // huawei
}
}
buildscript {
repositories {
//...
maven {url 'http://developer.huawei.com/repo/'} // huawei
}
dependencies {
//...
classpath 'com.huawei.agconnect:agcp:1.2.1.301' // huawei
}
}
repositories {
//...
maven {url 'http://developer.huawei.com/repo/'} // huawei
}
dependencies {
//...
classpath 'com.huawei.agconnect:agcp:1.2.1.301' // huawei
}
}
- app 폴더내 build.gradle에 아래 내용 추가
dependencies {
//...
implementation 'com.huawei.hms:iap:4.0.2.300' // huawei billing
}
//...
implementation 'com.huawei.hms:iap:4.0.2.300' // huawei billing
}
apply plugin: 'com.huawei.agconnect' // huawei
- Huawei 개발자 사이트 참고
- 주의사항
- Huawei 인증 및 빌링을 사용하기 위해서는 minSDKVersion을 반드시 17 이상으로 설정해야함
- 원활한 테스트를 위해서 HMS(화웨이 모바일 서비스)가 설치된 화웨이 전용 단말에서 사용하는 것을 권장합니다. HMS(화웨이 모바일 서비스)가 미설치된 단말에서 테스트 할 경우 구글 플레이 스토어 또는 기타 apk 다운로드 사이트를 활용하여 HMS(화웨이 모바일 서비스) apk를 설치 후 테스트 바랍니다.
android {
//...
defaultConfig {
//...
minSdkVersion 17
}
}
//...
defaultConfig {
//...
minSdkVersion 17
}
}
- Proguard 사용 시 아래 설정 추가
-ignorewarnings
-keepattributes *Annotation*
-keepattributes Exceptions
-keepattributes InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
-keep class com.hianalytics.android.**{*;}
-keep class com.huawei.updatesdk.**{*;}
-keep class com.huawei.hms.**{*;}
-keepattributes *Annotation*
-keepattributes Exceptions
-keepattributes InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
-keep class com.hianalytics.android.**{*;}
-keep class com.huawei.updatesdk.**{*;}
-keep class com.huawei.hms.**{*;}
<작성법 참고>
GoogleInApp (Google API Lv1) -> GooglePlay (Google API Lv3) 변경 시
- 아래 v2.7.3 히스토리 참고
- GooglePlay
- - 15번째 마켓 GooglePlay 가 추가됩니다.
- - 실제 마켓은 GoogleInApp 과 같으나 Google 결제 API Level 3 이 적용된 버전입니다.
- - 하위 호환을 위해 GoogleInApp 은 그대로 유지가 되고 (결제 API Level 1) 둘 다 사용 가능 합니다.
- - MARKETNUMBER 는 15 가 되고, MARKETNAME 은 "GooglePlay" 가 됩니다.
- - [적용 전 주의사항]
- API 3 부터는 영구성, 소모성 개념이 사라집니다.
마켓에 다르게 등록해도 그것은 API 1, 2 를 위한 부분이며 API 3 에서는 소모성으로 등록해도 영구성처럼 사용이 가능하고 반대도 가능합니다. - 그리하여, 모듈단에서는 아이템이 영구성인지 소모성인지 알 수가 없기때문에 요청시에 꼭 구분이 되어야 하며,
- 복구시에도 ( RestoreItem() ) 꼭 pid 를 체크 해 주세요. (소모성 복구 콜백이 가면 무시)
- API 3 부터는 영구성, 소모성 개념이 사라집니다.
- - [적용 방법]
- InAppGooglePlayLibrary.jar, InAppDefaultLibrary, C2SInApp.h 3가지 파일을 업데이트 합니다.
- Initialize 시에 pids 파라미터를 입력해 주면 itemlist() 콜백을 받을 수 있습니다. 형식은 iOS 와 같습니다.
- BuyItem 시에 quantity 파라미터를 0으로 주면 영구성, 1로주면 소모성으로 간주 합니다. (중요, KDDI 마켓과 형식 동일)
- 나머지 부분은 GoogleInApp API 1 과 동일하며, 콜백도 동일합니다.
- - [API 1, 2 -> 3 주요 변경사항]
- 검증에 필요한 Public key 가 계정에 하나로 귀속되던 부분이 어플당 하나씩으로 개별 적용됩니다.
이미 납품 된 어플은 기존 Public key 로 모두 동일하지만, 신규 납품하는 어플은 개별 적용 되는 것으로 봅니다. - 위의 주의사항에 언급한 managed, unmanaged (영구성, 소모성) 개념이 사라지고 모두 영구성처럼 간주됩니다.
그래서 실질적으로 내부 구조는 아이템을 "구매요청" 을 날린 후, 소모성 아이템 처럼 사용할 경우 "소모요청" 을 다시 날리게 되는 구조입니다.
하여, 중간에 "소모요청"을 못하게 되는 경우가 어떻게든 생길 수가 있게 되는데 이때 복구를 하게되면 소모성 아이템처럼 사용하던 pid 가 복구가 되게 됩니다.
ResotreItem 시 pid 를 체크 해 주세요. - Android SDK 8 (2.2) 이하에서는 지원하지 않습니다. minSDK 가 최소 8 이상이어야 합니다.
- 영수증이 기존 API 1, 2 때와는 다르게 무조건 1건당 1개 입니다. 따라서 orders, notificationID 등의 항목이 사라진 JSON 형태의 영수증으로 바뀌었습니다.
- 마켓 켄슬 (취소, 환불) 건에 대해 예전에는 비동기이긴했지만 신호가 바로 왔던것에 비해, API 3 에서는 마켓어플과 동기화 할때 갱신됩니다. (보통 어플 재시작 후...)
- RestoreItem 시에 콜백을 못 받는 경우, 아이템이 취소 혹은 환불 된 경우입니다.
- (단, RestoreItem 이 실패하여 못 주는 경우는 제외, 실패일 경우 BUY_FAILED 리턴을 주도록 하였습니다.)
- 검증에 필요한 Public key 가 계정에 하나로 귀속되던 부분이 어플당 하나씩으로 개별 적용됩니다.
- - [영수증의 developerPayload 부분이 변경되었습니다]
- 기존의 API 1 에서 "BILLING_REQUEST" + orderKey 등이 붙던 부분이 삭제되고 API 3 에서는 모듈로직에 따라 JSONstring 형태의 값이 들어 있습니다.
- 구매요청 시 orderKey 에 입력해준 값을 확인하려면 JSONObject 로 변환 후 "orderKey" 를 키값으로 파싱하면 됩니다.
<작성법 참고>
주요 마켓별 테스트 유의 사항 (Google Play Store)
- 구글 마켓의 경우 구매하는 계정이 테스터로 등록되어야 만 가능 합니다.
- 보통 QA 의 단말을 대여하거나, 테스터로 등록된 팀계정 등을 이용해 주세요.
- 구글에서 제공하는 android.test.purchaed 같은 방법도 있지만, 이 방법은 keystore 나 테스터 등을 다 무시고 orderKey 도 제외한 해당 설정 (이 경우 성공) 만 주기때문에 영수증 까지 처리하는 로직상 문제가 없는지 등을 테스트 해보는 정도로만 사용 해 주세요.
- 마켓에 올라간 APK 와 keystore, versionCode 가 동일한지 확인 해 주시고 계정같은 경우 일반적으로 primary account 로 결제요청이 되니 유의해 주세요.
- 구버전 (GoogleInAppLibrary) 를 사용할 경우 테스트시에도 실제 청구가 되니 환불 요청이 필요합니다.
<작성법 참고>
주요 마켓별 테스트 유의 사항 (Tstore, ollehMarket, OZstore)
- 국내 3사 마켓의 경우 단말을 테스터로 등록 하여 테스트 합니다.
- 각 마켓 개발페이지에보면 전화번호를 등록하여 해당 단말을 테스터로 등록할 수 있습니다.
- Tstore(One store) 의 경우 DebugSDK 용 jar 파일이 따로 존재하며(v2.8.3 이전이며 신규부터는 하나의 SDK 파일만 존재, 개발페이지 설정은 동일), 해당 파일을 build path 에 등록후 테스트 해주면 됩니다. (납품시엔 상용 SDK jar 파일로..)
- 주의!! Tstore, ollehMarket, OZstore가 OneStore로 통합되면서 ollehMarket, OZstore 를 더 이상 사용하지 않습니다.
ollehMarket의 경우 SP, PAD 용 2개가 존재하는데 일반적으론 SP 용만 사용하시면 됩니다. PAD 용은 결제시 olleh ID 로 로그인 flow 가 추가되며 타블렛류를 지원합니다만 빌드를 따로 해야 합니다.OZstore는 Tstore 와 동일하나, DebugSDK 가 따로 존재 하지는 않고 단말만 등록하여 테스트 합니다.
<작성법 참고>
GoogleInApp (Google API Lv1) 사용 시
- 구글 API Lv1 에서는 비동기 방식으로 되어있습니다. 바꿔 말하면 콜백 응답을 언제 줄지 장담 못한다 인데요. 이 외에도 구글마켓에서 따로 응답을 주지 않는 경우가 있습니다. 확인 된 경우로는 keystore로 sign이 되지 않아 "이 애플리케이션 버전에서는 결제를 할 수 없습니다." 혹은 "해당 버전에서는 구매 할 수 없습니다." 등 이며, 영구성 아이템을 재구매 할 경우에도 오류 팝업을 띄우지만 콜백을 주지 않습니다. 이런 부분은 어플마다 비동기 혹은 동기적으로 처리하는 경우가 다르므로, 동기적으로 처리하는 경우 구매시 타임아웃을 주는 등으로 처리가 필요합니다.
적용 방법
<작성법 참고>
Jar 파일 추가 (Java Libraries)
- Add JARS...
- modulemanager.jar (Must be added after v2.4.0)
- InAppDefaultLibrary.jar (Must be added after v2.0.1)
- InApp'해당 마켓'Library.jar
- InApp'해당 마켓'SDK.jar (If Exist)
- InAppC2SSecurity.jar (If use Lebi)
AndroidManifest.xml
- <!-- 8 or higher required for InApp Purchase Module -->
<uses-sdk android:minSdkVersion="8" />
<!-- require for inapp module -->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- require for GoogleInApp, GooglePlay -->
<uses-permission android:name="com.android.vending.BILLING"/>
<!-- require for Tstore -->
<!-- InApp v2.13.0 이상 적용 시 (OneStore 사용) 아래 3개의 permission은 사용하지 않습니다. -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="com.tmoney.vending.INBILLING" />
<permission android:name="com.tmoney.vending.INBILLING" />
<!-- require for Tstore, ollehMarket, OZstore, MMBilling -->
<!-- InApp v2.13.0 이상 적용 시 (OneStore 사용) 아래 권한을 사용하지 않습니다. -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- require for Tstore, MBiz -->
<!-- InApp v2.13.0 이상 적용 시 (OneStore 사용) 아래 권한을 사용하지 않습니다. -->
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<!-- require for ollehMarket -->
<!-- InApp v2.13.0 이상 적용 시 (OneStore 사용) 아래 권한을 사용하지 않습니다. -->
<uses-permission android:name="android.permission.GET_TASKS" />
<!-- require for OZstore -->
<!-- InApp v2.13.0 이상 적용 시 (OneStore 사용) 아래 권한을 사용하지 않습니다. -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- require for KDDIBilling -->
<uses-permission android:name="com.kddi.market.permission.USE_ALML" />
<!-- require for MMBilling, MBiz -->
<uses-permission android:name="android.permission.SEND_SMS" />
<!-- require for MMBilling -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<!-- require for Plasma -->
<uses-permission android:name="com.sec.android.iap.permission.BILLING"/>
<!-- require In MainActivity for inapp module
android:launchMode="singleTop"
-->
<!-- GoogleInApp, GooglePlay-->
<service android:name="com.android.vending.billing.BillingService"/>
<receiver android:name="com.android.vending.billing.BillingReceiver">
<intent-filter>
<action android:name="com.android.vending.billing.IN_APP_NOTIFY"/>
<action android:name="com.android.vending.billing.RESPONSE_CODE"/>
<action android:name="com.android.vending.billing.PURCHASE_STATE_CHANGED"/>
</intent-filter>
</receiver>
<!-- Tstore -->
<!-- InApp v2.13.0 이상 OneStore 사용 기준 -->
<meta-data
android:name="iap:api_version"
android:value="4" />
<activity
android:name="com.skplanet.dodo.IapWeb"
android:configChanges="orientation|locale|keyboardHidden|layoutDirection|screenSize"
android:excludeFromRecents="true"
android:windowSoftInputMode="stateHidden" />
<!-- ollehMarket -->
<!-- InApp v2.13.0 이상 OneStore 사용 시 ollehMarket 관련 내용 필요 없음 -->
<activity
android:label="ollehMarket"
android:configChanges="orientation|screenSize"
android:name="com.com2us.module.inapp.ollehmarket.ollehMarketBillingView"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<service android:name="com.kt.olleh.inapp.TimerService" />
<!-- OZstore -->
<!-- InApp v2.13.0 이상 OneStore 사용 시 OZstore 관련 내용 필요 없음 -->
<activity
android:name="com.feelingk.lguiab.manager.gui.InAppLockActivity"
android:label="@string/app_name"
android:configChanges="orientation|screenSize"
android:windowSoftInputMode="adjustResize|stateAlwaysHidden" />
<activity
android:label="OZstore"
android:configChanges="orientation|screenSize"
android:name="com.com2us.module.inapp.ozstore.OZstoreBillingView"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<!-- qiip -->
<activity
android:label="qiip"
android:configChanges="orientation|screenSize"
android:name="com.com2us.module.inapp.qiip.qiipBillingView"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<!-- Amazon -->
<receiver android:name="com.amazon.device.iap.ResponseReceiver"
android:permission="com.amazon.inapp.purchasing.Permission.NOTIFY"> <!-- permission 위치는 receiver 태그 이하에 -->
<intent-filter>
<action android:name="com.amazon.inapp.purchasing.NOTIFY" />
</intent-filter>
</receiver>
<!-- MBiz -->
<activity
android:name="com.mbizglobal.MoActivity"
android:configChanges="keyboard|keyboardHidden|navigation|orientation|fontScale|locale"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
</activity>
<activity
android:name="com.paypal.android.MEP.PayPalActivity"
android:configChanges="keyboardHidden|orientation"
android:theme="@android:style/Theme.Translucent.NoTitleBar" >
</activity>
<!-- MM -->
<service
android:name="mm.purchasesdk.iapservice.PurchaseService"
android:exported="true" >
<!-- android:process="mm.iapServices" > -->
<intent-filter android:priority="230" >
<action android:name="com.aspire.purchaseservice.BIND" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter android:priority="230" >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.SAFIAP.COMPONENT" />
</intent-filter>
</service>
<!-- android:excludeFromRecents="true" -->
<!-- android:launchMode="singleInstance" -->
<activity
android:name="mm.purchasesdk.iapservice.BillingLayoutActivity"
android:configChanges="orientation|keyboardHidden"
android:theme="@android:style/Theme.Translucent" >
<intent-filter android:priority="230" >
<action android:name="your-package-name.com.mmiap.activity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<!-- android:process="safiap.framework.safframeworkmanager" begin -->
<service
android:name="safiap.framework.SafFrameworkManager"
android:exported="true"
android:process="safiap.framework" >
<intent-filter android:priority="600" >
<!-- ID for services declared in AIDL -->
<action android:name="safiap.framework.sdk.ISAFFramework" />
</intent-filter>
<intent-filter android:priority="600" >
<!-- ID for services declared in AIDL -->
<action android:name="safiap.framework.ACTION_START_DOWNLOAD" />
</intent-filter>
<intent-filter android:priority="600" >
<!-- ID for services declared in AIDL -->
<action android:name="safiap.framework.ACTION_CHECK_UPDATE" />
</intent-filter>
</service>
<!-- receivers -->
<receiver android:name="safiap.framework.CheckUpdateReceiver" >
<intent-filter>
<action android:name="safiap.framework.ACTION_CANCEL_NOTIFICATION" />
</intent-filter>
<intent-filter>
<action android:name="safiap.GET_SHARED_DATA" />
</intent-filter>
<intent-filter>
<action android:name="safiap.framework.ACTION_SET_TIMER" />
</intent-filter>
</receiver>
<activity
android:name="safiap.framework.ui.UpdateHintActivity"
android:configChanges="orientation"
android:excludeFromRecents="true"
android:launchMode="singleInstance"
android:theme="@android:style/Theme.Translucent.NoTitleBar" >
<intent-filter>
<action android:name="safiap.framework.ACTION_TO_INSTALL" />
</intent-filter>
<intent-filter>
<action android:name="safiap.framework.ACTION_TO_INSTALL_IAP" />
</intent-filter>
<intent-filter>
<action android:name="safiap.framework.ACTION_NETWORK_ERROR_IAP" />
</intent-filter>
<intent-filter>
<action android:name="safiap.framework.ACTION_NETWORK_ERROR_FRAMEWORK" />
</intent-filter>
</activity>
<service
android:name="safiap.framework.logreport.monitor.handler.LogreportHandler"
android:process=":remote" />
<!-- android:process="safiap.framework.safframeworkmanager" end -->
<!-- MM End -->
<!-- Android 상위 버전에서 deprecated된 apache API를 사용할 수 있도록 내용을 manifest 항상 추가 -->
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />- targetSdkVersion의 값이 28 이상인 경우
- application 태그에 usesCleartextTraffic 설정을 추가해야 합니다. (http:// 관련 통신이 가능하도록)<application
.. (기타 설정) ..
android:usesCleartextTraffic="true" />
- application 태그에 usesCleartextTraffic 설정을 추가해야 합니다. (http:// 관련 통신이 가능하도록)
- targetSdkVersion의 값이 28 이상인 경우
SDK 추가 파일들
MBiz
- res 하위에 넣으면 됩니다.
- drawable
- raw
MM
- libs / armeabi 에 libcasdkjni.so, libidentifyapp.so 파일이 추가되어야 합니다.
Android Studio 적용 방법 (190625 배포 이후)
1) .aar 라이브러리 추가하기
- 배포된 패키지에서 앱이 배포되는 마켓 성격에 맞는 라이브러리를 추가합니다.
- [19.06.27 이전 배포 형태]
- Google 마켓 적용 시 : InAppDefaultLibrary.jar + InAppGooglePlayLibrary.jar 적용
- [19.06.27 부터 배포 형태]
- Google 마켓 적용 시 : InAppLibrary-googleplay-x.x.x.aar 적용 (하나의 aar 안에 defaultLibrary와 마켓 라이브러리를 같이 포함)
- 러비 마켓 적용 시 : InAppLibrary-lebi-x.x.x.aar 적용 (하나의 aar 안에 defaultLibrary와 마켓 라이브러리를 같이 포함)
- 모든 마켓이 포함된 라이브러리 적용 시 : InAppLibrary-inappAll-2.15.5.aar 적용 (하나의 aar 안에 defaultLibrary와 모든 마켓 라이브러리를 같이 포함)
- (IapInitialize 시 target으로 정한 마켓으로 설정됩니다. 그외에 사용하지 않는 마켓 target으로 초기화하지 않는 경우 문제가 되지 않습니다.)
- build.gradle 설정에서 해당 .aar 파일을 implementation하여 빌드되도록 설정합니다.
- [19.06.27 이전 배포 형태]
2) 통합 리소스 및 수정설정 리소스 추가하기
- 리소스 가이드에 있는 통합 리소스와 수정설정 리소스를 프로젝트에 추가합니다. [리소스 추가하기]
3) InApp 라이브러리가 필요로하는 외부 라이브러리를 추가하기
- InApp 라이브러리는 Android Support 라이브러리 등 외부 라이브러리를 필요로 합니다. 아래 라이브러리를 build.gradle의 dependencies 항목에 추가하여 같이 사용하도록 합니다.
- 그리고 특정 마켓에 필요한 라이브러리를 사용하는 경우 프로젝트에서 라이브러리를 담은 경로를 잘 확인하여 추가 바랍니다.
- 아래는 예시 코드입니다. 프로젝트 환경에 맞게 추가해주세요.
//... (생략)...
dependencies {
// ...(생략)...
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.appcompat:appcompat:1.0.0'
// 외부 라이브러리 추가 시 (프로젝트에 맞는 경로 확인하기)
implementation files('marketSDKs/libs/Hami_Apps_SDK_Dev_V1.06_20110621.jar');
implementation files('marketSDKs/libs/InAppAmazonSDK.jar');
implementation files('marketSDKs/libs/InAppC2SSecurity.jar');
implementation files('marketSDKs/libs/InAppTstoreSDKv4-16.05.00_20181012.jar');
implementation files('marketSDKs/libs/InAppTstoreSDKv5-17.02.00_20181012.jar');
implementation files('marketSDKs/libs/wechat-sdk-android-with-mta_5.0.8.jar');
}
//...(생략)...
dependencies {
// ...(생략)...
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.appcompat:appcompat:1.0.0'
// 외부 라이브러리 추가 시 (프로젝트에 맞는 경로 확인하기)
implementation files('marketSDKs/libs/Hami_Apps_SDK_Dev_V1.06_20110621.jar');
implementation files('marketSDKs/libs/InAppAmazonSDK.jar');
implementation files('marketSDKs/libs/InAppC2SSecurity.jar');
implementation files('marketSDKs/libs/InAppTstoreSDKv4-16.05.00_20181012.jar');
implementation files('marketSDKs/libs/InAppTstoreSDKv5-17.02.00_20181012.jar');
implementation files('marketSDKs/libs/wechat-sdk-android-with-mta_5.0.8.jar');
}
//...(생략)...
4) gradle.properties 파일 내 androidX 사용 설정
- gradle.properties 파일 내 아래의 코드를 추가하세요. gradle.properties 파일이 존재하지 않는 경우 신규 생성 후 아래의 코드를 추가하세요.
android.useAndroidX=true
android.enableJetifier=true
android.enableJetifier=true
Com2uS 공통모듈 | >> | InApp Purchase | >> | InApp Purchase 모듈 적용 가이드 (iOS)
InApp Purchase 모듈 적용 가이드 (Android) |
>> | InApp Purchase 모듈 레퍼런스 가이드 | >> | InApp Purchase 샘플 가이드 (Android) | >> | InApp Purchase FAQ |