모든 문서(일반 문서, 분류 문서, 파일(이미지, 사운드 등) 문서) 분류가 달려 있어야 합니다.

--Administrator (토론)

InApp Purchase 모듈 적용 가이드 (Android)

컴투스위키
이동: 둘러보기, 찾기
Com2uS 공통모듈 >> InApp Purchase >> InApp Purchase 모듈 적용 가이드 (iOS)

InApp Purchase 모듈 적용 가이드 (Android)

InApp Purchase 모듈 적용 가이드 (Unity3d)

>> InApp Purchase 모듈 레퍼런스 가이드 >> InApp Purchase 샘플 가이드 (Android) >> InApp Purchase FAQ



목차

역사

<작성법 참고>
Version Date SVN Revision 담당자 변경 사항
2.17.2 2020-09-25 - 최지수
  • Analytics 기능 클래스를 참조하는 내부 경로 설정 변경
2.17.0 2020-05-22 - 김현석
  • Huawei 마켓을 지원하는 경우 Huawei 결제를 지원(가이드 참고)
2.16.5 2020-03-12 - 김현석
  • 알리페이 앱이 설치된 기기에서는 알리페이 앱을 이용한 Lebi 충전 결제를 지원
    • Lebi 사용시 알리페이 라이브러리(alipaySdk-15.6.8-20191021122514.aar) 추가 필수 가이드 참고
  • Lebi 충전 화면에서 충전 수단 버튼 이미지가 잘리는 오류 수정
2.16.4 2020-01-23 - 김현석
  • 더이상 사용하지 않는 마켓과 코드를 제거 (ollehmarket, ozstore, qiip, hami, KDDI, MM, Mbiz)
2.16.3 2019-12-12 - 최지수
  • 원스토어 IAP v5에서 구매 복구(마켓 리스토어) 시 전달된 구매 정보로 구매 검증이 정상 작동하지 않는 이슈 수정
2.16.2 2019-10-16 - 최지수
  • 갤럭시 스토어 구매 기능의 내부 로직 개선
  • 구글 플레이스토어 및 러비 마켓 선택 팝업에서 러비 마켓 충전 서비스의 문구 수정
    • 알리페이가 제외되고 위챗페이 문구 추가
  • 원스토어 IAP v5에서 마켓 구매 복구 상황 시 간헐적으로 아이템 소모가 즉각 되지 않는 이슈 수정
  • 원스토어 IAP v5에서 마켓 구매 복구 상황 시 payload 값을 통해 uid를 얻을 수 있도록 로직 수정
  • (Known Issue) OneStore IAP v5에서 초기화 시 autoVerify 옵션을 true로 설정하고 InApp 모듈 서버에검증을 요청 시 IapRestoreItem API로 구매 복구(마켓 리스토어)한 영수증 정보로 검증 실패가 되는 이슈 확인
    • 원스토어 담당자와 해당 이슈 확인 진행중입니다.
    • 해당 이슈 개선 전까지 autoVerify 옵션을 true가 아닌 false로 사용하여 직접 영수증 검증을 활용해 검증 진행을 부탁드립니다.
  • 모든 웹뷰에서 더이상 쿠키를 사용하지 않도록 로직 변경
  • 코드 상의 네트워크 통신을 위한 Url 문자열을 변조 처리
2.16.0 2019-06-27 - 최지수
2.15.5 2019-06-25 - 최지수
  • 모듈 내부 네트워크 통신 시 mac 정보를 보내지 않도록 수정
  • C 플러그인 로직의 Android 64비트 시스템 대응
    • .c, .h 파일이 업데이트 되었습니다.
    • .a 라이브러리 파일이 5가지(arm64-v8a, armeabi, areabi-v7a, x86, x86_64)로 빌드 업데이트 되었습니다.
    • 적용 시 별도의 인터페이스 수정은 없습니다. 다만 내부 로직이 변경되었으니 업데이트 후 동작 확인을 부탁드립니다.
  • 원스토어 IAP v5의 콜백 errorCode가 c2s에서 onestore로 변경되었습니다.
    • 인앱 콜백에서 errorCode를 파싱하는 하려는 경우 원스토어 IAP v5는 onestore로 파싱해야 합니다. (errorCode의 경우 마켓별로 별도로 키카 정해져있지 않은 경우가 있습니다. 특별한 경우가 아니라면 errorValue로 콜백의 상태를 체크하는 것을 권장드립니다.)

[라이브러리 및 리소스 배포 변경사항]

  • Android Studio 라이브러리 적용 [studio 설정 가이드]
    • .aar 파일을 적용하여 사용이 가능합니다.
    • 이클립스 프로젝트 환경의 라이브러리를 더이상 지원하지 않습니다.
  • 통합 리소스
    • 배포된 패키지에 있는 '/res_통합' 경로의 모든 리소스 파일을 프로젝트가 추가 바랍니다. [가이드 확인하기]
    • 배포된 패키지에 있는 '/res_수정설정' 경로의 모든 리소스 파일을 적용하는 프로젝트 성격에 맞게 내용을 수정하여 추가 바랍니다. [가이드 확인하기]
2.15.3 2019-04-01 2861 최지수
  • autoVerify 설정이 true인 경우 자체 영수증 검증 시 항상 에러를 반환받는 이슈 수정
2.15.2 2019-03-25 2860 최지수
  • 원스토어 IAP v5에서 iapRestoreItem API 호출 시 로컬 데이터에 구매복구할 아이템 정보가 없는 경우 크래시 발생하는 이슈 수정 [내용 확인]
2.15.1 2019-03-14 2859 최지수
  • Google Inapp 구매 시 환불 여뷰징 방지를 위한 Account Id를 구매 정보에 추가하는 API 추가 [가이드 링크]
2.15.0 2018-11-20 2851 최지수
  • 원스토어 IAP v4 라이브러리 업데이트 적용
  • 원스토어 IAP v5 라이브러리 업데이트 적용
    • 업데이트 v17.02.00
    • 기존 IAP v4를 사용하다 v5로 변경할 경우 원스토어 콘솔에 앱아이디 및 아이템 등록을 새로 진행하여야 합니다.
    • 적용 방법 확인 [Tstore SDK v17.02.00 적용]
  • Restore API 호출 후 실패 상황인 경우 BUY_FAILED 콜백이 아닌 RESTORE_FAILED 콜백이 전달되도록 수정
  • (2018-11-15 패키지에서 안드로이드 C 플러그인용 헤더 파일(C2SInApp.h)이 미반영되어 2018-11-20 패키지로 업데이트하였습니다.)
    • 변경된 리소스 : C2SInApp.h
2.14.4 2018-10-01 2846 최지수
  • InApp v1.0 상품 구매 로그에 product_price, currency 데이터를 전달하도록 추가
2.14.3 2018-08-31 2844 최지수
  • XXE(XML eXternal Entity) 위험 이슈가 대응된 위챗 페이 유틸리티 클래스 업데이트 적용
  • 위챗 페이 구매 결과를 HIVE 서버로 전달 시 Unity에서 thread 관련 예외가 발생
2.14.2 2018-06-27 2841 최지수
  • 말레이시아어 대응 로직 제거
  • 중국 간체 및 번체 분기 시 사용되는 국가 코드를 단말 국가 코드가 아닌 HIVE Country를 사용하도록 변경
2.14.1 2018-05-02 2838 최지수
  • 구매 관련 프로세스 진행 상태를 안내하는 모든 토스트 메시지 제거
  • 일부 단말에서 WeChatPayActivity 생성자 호출 시 exception이 발생하는 이슈 수정
  • WeChat AppId와 WeChat Key에 해당하는 키를 strings.xml에 설정하지 않아도 러비 초기화가 가능하도록 로직 변경 [WeChat Pay 적용 참고]
2.14.0 2018-02-07 2833 최지수
  • 러비 충전 수단으로 위챗 페이 추가
    • InAppLebiLibrary.jar 사용 시 위챗 라이브러리(wechat-sdk-android-with-mta_5.0.8.jar) 추가 필수 (아래 사항을 꼭 확인바랍니다.)
    • WeChat Pay 적용 방법 : WeChat Pay 설정하기
2.13.7 2017-08-28 2816 최지수
  • 모듈 내부 서버통신 데이터에 통합 식별자 추가
  • 언어 설정은 게임 언어를 우선시하며 게임 언어를 설정하지 않을 경우 단말 언어를 따르도록 수정
    • ActiveUser SetGameLanguage API 를 통해 게임 언어 설정 가능 (ActiveUser v2.7.5 이상)
  • UI 관련 텍스트 국가별 추가 번역 및 오탈자 수정
  • InAppAmazonSDK.jar 2.0.76 버전 업데이트
2.13.6 2017-07-25 2811 최지수
  • 모듈 내부 아랍어 텍스트 추가 (단말 언어를 아랍어로 설정했을 경우 모듈 UI 텍스트가 아랍어로 노출)
2.13.5 2017-03-07 2806 정다운
  • 러비 상점 선택 팝업 및 로딩 다이얼로그 문구 중국어(간체) 지원
2.13.4 2017-01-26 2803 정다운
  • GooglePlay, Amazon, Tstore 구매 로그 전송 및 영수증 검증 요청 url 변경(샌드박스)
  • Lebi 마켓 선택 및 마켓지원 확인 url 변경(라이브)
  • Olleh Market, Oz Store 영수증 검증 요청 url 변경(라이브)
2.13.3 2016-12-08 2799 정다운
  • OneStore (Tstore) SDK Update v16.02.00 -> v16.03.00
  • 2016.12.07. 원스토어 라이브러리가 16.02.00에서 16.03.00으로

업데이트 되어 InAppTstoreSDK.jar 모듈 업데이트 재배포. 반드시 리비전 2799버전으로 이용부탁드립니다, (간헐적으로 콜백이 전달되지 않던 이슈 수정)

2.13.2 2016-11-30 2798 정다운
  • 원스토어 구매하기 버그 수정
  • 국가코드 MO(마카오) 언어 대응
2.13.1 2016-11-28 2796 정다운
  • 국가코드가 HK(홍콩)일 때 번체가 표시되도록 수정
2.13.0 2016-11-21 2795 정다운
  • OneStore(Tstore) SDK 업데이트
    • SDK 버전은 16.02.00 으로 마켓 업데이트 날짜 기준 10얼 21일 자 입니다.
    • 2016년 12월 1일부터 해당 버전 SDK 미적용 App에 대하여 검증 시 반려 처리 됩니다. (마켓 공지사항)
2.12.4 2016-07-27 2783 정다운
  • 서버 도메인 변경
    • 변경 전 : pubbilling.com2us.net
    • 변경 후 : s.qpyou.cn
2.12.3 2016-03-24 2760 김규진
  • SSL 검증 테스트에 사용되는 X509TrustManager 부분 제거
2.12.2 2016-01-20 2745 김규진
  • minor bug fixed
    • 내부 로직 중 개별 서버 세팅값이 반영 되도록 수정
2.12.1 2016-01-04 2738 김규진
  • OneStore (Tstore) SDK 가 업데이트 되었습니다.
    • SDK 버전은 15.01.00 으로 마켓 업데이트 날짜 기준 10월 28일 자 입니다.
    • 마켓 업데이트 날짜 기준 9월 22일 자 15.01.00 버전은 사용하면 안되기 때문에 해당버전으로 업데이트 해야합니다. (마켓 공지사항)
    • 마지막 구매완료 상태에서 Back 키로 구매가 종료되어 아이템이 지급되지 않는 현상이 수정되었습니다.
      • 단, 테스트 단말에서는 이 방어로직을 확인할 수 없습니다. 상용해서만 수정되었습니다.
    • 구버전에서 업데이트 시 아래 변경사항을 참고해 주세요.
      • 기존에 사용되던 libs/armeabi. armeabi-v7a/libdodo.so 파일이 삭제됩니다.
      • Manifest 설정이 변경됩니다.
        • meta-data 에 포함되던 iap:api_version 세팅을 3 으로 해주어야 합니다.
<meta-data
android:name="iap:api_version"
android:value="3" />
  • 이하 2.9.4 이상 적용 했었던 적이 있으면 해당사항 없습니다.
  • 기존에 사용되던 libs/armeabi. armeabi-v7a/libUSToolkit.so 파일이 삭제됩니다.
  • 기존에 있던 Tstore 퍼미션은 필수로 제거 되어야 합니다.
<uses-permission android:name="com.tmoney.vending.INBILLING" /> 제거
<permission android:name="com.tmoney.vending.INBILLING" /> 제거
  • GooglePlay 에서 uninitialize 와 destroy 때 receiver 를 중복으로 해제하는 부분 수정되었습니다.
이로 인해 warning 으로 보이던 부분이 사라지게 됩니다.
  • 샌드박스 설정 기능이 추가 되었습니다.
이 부분은 ActiveUser 의 서버세팅을 따라가게 됩니다.
2.10.1 2015-06-22 2690 김규진
  • GooglePlay (2015-06-22)
- GooglePlay Service 가 다운되는 상황에서 service 와 bind 시 GET_ITEM_LIST 콜백이 호출되는 현상 수정
  • Lebi (2015-06-22)
- 내부 도메인 변경 com2us.net -> m-billiap.qpyou.cn
- webview OS 버그 수정
2.10.0 2015-06-05 2674 김규진
  • 공통 (2015-05-13)
- ModuleManager 2.0.0 반영
  • C Library (2015-06-05)
- 인앱 아이템 갯수가 일정 수 이상을 넘어갈 경우 CS_IapInitializeEx 호출 후 콜백으로 받는 IapCB 에서 jni local reference table overflow 가 나는 현상 수정
2.9.9 2015-04-14 2659 박가진
  • 공통 (2015-04-13), (InAppDefaultLibrary.jar)
- 결제 복구시 4.1.2 이하 단말에서 크래시가 발생하는 현상 수정
  • Tstore (2015-04-14)
- 영구성 아이템 복구 요청시, ProgressDialog 가 자동으로 사라지지 않는 현상 수정
2.9.8 2015-03-25 2653 박가진
  • 공통 (2015-03-25)
- 지급되지 않은 결재 내역 복구 시 toast 메시지 대신 popup 을 띄우도록 수정
 : 구) "완료되지 못한 구매 프로세스를 진행합니다.", "Found previous progress."
 : 신) "지급되지 않은 상품이 있습니다. 재 지급을 시도합니다.", "Failed to grant some items. The process will restart."
  • GooglePlay (2015-03-25)
- 내부 코드 중 queryPurchases 구간에 발생하는 exception 에 대해 예외처리 추가
 : (구글서비스가 없는 상황)
2.9.7 2015-03-03 2645 박가진
  • GooglePlay (2015.02.16)
- PromoCode (redeem code) 를 랩이 pause 상태일 때 입력을 받으면 PURCHASE_UPDATED 가 불리지 않는 현상이 수정됩니다.
+ 관련 내용 :
GooglePlay 에서 PromoCode (redeem code) 를 마켓 앱에서 입력하였을 때 불리게 됩니다.
앱이 실행된 이후에만 신호를 받을 수 있고, 앱이 resume 상태이면 입력 직후 바로 PURCHASE_UPDATED 가 호출되며 pause 상태였을 경우 resume 때 호출 됩니다.
게임에서는 이 콜백을 받았을 경우 아이템 지급을 처리할 수 있는 시점에서 RestoreItem() 을 호출하여 콜백을 받아 처리하면 됩니다.
앱이 실행되지 않은체 (혹은 종료 후) PromoCode 를 입력받으면 해당 콜백은 불리지 않습니다. 게임 로직에서 ResotreItem() 을 특정시점에 호출해서 처리가 필요합니다. (앱 처음 실행시 한번 혹은 상점 진입시 등)
콜백 자체에 특정 값이 포함되어있지는 않습니다.
- Purchases class 에서 예외처리 추가
  • OZstore (2015.02.27)
- OZstore SDK v1.2.5 updated.
+ 320dpi device 해상도 깨짐 현상 수정, 롤리팝 대응 분기처리 (v1.2.4)
+ 내부 보안인증 로직 변경 (v1.2.5)
- OZstore Library 는 버전표기만 변경
  • Amazon (2015.03.03)
- autoVerify true 상태에서 restore 시 복구할 게 없을 경우 failed 로 콜백을 주는 현상을 restore_success 로 주도록 수정
- Amazon SDK 2.0.61 update
2.9.6 2015/02/02 2637 안영철
  • GooglePlay (2015.02.02)
- start setup 구간에 발생하는 exception 에 대해 예외처리 추가
+ at com.com2us.module.inapp.googleplay.GooglePlayHelper.onServiceConnected 에서 발생하는 exception 이 수정됩니다.
2.9.5 2015/01/28 2636 안영철
  • 공통 (2015.01.28)
- InAppDefaultLibrary v2015.01.27
+ Android 5.0 (Lollipop) 이상에서 SelectTarget (GooglePlay-Lebi 선택 팝업) 시 crash 가 나는 현상이 수정됩니다.
2.9.5 2015/01/13 2633 안영철
  • 공통 (2015.01.13)
- Android 5.0, Unity 에서 try-catch 문 안에서 bad pointer 접근시 죽는 현상이 수정됩니다.
- 관련 로그로는 아래와 같습니다.
E/CRASH ( 4167): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
W/InputDispatcher( 1055): channel ~ Consumer closed input channel or an error occurred. events=0x9
E/InputDispatcher( 1055): channel ~ Channel is unrecoverably broken and will be disposed!
I/WindowState( 772): WIN DEATH: Window{fba02fe u0 SurfaceView}
I/WindowState( 772): WIN DEATH: Window{43c8b51 u0 ~.UnityPlayerNativeActivity}
  • GooglePlay (2015.01.13)
- 이제 Restore 시 consume 되지 않은 결제건에 대해 consume 요청을 진행하게 됩니다.
- 그리하여 소모성아이템이 RESTORE_SUCCESS 로 오는 경우가 사라집니다.
- 단, side effect 로 Restore 호출시에 BUY_SUCCESS 콜백이 올 수도 있습니다.
- initialize 시 구글 서비스에서 inventory refresh 구간에 발생하는 exception 에 대해 예외처리가 추가되었습니다.
  • ollehMarket (2015.01.06)
- SDK update (2.0.5)
- 보안번호 강화 개발로 인하여 보안번호 미설정 구매 시나리오 삭제
  • OZstore (2015.01.06)
- SDK update (1.2.3)
- LG-F470L 키즈락인증UI 수정
2.9.4 2014/12/08 2615 안영철
  • DefaultLibrary 2014.12.08
- SelectTarget 에서 MCC 코드 값을 얻어올 때 유심의 MCC 값도 같이 고려하여 가져오도록 수정
  • GoogleInApp
- Google In-App API level 1 을 사용하던 이 라이브러리는 이제 삭제됩니다.
- InAppGooglePlayLibrary.jar 를 사용해 주세요.
  • Tstore
- Tstore SDK v14.01.01 이 적용되었습니다.
- 기존에 사용되던 libs/armeabi. armeabi-v7a/libUSToolkit.so 파일이 삭제됩니다.
- Manifest 설정이 변경됩니다.
+ 기존에 있던 Tstore 퍼미션은 필수로 제거 되어야 합니다.
<uses-permission android:name="com.tmoney.vending.INBILLING" /> 제거
<permission android:name="com.tmoney.vending.INBILLING" /> 제거
+ meta-data 에 포함되던 iap:api_version 세팅을 2로 해주어야 합니다.
<meta-data
android:name="iap:api_version"
android:value="2" />
- 그 외 소스코드상 변경점은 없습니다.
  • Lebi
- 이제부터는 내부 충전페이지 요청 시 appid 도 포함되어 전송됩니다.
- Hub 문구가 모두 Hive 문구로 대체됩니다.
- selectTarget 에서 문구세팅이 marketTarget 이 popup 용 100 으로 인해 default 인 영어로만 세팅되던 문제가 수정됩니다.
- 문구 세팅을 언어뿐만 아니라 국가와 같이 고려하도록 추가 됩니다.
  • 그 외
- 버전표기만 2.9.4 로 동일하게 마춰집니다.
2.9.3 2014/11/06 2605 임성훈
  • GooglePlay 2.9.3
- GET_ITEM_LIST 콜백의 price_amount_micros 값이 int 로 전달되는 문제 수정
2.9.2 2014/10/28 2599 임성훈
  • C Library 만 변경
  • CS_IapSelectTarget(), CS_IapAuthorizeLicense() 에서 리턴타입에 맞지 않는 JNI Call 을 올바르게 Call 하도록 수정
2.9.2 2014/09/26 2576 임성훈
  • GooglePlay Promotion Code 관련 PURCHASE_UPDATED 콜백 추가
    • 이 부분은 QA되지 않아 2015.2.3 현재 정상 작동 확인 중인 기능이며, spec 상으로만 적용되어 있습니다.
      • 2015.2.9 이후 사용 가능.
    • PURCHASE_UPDATED 는 앱 외에서 GooglePlay Promotion Code 가 입력됬을 시 불리며,
    • 콜백 내 혹은 이후에 영수증을 처리 할 수 있는 시점에서 RestoreItem() 을 호출하여 영수증을 받아 처리하면 됩니다.
    • Promotion Code 로 구매한 영수증은 orderId 값이 없으므로 서버에서 중복체크 등에 유의해 주세요.
    • 현재는 GooglePlay 에서만 사용됩니다.
  • GooglePlayBroadcastReceiver class 추가
  • DefaultBilling 의 setProperty 에서 value 값이 null 체크 추가
  • 그 외 버전만 2.9.2 로 변경
2.9.1 2014/08/05 2567 임성훈
  • 2.9.1 ~ 2.8.6 변경 내역
  • ollehMarket SDK 2.0.4 업데이트
    • SDK 파일만 업데이트
  • OZstore SDK 1.2.1 업데이트
    • SDK 파일만 업데이트
  • Amzaon SDK 2.0 업데이트
  • BuyItem 에서 orderKey -> additionalInfo 로 변경
    • 게임서버군이 여러개 일 경우 등, 구매로그에 추가적인 정보가 필요할 경우 사용합니다.
    • 서버 구분의 경우 "server_id" 라는 키로 jsonString 으로 넣어 주면 됩니다.
  • GET_ITEM_LIST 에 currency 정보추가 (GooglePlay 만)
    • 판매자 계정 기반의 currencyCode 와 amountMicros 값을 추가로 전달합니다.
    • 판매자 계정이므로 currencyCode 의 경우 실제 구매자가 보는 통화기호와는 다를 수 있습니다.
  • READ_PHONE_STATE 종속 제거
    • 해당 퍼미션이 없어도 동작 가능 합니다.
2.8.5 2014/04/29 2552 임성훈
  • 공통 (DefaultLibrary v2014.04.25, Rev.2551)
- selectTarget 의 결과값 저장을 결제가 성공한 이후 buyFinish() 시점에서 저장하도록 수정
- 모든 버전 표기 v2.8.5 로 수정 (Rev.2552)
+ 일부 변수 중 static -> non-static 변경으로 인해 IncompatibleClassChangeError 보완을 위해 리컴파일
  • Tstore (Rev.2548)
- SDK v13.01.01 Updated
- 주요 업데이트 내역
+ 게임 엔진 지원 추가(Unreal engine) 지원
+ Android 4.4(Kitkat) 최적화 대응
+ 상품명 길이 제한 해제(한글 50글자, 영문 100글자 입력 가능)
+ 기존 마이너 이슈 사항 보완
  • ollehMarket (Rev.2548)
- SDK v2.0.3 Updated
- 주요 업데이트 내역
+ Android OS 4.4(KitKat) 모델에서 카드결제 시 페이지 오류 현상 수정
+ 신규 및 업데이트 검수 신청 시 신규 라이브러리 적용 (유예기간 2개월)
※ 2014년 06월 17일 00시부터 검수접수되는 상품은 신규 라이브러리 미적용시 반려사유가 될 수 있습니다.
  • 바꾼 API 는 없고 SDK 파일과 버전표기를 위해 라이브러리만 교체 되었습니다.
2.8.4.1 2014/04/09 2546 조태형(이덕신)
  • 공통 (DefaultLibrary v2014.03.27)
- 결제 방식 선택 팝업창 (selectTarget(), GooglePlay-Lebi) 에서 취소 버튼 삭제
- 결제 방식 선택 팝업 노출 조건 수정
- 노출 조건은 가이드 문서 참고
결제 방식 선택 팝업 조건 (GooglePlay-Lebi)
  • GooglePlay
- initialize (startSetup) 에 마켓과 bind 에 실패할 경우에도 실패 콜백을 내려주도록 추가
에러 내용은 마켓에서 주는 내용으로 내려줌
1:User Canceled / 2:Unknown / 3:Billing Unavailable
4:Item unavailable / 5:Developer Error / 6:Error
7:Item Already Owned / 8:Item not owned
- uninitialize 시 exception 예외 처리 추가


모든 버전의 역사 보기




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 체크해주세요)
  1. InAppDefaultLibrary.jar
  2. InAppTstoreLibrary.jar
  3. InAppTstoreSDK.jar
  4. InAppTstoreSDK_Debug.jar (이번 버전부터는 SDK 파일이 통합되어 쓰이지 않습니다)
  5. gson-2.2.2.jar (새로 추가 됨)
  6. libs / armeabi / libdodo.so (새로 추가 됨)
  7. libs / armeabi / libUSTOOLKIT.so (새로 추가 됨)
  8. libs / armeabi-v7a / libdodo.so (새로 추가 됨)
  9. 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>
(새로 추가 됨)
  <!-- 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" />
(Inapp v2.13.0 이후)

api_version이 4로 변경되었습니다.

  <!-- Tstore -->
  <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 를 참고 해 주세요.
Tstore 인앱결제 가이드 (PDF)


<작성법 참고>

InApp Purchase v2.13.0+ (Tstore SDK v16.02.00+) 적용 시

아래 내용 참고
  • Client side
  • libs 폴더에 아래의 파일들을 업데이트 해 줍니다. (build path 체크해주세요)
  1. InAppDefaultLibrary.jar
  2. InAppTstoreLibrary.jar
  3. InAppTstoreSDK.jar
  4. 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" />
<작성법 참고>

InApp Purchase v2.15.0+ (Tstore SDK v16.05.00+) 적용 시

아래 내용 참고
  • Client side
  • libs 폴더에 아래의 파일들을 업데이트 해 줍니다. (build path 체크해주세요)
  1. InAppDefaultLibrary.jar
  2. InAppTstoreLibrary.jar
  3. InAppTstoreSDKv4-16.05.00.jar
  4. 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" />


<작성법 참고>

InApp Purchase v2.15.0+ (Tstore SDK v17.02.00+) 적용 시 (원스토어 IAP v5)

아래 내용 참고
  • Client side
  • libs 폴더에 아래의 파일들을 업데이트 해 줍니다. (build path 체크해주세요)
  1. InAppDefaultLibrary.jar
  2. InAppTstoreLibrary.jar
  3. InAppTstoreSDKv5-17.02.00.jar
  4. 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 v5 적용 시 설정
  • 원스토어 IAP v5는 Google IAP 결제와 유사한 구매 형태를 갖습니다. 아이템 구매, 구매 복구, 구매 완료 등 모듈에서 제공하는 API의 라이프사이클을 Google과 유사하게 맞춰 개발하면 보다 수월하게 적용이 가능합니다.
  • 원스토어 IAP v5 콘솔 적용 시 주의사항
    • (1) 원스토어 IAP v5 콘솔에 keystore 사이닝 된 apk 업로드
      원스토어 구매 테스트 시 콘솔에 keystore 사이닝 된 apk를 업로드해야 합니다. 이후 구매 테스트는 꼭 keystore 사이닝 된 샘플로 진행해야 가능합니다.
    • (2) 패키지 네임(앱아이디) 일치
      AndroidManifest.xml에 설정된 패키지 네임은 꼭 원스토어 콘솔에 등록된 패키지 네임과 일치해야 합니다.
    • (3) 구매 테스터 등록
      테스터는 원스토어 계정으로 등록됩니다. 또한 정상 구매를 위해서는 원스토어 앱이 업데이트 되어있어야 하며, 테스트 계정이 원스토어 앱에 로그인되어 있어야 합니다.
  • 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


  • 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 라이브러리를 추가합니다.
  1. 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" />


<작성법 참고>

InApp Purchase v2.14.0+ 에서 Lebi 충전 수단으로 WeChat Pay 적용 시

아래 내용 참고
  • Client side
  • libs 폴더에 아래의 WeChat 라이브러리를 추가합니다.
  1. 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" />
  • /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>
- (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>


<작성법 참고>

InApp Purchase v2.16.0+ 에서 Samsung GalaxyStore 적용 시

아래 내용 참고
  • Client side
  • libs 폴더에 아래의 Samsung GalaxyStore 라이브러리를 추가합니다.
  1. 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"/>
  • Samsung GalaxyStore 사용 시 반환되는 에러 정의
    • 콜백으로 전달되는 errorCode에 대해서 아래 내용을 확인 바랍니다.
/**
 * 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로만 해주신 다음 테스트하여 확인을 부탁드리겠습니다.


<작성법 참고>

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.** { *;}
<작성법 참고>

InApp Purchase v2.17.0+ 에서 Huawei Billing 적용 시

  • ModuleManager v2.5.16+ 적용 필요
  • 프로젝트의 libs 이하에 InAppLibrary-huawei-2.17.x.aar 라이브러리 파일 추가
    • 모든 billing 코드가 들어있는 InAppLibrary-inappAll-x.x.x.aar을 통해선 Huawei Billing 사용 불가
  • 프로젝트 폴더에 파일추가
    • Huawei 콘솔에서 다운로드 받은 agconnect-services.json 파일을 프로젝트 루트 디렉토리에 복사
    • example agconnect json.png
  • Project 폴더내 build.gradle에 아래 내용 추가
allprojects {
    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
    }
}
  • app 폴더내 build.gradle에 아래 내용 추가
dependencies {
  //...
  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
    }
}
  • 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.**{*;}
<작성법 참고>

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" 가 됩니다.
- [적용 전 주의사항]
  1. API 3 부터는 영구성, 소모성 개념이 사라집니다.
    마켓에 다르게 등록해도 그것은 API 1, 2 를 위한 부분이며 API 3 에서는 소모성으로 등록해도 영구성처럼 사용이 가능하고 반대도 가능합니다.
  2. 그리하여, 모듈단에서는 아이템이 영구성인지 소모성인지 알 수가 없기때문에 요청시에 꼭 구분이 되어야 하며,
복구시에도 ( RestoreItem() ) 꼭 pid 를 체크 해 주세요. (소모성 복구 콜백이 가면 무시)
- [적용 방법]
  1. InAppGooglePlayLibrary.jar, InAppDefaultLibrary, C2SInApp.h 3가지 파일을 업데이트 합니다.
  2. Initialize 시에 pids 파라미터를 입력해 주면 itemlist() 콜백을 받을 수 있습니다. 형식은 iOS 와 같습니다.
  3. BuyItem 시에 quantity 파라미터를 0으로 주면 영구성, 1로주면 소모성으로 간주 합니다. (중요, KDDI 마켓과 형식 동일)
  4. 나머지 부분은 GoogleInApp API 1 과 동일하며, 콜백도 동일합니다.
- [API 1, 2 -> 3 주요 변경사항]
  1. 검증에 필요한 Public key 가 계정에 하나로 귀속되던 부분이 어플당 하나씩으로 개별 적용됩니다.
    이미 납품 된 어플은 기존 Public key 로 모두 동일하지만, 신규 납품하는 어플은 개별 적용 되는 것으로 봅니다.
  2. 위의 주의사항에 언급한 managed, unmanaged (영구성, 소모성) 개념이 사라지고 모두 영구성처럼 간주됩니다.
    그래서 실질적으로 내부 구조는 아이템을 "구매요청" 을 날린 후, 소모성 아이템 처럼 사용할 경우 "소모요청" 을 다시 날리게 되는 구조입니다.
    하여, 중간에 "소모요청"을 못하게 되는 경우가 어떻게든 생길 수가 있게 되는데 이때 복구를 하게되면 소모성 아이템처럼 사용하던 pid 가 복구가 되게 됩니다.
    ResotreItem 시 pid 를 체크 해 주세요.
  3. Android SDK 8 (2.2) 이하에서는 지원하지 않습니다. minSDK 가 최소 8 이상이어야 합니다.
  4. 영수증이 기존 API 1, 2 때와는 다르게 무조건 1건당 1개 입니다. 따라서 orders, notificationID 등의 항목이 사라진 JSON 형태의 영수증으로 바뀌었습니다.
  5. 마켓 켄슬 (취소, 환불) 건에 대해 예전에는 비동기이긴했지만 신호가 바로 왔던것에 비해, API 3 에서는 마켓어플과 동기화 할때 갱신됩니다. (보통 어플 재시작 후...)
RestoreItem 시에 콜백을 못 받는 경우, 아이템이 취소 혹은 환불 된 경우입니다.
(단, RestoreItem 이 실패하여 못 주는 경우는 제외, 실패일 경우 BUY_FAILED 리턴을 주도록 하였습니다.)
- [영수증의 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" />


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하여 빌드되도록 설정합니다.

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');
}
//...(생략)...

4) gradle.properties 파일 내 androidX 사용 설정

  • gradle.properties 파일 내 아래의 코드를 추가하세요. gradle.properties 파일이 존재하지 않는 경우 신규 생성 후 아래의 코드를 추가하세요.
android.useAndroidX=true
android.enableJetifier=true


Com2uS 공통모듈 >> InApp Purchase >> InApp Purchase 모듈 적용 가이드 (iOS)

InApp Purchase 모듈 적용 가이드 (Android)

InApp Purchase 모듈 적용 가이드 (Unity3d)

>> InApp Purchase 모듈 레퍼런스 가이드 >> InApp Purchase 샘플 가이드 (Android) >> InApp Purchase FAQ
개인 도구
이름공간

변수
행위
둘러보기
도구모음
인쇄/내보내기