# 개발도구

### **원스토어 개발자센터용 API나 SDK는 어디서 다운로드 받을 수 있나요?** <a href="#id-api-sdk" id="id-api-sdk"></a>

* [개발도구 ](https://onestore-dev.gitbook.io/dev/tools/billing)에서 SDK 다운로드 및 API 목록을 확인하실 수 있습니다.

### **Android API 변경으로 앱의 기능이 일부가 작동하지 않을 수도 있다고 합니다. 확인할 방법이 있나요?** <a href="#id-androidapi-." id="id-androidapi-."></a>

* 원스토어 개발자센터에서는 새로운 OS Version의 단말이 출시하기 전에 판매회원님의 상품이 변경된 OS Version, API level 변경에 동작 이상이 발생하는지 여부를 한번 더 검증 후,\
  문제가 없는 상품이 사용자들에게 보여질 수 있도록 검증(QA)을 확대, 강화했습니다.
* 또한 판매회원이 직접 OS Version을 선택해서 수정할 수 있습니다. 자세한 내용은 상품 등록 가이드를 참고하시기 바랍니다.&#x20;

### **원스토어의 상품에 업데이트가 존재하는지 확인할 수 있는 방법이 있는지 알고싶습니다.** <a href="#id-." id="id-."></a>

* 업데이트 연동가이드는 현재 원스토어 Client가 설치된 여부 확인 및 상세 페이지로 이동만 가이드 하고 있습니다.&#x20;
* 업데이트 사항의 존재 유무 여부에 대한 확인은 별도로 제공하지 않고 있지만 추후 제공 할 수 있도록 검토 중입니다.

### **Android Debug key Signing 이라면서 APK 업로드가 안됩니다.** <a href="#id-androiddebugkeysigning-apk-." id="id-androiddebugkeysigning-apk-."></a>

* 일반적인 개발툴(Eclipse, Android Studio)에서는 Android SDK를 통해서 애플리케이션을 실행할 때마다 자동으로 디버그 서명을 만들고,
* 이 서명은  Application이 사용될 때마다 서명되지만, Android 상품을 원스토어 개발자센터에 등록 하여 판매 하고자할 경우 배포전 개인 인증서키를 이용하여 Application Signing을 해주어야 합니다.
* 기본적으로 Android Build 시 Debug키나 Signing을 하지 않을 경우, 업데이트시 설치가 되지 않거나, 유효기간 만료로 배포가 되지 않을 수 있습니다.\
  개인키로 Signing 후 패키징을 진행하여 상품 PKG 진행 부탁 드립니다.
* **개인 인증서 목적 및 효용**
  * 개발자 자신이 개발한 Application임을 사용자에게 알리고, 하나의 인증서로 관리하기 위함
  * Contents 업그레이드 간편화
  * 여러 Application을 하나의 프로세스로 실행

{% hint style="info" %}
코드, 데이터 공유

Signing은 개발자가 인증하는 Application임을 서명을 통해서 알리는데 목적이 있으며, 이를 위해서 개인 키를 포함하는 암호화된 서명 파일이 있는 keystore가 필요하고, 이를 JDK에서 제공하는 jarsigner 로 공개키로 서명하게 됩니다. 보다 자세한 내용은 여기서 확인하시기 바랍니다.&#x20;
{% endhint %}

**keystore 생성 / APK파일 생성 및 서명하는 방법**

* ￼Android Application 개발 및 Build 후, 정상 실행 및 동작을 확인 하여, Signing 작업을 진행 합니다. \
  이후 개인키를 이용하여, 마지막 Signing 작업은 진행 해주시면 됩니다.<br>

  <figure><img src="https://1837360763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fot0z57AnnXZ02C5qyePV%2Fuploads%2FnG7C4XTmU9V9dUhwCmPf%2Fimage.png?alt=media&#x26;token=34f95091-e880-42c4-8182-08338a349230" alt=""><figcaption></figcaption></figure>
* #### ￼신규 개인키를 생성하여, Signing 적용하는 방법 <a href="#id-signing" id="id-signing"></a>
  * Eclipse > Open Project(프로젝트 생성, 개발) > Run > Run&#x20;
  * File > Export > Android > Export Android Application
  * Browse > Select Android Project
  * Create new keystore > Input Location,Password,Confirm(저장할 인증키 위치 및 비밀번호 설정)
  * Input Alias,Password,Confirm,Validity(years), First and Last Name, Count Code(다른 입력사항의 경우 선택)&#x20;
  * 저장할 APK 파일 위치 설정(Browse > 저장할 공간 설정) > Finish(완료)\
    \ <br>

    <figure><img src="https://1837360763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fot0z57AnnXZ02C5qyePV%2Fuploads%2F9Sw5ze4l6ns0qzzox2Wr%2Fimage.png?alt=media&#x26;token=25b5550b-aa65-41a4-904f-5d98d38cda04" alt=""><figcaption></figcaption></figure>

    <figure><img src="https://1837360763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fot0z57AnnXZ02C5qyePV%2Fuploads%2Fvh1XcMfnbAyJraPI5UZB%2Fimage.png?alt=media&#x26;token=e63d28e9-3eaa-4bb8-95fa-40e4a9a5ac6e" alt=""><figcaption></figcaption></figure>
* #### ￼이미 발급 된 개인키를 이용하여, Signing 적용하는 방법  <a href="#id-signing" id="id-signing"></a>
  * Eclipse > Export > Android > Export Android Application
  * Browse > Select Android Project
  * Use existing keystore , Input password(신규 생성시 입력한 keystore비밀번호)&#x20;
  * Use existing key, Input password (신규 생성시 입력한 alias비밀번호)
  * 저장할 APK 파일 위치 설정(Browse > 저장할 공간 설정) > Finish(완료)<br>

    <figure><img src="https://1837360763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fot0z57AnnXZ02C5qyePV%2Fuploads%2FnacaedWMQMbCrvAN8ima%2Fimage.png?alt=media&#x26;token=744b86f4-e9a3-4c47-b685-a30ab3e8e4fb" alt=""><figcaption></figcaption></figure>
* #### ￼JDK를 이용하여 개인키를 생성하여, Signing 적용하는 방법 <a href="#id-jdk-signing" id="id-jdk-signing"></a>
  * 명령어 프롬프트진입(PC 시작 > 실행 > CMD 진입)
  * 명령어 입력 key생성 : 명령어 keytool을 이용하여 개인키 생성

    Ex) keytool -genkey -v –keystore tstore.mykey -alias mytstore -keyalg RSA -validity 10000\
    keytool : key 생성 명령어, keystore : key 생성 이름, alias : 가명, 가칭 이름. Keyalg : 알고르즘 validity : 기간
  * key생성후 Eclipse를 이용하여 앞서 설명한 발급 된 개인키 이용, Signing 적용하는 방법으로 적용하면 됩니다.\
    ![](https://1837360763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fot0z57AnnXZ02C5qyePV%2Fuploads%2FUXKGYWLfYTLADyNdAzvZ%2Fimage.png?alt=media\&token=2f4c6ec8-2f1c-4131-86d7-1838f7730f77)
* * 자세한 사항은 [JAVA의 관련 URL](http://java.sun.com/j2se/1.5.0/docs/tooldocs/#security)을 참고 부탁 드립니다.

### **검증(QA)과정에서 특정 해상도에서 오류가 발생한다고 합니다.** <a href="#id-qa-." id="id-qa-."></a>

* 기본적으로 원스토어 개발자센터에 올라오는 상품은 Android 다자인 가이드라인에 따라서 작성하는 것을 권장합니다.
* 다양한 해상도와 스크린(LCD)에 대응하기 위한 반응형 레이아웃(flexible layouts) 개발로 권장 드립니다. [ ](http://developer.android.com/training/multiscreen/index.html)

### **Android 4.0(Ice Cream Sandwich) 단말에서 호환성 문제로 검증 반려가 됐습니다.** <a href="#id-android4.0-icecreamsandwich-." id="id-android4.0-icecreamsandwich-."></a>

* 일부 상품이 Ice Cream Sandwich OS(이하 ICS) 환경에서는 특정 오류 문구(“Application명”이 중지되었습니다.)를 출력하며 비정상 종료되는 현상이 검증과정에서 발생하고 있습니다. 그 원인과 대응 방법를 참고하시기 바랍니다.&#x20;
  * **원인: GC 의 예외 처리가 엄격화 됨에 따라 어플리케이션 실행에 영향을 줄 수 있음**
    * &#x20;GC관련 일반적인 오류 항목
      * Native 영역에서 Java 객체를 저장할 때 JNI로 들어오는 모든 객체는 local reference이므로 해당 함수를 벗어나면 메모리가 해제됩니다. 따라서 외부에서 지속적으로 참조할 필요가 있는 객체는 global reference로 선언하여 관리해야 합니다.
      * FindClass의 반환 값을 global reference로 사용하고자 할 때 지속적으로 참조할 필요가 있는 값인 경우 NewGlobalRef로 변경하여 저장해야 합니다.
      * JNIEnv를 저장하여 사용할 경우 JNIEnv는 다른 thread context에서 사용할 수 없습니다.
  * **해결 가이드**
    * Java Exception, JNI 오류 메시지 확인(JNI ERROR, JNI WARNING) 후 수정
    * CheckJNI 툴 활용
    * JNI 호환 모드 해제 후 디버깅
      * manifest에서 targetSdkVersion을 14(Ice Cream Sandwich)로 설정.

{% hint style="info" %}
위 분석 내용은 원스토어 개발자센터 내 판매 중인 상품에 대하여 임의 상품을 선정하여 ICS 환경에서 테스트 및 분석 결과를 바탕으로 작성되었습니다.\
ICS 지원 상품 개발 진행 시 참고하시어 상품 개발 및 판매에 도움이 되셨으면 합니다.
{% endhint %}

<br>

**원스토어 In-App Purchase**

* **\[API V5] 인앱결제 테스트 시 '비정상 앱에서 결제가 요청되었습니다.'는 메시지가 나오고 결제 진행이 안됩니다.**
  * 해당 이슈는 상용 검증 환경 또는 상용 환경에서 발생되는 이슈 입니다. 다음의 내용 확인 부탁드립니다.
    * 앱 개발 중인 경우
      * 개발 중인 앱의 경우, 상용 검증 환경에서 개발하시는 것 보다, 개발자 모드로 전환하여 개발을 진행 하는 것이 좋습니다.
    * 개발 완료 후, 상용 검증을 진행 하고 싶을 경우
      * 개발자 모드에서 개발을 완료하고 상용 환경에서 확인을 해보고 싶을 경우, 다음의 내용 대로 진행 하시면 됩니다.
      * 가. 개발 완료 된 APK를 배포용 signing key 이용하여 signing 하여 개발자 센터에 등록
      * 나. 테스트 용도의 아이디를 상용 테스트로 변환
      * 다. 동일한 signing key로 signing 된 apk를 이용하여 상용 테스트
      * 라. 결제 취소 하기
    * &#x20;APK가 개발자 센터에 등록되어 있는 상태에서 상용 결제 불가한 경우
      * 결제 테스트로 이용한 APK의 signing key가 원스토어 개발자 센터에 등록한 apk와 동일한지 확인
      * 동일 하지 않으면 동일한 key로 signing, 동일한 경우 이슈가 발생하는 apk와 test case를 개발자 센터를 통해 전달 부탁드립니다.

### **\[API V5] 기존에 원스토어에서 판매 중이던 API V4로 개발된 앱을 API V5로 업데이트 할 수 있나요?** <a href="#id-apiv5-apiv4-apiv5" id="id-apiv5-apiv4-apiv5"></a>

* 원스토어 인앱결제 API V5(SDK V17)는 이전 버전과 전혀 다른 구조로 설계되었기 때문에 하위 호환성이 없습니다.\
  따라서, 인앱결제 API V5(SDK V17)는 신규 상품을 등록할 경우에만 적용 가능합니다.
* 현재 판매하고 있는 상품이 API V4(SDK V16)를 적용한 경우, 해당 인앱버전으로 계속 상품을 업데이트하고 서비스하시면 됩니다.

### **\[API V5] 기존 API V4 (IAP SDK V16)에서는 전자영수증 검증 기능이 있었는데요, API V5에서는 이 기능을 지원하지 않는 것인가요?** <a href="#id-apiv5-apiv4-iapsdkv16-apiv5" id="id-apiv5-apiv4-iapsdkv16-apiv5"></a>

* API V5 (IAP SDK V17)부터는 더 이상 전자영수증을 사용하지 않으며, API V5 기반 앱에서 발생한 결제에 대해서 API V4로 조회가 불가능합니다. 하위 호환성을 제공하지 않으며, API V5를 신규 적용한 앱을 출시하는 경우 서버 API 중 구매이력 조회나, 단말 API 중 미소비 상품조회 API를 이용하여 구현하면 됩니다.
* 원스토어는 인앱결제 API V4(SDK V16)에 대한 결제 서비스도 지속적으로 제공합니다.

### **\[API V5] 원스토어 앱을 로그인하지 않은 상태에서 launchLoginFlowAsync를 호출하면 onErrorSecurityException이 발생합니다.** <a href="#id-apiv5-launchloginflowasync-onerrorsecurityexception-." id="id-apiv5-launchloginflowasync-onerrorsecurityexception-."></a>

* 원스토어 서비스의 보안 로직에 의해 접근이 허가되지 않았습니다.\
  최신 원스토어 서비스(6.064 이상)는 이 문제를 해결하였으니, 원스토어 서비스를 최신 버전으로 업데이트 하세요.

### **\[API V5] onErrorRemoteException 에러는 어떤 상황에서 발생하나요?** <a href="#id-apiv5-onerrorremoteexception" id="id-apiv5-onerrorremoteexception"></a>

* onErrorRemoteException 은 원스토어 서비스와 binding 연결을 하지 않은 상태에서 API를 호출할 경우 발셍됩니다. 해결을 위해 아래 두 가지를 확인해야 합니다.
  * 원스토어 서비스가 정상 동작 하는지 확인
    * 원스토어 앱에서 상품 구매 시 정상적으로 결제창이 열리는지 확인합니다. (결제 할 필요는 없음)
  * PurchaseClient 라이프 사이클 확인
    * 원스토어가 제공한 샘플 중 LuckyActivity.java에 initHelper 라는 함수가 있습니다.&#x20;
    * 해당 코드를 보면 mPurchaseclient.connect를 호출하여 원스토어 서비스와 연결하는데, isBillingSupportedAsync API 사용 전에 해당 연결하는 작업을 했는지 확인이 필요합니다. 했더라도 API 호출 전에, mPurchaseClient.terminate(); 가 호출되는 case가 없는지 확인해 봅니다. terminate의 경우, 원스토어 서비스와 바인딩을 명시적으로 끊어버리기 때문입니다.

      ```
      mPurchaseClient = new PurchaseClient(this, AppSecurity.getPublicKey());
      ~/~/ 원스토어 서비스로 인앱결제를 위한 서비스 바인딩을 요청합니다.
      mPurchaseClient.connect(mServiceConnectionListener);
      ```

**\[API V5] API V4에서는 개발용 모드, 상용 모드로 접속하기 위해서 접속모드를 명시 후 앱을 빌드하여 테스트 했습니다. API V5에서 개발용 모드, 상용 모드는 어떻게 설정하나요?**

* API V5에서는 테스트를 위해 별도 모드 설정 및 빌드를 할 필요가 없습니다. 원스토어 개발자센터의 해당 앱에 테스트 ID를 등록하고, 테스트 모드를 설정할 수 있습니다. 자세한 내용은 개발자가이드 내, '[결제 테스트 및 보안](https://onestore-dev.gitbook.io/dev/tools/billing/old-version/v17/undefined-5)' 항목을 참고하시기 바랍니다.

### **\[API V5] 결제 테스트 시, "Service has not allowed."라는 메시지가 나오고 진행이 안됩니다. 무엇이 문제인가요?** <a href="#id-apiv5-servicehasnotallowed.-." id="id-apiv5-servicehasnotallowed.-."></a>

* API V4(SDK V16)용 라이브러리 적용 시 노출되는 에러 입니다. API V5(SDK V17)을 이용해 개발해주세요.

### **\[API V5] API V4에서는 TID, TxID라는 용어가 사용되었었는데,** **API V5에서는 orderId, purchaseId, developerPayload 등 생소한 용어가 많이 나옵니다.** **각각 어떤 의미이며, 어떨때 활용하는 것인지 궁금합니다.** <a href="#id-apiv5-apiv4-tid-txid-apiv5-orderid-purchaseid-developerpayload-.-." id="id-apiv5-apiv4-tid-txid-apiv5-orderid-purchaseid-developerpayload-.-."></a>

* orderId는 purchaseId와 같이 결제 transaction을 구분할 수 있는 ID로 확장 API, VOC 처리, 향후 추가기능 등에 적용될 수 있습니다.
* orderId와 pruchaseId는 transaction의 unique한 key값으로 변경되지 않으며 두 값은 1:1로 대응됩니다.
* API V5부터는 인앱결제 I/F에서 사용되는 주요 키가 purchaseId로 변경되었습니다.
* 고객문의 응대 시 개인정보가 없는 developerPayload나 orderId 사용을 권장합니다.
* 현재 개발자센터의 고객관리 메뉴 하위의 TxID 조회 등의 화면에서 조회 및 취소 요청 시에는 TxID(orderId)나 TID(developerPayload)로만 가능하나,\
  최대한 빨리 purchaseId로도 조회/취소요청이 가능하도록 개선할 예정입니다.
* API V4와 V5 간 거래관련 용어의 매칭은 다음과 같습니다.

  | API V4      | API V5           |
  | ----------- | ---------------- |
  | TxID        | orderId          |
  | TID, bpinfo | developerPayload |
  | 없음          | purchaseId       |

### **\[API V5] '클래스를 찾을 수 없습니다.'라는 오류 메시지가 나옵니다.** <a href="#id-apiv5-.-." id="id-apiv5-.-."></a>

* 라이브러리가 잘못 적용되어 있을 가능성이 높습니다. 특히 16과 17은 클래스 구성이 다르니 17용 라이브러리를 사용하였는지 확인 하시기 바랍니다.

### **\[API V5] 해외에서 개발자들이 신용카드로 상용결제 테스트를 할 수 있는 방법이 있는지요?** <a href="#id-apiv5" id="id-apiv5"></a>

* 원스토어는 한국에서 발행된 신용카드로만 결제가 가능합니다.
* 상용결제 테스트가 불가능할 경우 Sandbox 결제 테스트만 진행하셔도 원스토어에서 서비스하는 데 문제가 없으니 참고하시기 바랍니다.

### **\[API V5] Public Key(라이센스 Key)란?** <a href="#id-apiv5-publickey-key" id="id-apiv5-publickey-key"></a>

* 인앱 결제로 구매한 항목을 확인하거나, 구매내역 검증 시 이용하는 공개키 입니다.
* 공개키를 확인하고 싶다면 인앱결제 적용을 위한 사전준비([링](https://dev.onestore.co.kr/devpoc/reference/view/IAP_v17_04_preparation)[크](https://onestore-dev.gitbook.io/dev/tools/billing/old-version/v17))의 4번 항목을 참고하세요

### **\[API V5] Guide에 라이센스 Key 관련 NDK를 제공한 이유는?** <a href="#id-apiv5-guide-key-ndk" id="id-apiv5-guide-key-ndk"></a>

* Google의 경우도 해당 key에 대한 보호가 필요하다고 하고 있으며("API Key를 어플리케이션 코드 내에 바로 삽입 하지 않고,\
  복호화가 가능한 암호화 (가령 XOR 연산을 예를 들면) 를 이용 하는데, 어플리케이션 실행 시 암호화 하도록 하고, 암호화에 사용하는 키를 서버 로 부터 획득 하는 구조로 구현 하도록 한다."), 보호하는 방법의 하나로 NDK 방식을 제공하였습니다. 실제로는 개발사 별 자체 방식대로 라이센스 Key를 보호하면 됩니다.

### **\[API V4] 결제 완료 후 구매 결과 값을 받지 못할 경우 아이템 지급 방법이 있나요?** <a href="#id-apiv4" id="id-apiv4"></a>

* App에서 결제 완료 후 구매 결과 값을 받지 못할 경우를 대비 하여 App 실행시 원스토어 개발자센터 In-App 결제 모듈 API 중 Query기능([request\_purchase\_history](https://github.com/ONE-store/inapp-sdk/wiki/IAP-Sample-Specification#request_purchase_history))을 사용하여 아이템 구매 여부를 확인 후 성공인 경우 아이템을 지급 하도록 처리 하면 됩니다.
* 또한 Server API인[ TID 구매이력 조회](https://onestore-dev.gitbook.io/dev/tools/billing/old-version/v16)를 이용하여 특정 시점에 결제의 정상처리 여부를 확인하여 아이템 지급 여부를 판단할 수 있습니다.

### **\[API V4] In-App 상품 결제 테스트 방법 및 유의사항** <a href="#id-apiv4-in-app" id="id-apiv4-in-app"></a>

* **In-App 상품 결제 테스트 시에는 개발용 In-App 결제 모듈을 사용하여 테스트 하셔야 하며(dev 폴더 내 JAR 파일),**&#x20;
* 테스트 완료 후 상용 In-App 결제 모듈(release 폴더 내 JAR 파일)을 적용하여 Build한 바이너리를 등록 및 검증요청하셔야 합니다.
  * #### Self-Test 진행 과정 <a href="#id-self-test" id="id-self-test"></a>
    * 경로: 원스토어 개발자센터 > Apps > 상품현황 > In-App 정보 > 테스트
    * Self-Test 진행 방법
      * 테스트 단말 탭 > MDN추가 및 다양화 결제 수단 포인트를 입력하여 테스트 단말 등록
      * 상품별 설정 탭 > 결과 설정(정상, 원스토어 회원탈퇴, 판매중지 등)을 변경 하여 상품 자체 테스트 진행
      * 과금 로그 조회 및 구매 내역 조회를 통해 상품의 정상 구입 및 과금 여부 확인 > 테스트 완료
      * 상용 In-App 결제 모듈(release 폴더 내 JAR 파일)를 적용하여 재컴파일 후 검증 요청 진행\
        &#x20;(검증 상용 환경 기준으로 진행되므로  In-App과 연동하는 상용 Server 의 정상동작 여부의 확인이 선행되어야 합니다)
    * In-App 결제의 상품 등록 등의 자세한 내용은 원스토어 개발자센터의 [IAP Developer Guide](https://onestore-dev.gitbook.io/dev/tools/billing/old-version/v16)을 참고하기 바랍니다.&#x20;

### **\[API V4] 월별 자동결제 상품 해지 확인하는 방법이 있나요?** <a href="#id-apiv4" id="id-apiv4"></a>

* In-App 결제 모듈에서 월별 자동결제 상품 해지 여부를 확인 하는 API는 지원 하지 않으므로 상품인증 API의 만료일 체크로 확인 해야 합니다.
* 월별 자동결제 상품 해지가 된 후  [request\_purchase\_history](https://github.com/ONE-store/inapp-sdk/wiki/IAP-Sample-Specification#request_purchase_history), auth\_item로 sendCommandRequest 함수를 호출 하였을 때 결과 데이터로 수신되는 endDate 필드 값으로 계속 결제로 인한 사용만료일 연장 여부를 확인할 수 있습니다.
* 자세한 내용은 원스토어 개발자센터의 IAP SDK Reference > [sendCommandRequest](https://github.com/ONE-store/inapp-sdk/wiki/IAP-SDK-Reference#2-sendcommandrequest)를 참고하시기 바랍니다.

### **\[API V4] 영구성 In-App 상품의 경우 In-App 상품 개발에 차이가 있나요?** <a href="#id-apiv4-in-app-in-app" id="id-apiv4-in-app-in-app"></a>

* 영구성 상품을 이용 하고자 할 경우 App 재설치 등의 사유가 발생 할 수 있으므로 기존 구매 여부 확인 후 아이템을 복원 해주도록 예외처리를 해주셔야 합니다.\
  (Ex : 컨텐츠 삭제 및 재이용시 In-App 상품 결제가 불가 하므로 예외 처리 필요)
* App 실행 시 In-App 결제 SDK API 중 Query 기능을 사용 하여 아이템 구매 여부를 확인 후 성공인 경우 아이템 지급 하도록 구현 부탁드립니다.\
  (Query 기능 : auth\_item, whole\_auth\_item 등)

\
\&#xNAN;**\[API V4] 영구성 In-App 상품 Self-Test 시 결제가 계속 됩니다. 복원의 함수도 없는것 같구요.**

* 자세한 내용은 원스토어 개발자센터의 [IAP SDK Reference](https://onestore-dev.gitbook.io/dev/tools/billing/old-version/v16)를 참고하시기 바랍니다.
* 상품 결제 테스트 및 개발의 편의를 위하여 개발 환경에서만 예외적으로 중복 구매 가능하도록 되어있으며, 상용 In-App 결제 모듈 적용 시에는 최초 1회 구매가 가능 하며 이후 구매 요청 시 구매 불가 팝업이 노출 됩니다.&#x20;

### **\[API V4] item\_use 또는 subtract\_points 메소드를 사용시 포인트 차감 수량은 몇 개 인가요?** <a href="#id-apiv4-item_use-subtract_points" id="id-apiv4-item_use-subtract_points"></a>

* item\_use 또는 subtract\_point 메소드 사용 시 고정으로 1포인트가 차감 됩니다.&#x20;

### **\[API V4] 전자영수증은 어디에 있나요?** <a href="#id-apiv4" id="id-apiv4"></a>

* 앱상품 구매요청을 보낸 후 결제가 정상적으로 성공하면, 구매요청의 응답값에 서버에서 발급한 전자영수증 데이터가 포함되어 내려옵니다.
* 샘플 소스코드에 나와있는 것처럼 IapResponse 객체 data 에 전자영수증이 포함되어 내려옵니다. 샘플 소스코드 확인 바랍니다.&#x20;

  ```
  @Override
  public void onResponse(IapResponse data) { ...
  } 
  ```
* 정확한 흐름 확인을 위하여 원스토어 개발자센터의 [IAP quick Guide](https://github.com/ONE-store/inapp-sdk/wiki/IAP-Quick-Guide)를 참고하시기 바랍니다.

### **\[API V4] 전자영수증 검증 샘플 코드를 얻을 수 없을까요?** <a href="#id-apiv4" id="id-apiv4"></a>

* 샘플코드는 IAP 라이브러리 압축파일에 있는 sample\_app 코드의 ReceiptConfirm 클래스를 참조 바랍니다.
* Http post 전송 및 처리는 ReceiptConfirm 클래스의 doInBackground 메소드를 참조하시기 바랍니다.&#x20;

### **\[API V4] 분명히 전자영수증 검증 요청에 필요한 데이터를 모두 보냈는데 파라메터가 부족하다고 나옵니다.** <a href="#id-apiv4-." id="id-apiv4-."></a>

* 전자영수증 검증 요청에는 3 가지 데이터가 필요합니다.
* txid, appid, receipt(전자영수증) 데이터가 올바른지 다시 한 번 확인해주시고, http post 전송시 http header 값의 “Content-type”이 “application/json”으로 설정되어 있는지 확인 바랍니다.&#x20;
* 전송시 http body는 아래와 같은 형태가 되어야 합니다.
* { "txid":"TSTORE0004\_20150515102510XXXXXXXXXXXXXXX", "appid":"OA00012345", "signdata":”MIIH7QYJKoZIhvcNAQcCo … ozANBglghkgBZQMEA" }

### **\[API V4] 구매이력조회 인터페이스 요청을 했는데 ‘9999’ 에러 코드가 나옵니다.** <a href="#id-apiv4-9999-." id="id-apiv4-9999-."></a>

* TID 를 잘못 입력했을 가능성이 큽니다. 구매이력조회 인터페이스에 사용되는 TID 는 구매요청시 개발자가 입력한 값이고, 결제를 완료했을 때 내려오는 TXID 와 구분이 되어야 합니다.
* TXID 는 전자영수증 검증에 사용되는 값이니 TID 와 혼동 없으시기 바랍니다.

### **\[API V4] 구매 전자 영수증 검증 Interface 를 사용하려는데, 계속 필수 파라미터 부족이 뜹니다.** <a href="#id-apiv4-interface-." id="id-apiv4-interface-."></a>

* 전자 영수증 검증은 JSON 객체를 만들고 http body 부분에 JSON 객체의 내용을 POST 방식으로 전자영수증 검증 서버로 요청하도록 구현 해야 합니다
* 전자 서명 영수증 검증 요청 시에는 appid, txid, signdata를 JSON 형식의 데이터를 post 방식으로 요청 하면 되며 http header 값 중 content-type의 값을 application/json으로 설정 하여 검증 요청 진행 하면 됩니다.

  ```
  JSONobject json = new JSONObject(); // JSON 객체 생성
  json.put("appid","OA00123456");
  json.put("txid", txid);
  json.put("signdata", signdata); // 요청용 JSON 객체 완성
   
  HttpClient client = new DefaultHttpClient();
  HttpPost httpPostRequest = new HttpPost("https://iapdev.tstore.co.kr/digitalsignconfirm.iap");
  StringEntity se = new StringENtity(json.toString(), "UTF-8");
   
  httpPostRequest.setEntity(se); // 요청용 String 객체 셋팅
  httpPostRequest.setHeader("Content-Type", "application/json"); // Header 설정
   
  HttpResponse resp = client.execute(httpPostRequest); // 전자영수증 검증 요청 후 응답을 받아옴
  ```

**프로가드 적용 시 예외처리를 할 수 있나요?**

* 원스토어 개발자센터 최신 In-App 결제 모듈 적용 시 프로가드를 적용할 경우는 아래 샘플 proguard config를 참고하여 설정 바랍니다.
* proguard config: Proguard-project.txt 파일에 아래 항목을 추가 해야 정상적으로 작동 합니다.

  ```
  // proguard config
          -keep class com.skplanet.dodo.**{*;}
          -keep class com.skplanet.internal.dodo.**{*;}
          -keep class com.skplanet.payplanet.dodo.**{*;}
          -keep class com.skplanet.payplanet.iap.**{*;}
          -keep class com.skplanet.payplanet.internal.**{*;}
   
          -keep class com.google.gson.**{*;}
          -keep class com.skplanet.dev.guide.pdu.**{*;}
          -keep class com.tmoney.aidl.**{*;}
   
          -keep public class android.net.http.SslError
          -keep public class android.webkit.WebViewClient
   
          -dontwarn android.webkit.WebView
          -dontwarn android.net.http.SslError
          -dontwarn android.webkit.WebViewClient
   
          -keepattributes Signature
          -keepattributes *Annotation*
          -keepattributes JavascriptInterface
   
          -dontshrink
  ```

  <br>
* 추가적으로 Sample App(iap\_api\_sample)의 유틸리티 패키지(com.skplanet.dev.guide.helper, com.skplant.dev.guide.pub, gson-2.2.2.jar)를 그대로 사용 할 경우 gson 관련 클래스도 프로가드 대상에서 제외해야 하므로 아래 항목이 추가 되오니 참고하시기 바랍니다.

  ```
  -keep class com.google.gson.**{*;}
  -keep class com.skplanet.dev.guide.pdu.**{*;}
  ```

### **In-App 결제 모듈 관련 문의만 빠르게 답변을 받고 싶어요.** <a href="#id-in-app-." id="id-in-app-."></a>

* In-App 결제 모듈 적용 관련 문의 시에는 아래 항목을 포함하여 운영팀 대표메일(<devhelper@onestore.net>)로 문의 주시기 바랍니다.
* 또는 Q\&A(Support > Help > 기술지원 > 질문유형 : 기술지원) 로 문의 주시면 보다 빠르게 확인해서 지원드릴 수 있습니다.

{% hint style="info" %}

* In-App 결제 모듈 적용 문의 항목

  * Application ID
  * 상품명
  * PID
  * 오류 발생 시간
  * 과금 테스트 시 사용한 휴대폰 번호
  * 과금 테스트 시 사용한 휴대폰 모델명 및 Android OS Version
  * 전체 오류 로그(App 실행 시부터 오류 발생 시까지)
  * In-App 결제 모듈 적용 소스 발췌
  * In-App 결제 모듈 구현 로직 및 동작 Flow 설명
  * 오류 현상 및 재현 경로(오류 화면 포함)
  * 소스 내 Application ID 및 PID 정상 입력 여부 확인
  * In-App 결제 모듈 Version(ex : V16.03.00 등)
  * In-App 결제 모듈 종류(ex : 개발용, 상용)
  * 프로가드 적용 여부
  * App 개발 플랫폼(ex : Android, Adobe Air, Corona, Cocos2d-x, Unity 3D 등)
  * APK 파일
  * 문의 내용

  전자 서명 영수증 에러 문의 항목

  * Application ID
  * 상품명
  * PID
  * 오류 발생 시간
  * 과금 테스트 시 사용한 휴대폰 번호
  * 과금 테스트 시 사용한 휴대폰 모델명 및 Android OS Version
  * 전체 오류 로그
  * 전자 영수증 요청 정보(appid, txid, signdata)
  * In-App 결제 모듈 Version(ex : V16.03.00 등)
  * In-App 결제 모듈 종류(ex : 개발용, 상용)
  * 전자 영수증 검증 요청 URL
  * 문의 내용
    {% endhint %}

\
\&#xNAN;**\[API V4] 해외에서 한국 단말기가 없는 경우, Self-Test는 어떻게 진행 해야 하나요?**

* USIM이 장착 되어 있는 휴대폰 준비
* [In-App 결제 모듈 다운로드](https://github.com/ONE-store/inapp-sdk/wiki/IAP-Download)
* 개발용 In-App 결제 모듈 적용\
  (iap plugin 객체 생성 시 파라미터 값 development 설정)
* [IAP Settting App 다운로드](https://github.com/ONE-store/inapp-sdk/wiki/IAP-Developer-Guide#test-%EB%8B%A8%EB%A7%90-%EB%93%B1%EB%A1%9D) 및 설치
* Sefl-Test 페이지 진입 후 임의의 MDN 등록
* IAP Setting App 실행 후 Self-Test 페이지에 등록한 MDN과 동일 하도록 설정\
  (통신사 임의 선택 가능)
* In-App 상품 상태 값 설정 후 Self-Test 진행
* Self-Test 완료 후 상용 In-App 결제 모듈 적용 하여 검증 요청 진행\
  (iap plugin 객체 생성 시 파라미터 값 release 설정)

### **\[API V4] 개발용 In-App 결제 모듈 테스트 시 '개발자 POC에 등록된 테스트 단말이 아닙니다.' 팝업이 노출 됩니다.** <a href="#id-apiv4-in-app-poc-.-." id="id-apiv4-in-app-poc-.-."></a>

* 개발자센터 내 테스트 단말 정보 등록 후 개발용 모듈로 테스트 진행 부탁 드립니다.
* Self-Test 페이지에 MDN을 등록 해야 정상적인 테스트가 가능 합니다. (Apps > In-App 정보 > 테스트 > 테스트 단말 등록)

### **\[API V4] 개발용 In-App 결제 모듈 테스트시 '판매 중인 상품이 아닙니다. 검증 중입니다.'팝업이 노출 됩니다.** <a href="#id-apiv4-in-app-.-.-." id="id-apiv4-in-app-.-.-."></a>

* In-App 상품의 판매 상태가 미승일 상태 일 때 상용 In-App 결제 모듈 적용 하여 발생 하는 현상이므로
* In-App 결제 모듈 압축 해제 후 dev 폴더 내 JAR 파일을 적용 후 테스트 진행 하면 정상적으로 테스트가 가능 합니다.
* 그리고 등록중인 상품은 상용 결제가 불가능 하오니 검증 완료 및 판매상태 변경 확인 후 상용 결제 진행 부탁 드립니다.

### **\[API V4] Self-Test 페이지 포인트 등록 하였으나 포인트가 노출 되지 않는 현상 발생 합니다.** <a href="#id-apiv4-self-test-." id="id-apiv4-self-test-."></a>

* 개발용 In-App 결제 모듈 적용 후 Build 해야 정상적인 테스트가 가능 합니다.
* In-App 결제 페이지에서 조회 버튼을 선택 하여 포인트 조회 후 포인트 사용을 선택 해야 정상적으로 포인트 사용이 가능 합니다.

### **\[API V4] TID 구매이력 URL 조회 사용 시 유의사항** <a href="#id-apiv4-tid-url" id="id-apiv4-tid-url"></a>

* 구매이력 조회 요청 URL이 IP:PORT 형식으로 되어 있을 경우 도메인: PORT 형식으로 전환 하는 것을 권장 하고 있습니다.
  * 개발용 : <https://iapdev.tstore.co.kr:8082/billIntf/billinglog/billloginquiry.action>
  * 상용 : <https://iap.tstore.co.kr:8090/billIntf/billinglog/billloginquiry.action>

### **In-App 상품명 및 가격을 변경 하려고 하는데 어떻게 해야 하나요?** <a href="#id-in-app" id="id-in-app"></a>

* In-App 상품명은 판매 상태(판매중지/판매금지 제외)와 무관하게 수정 가능합니다.
* In-App 상품금액은 판매 상태가 등록 중일 경우, 언제든 수정이 가능하며 판매중/판매중지/판매금지 일 경우 일주일에 1회 수정이 가능합니다.

### **\[API V4] 전자 영수증 검증 요청 시 유효성 오류(9113)가 리턴 됩니다.** <a href="#id-apiv4-9113-." id="id-apiv4-9113-."></a>

* API 호출시 data가 정상적으로 전달되지 않았거나 전자영수증 값이 임의 변경된 경우로, 아래 내용들에 대해서 확인 부탁 드립니다.&#x20;
  * signdata가 정상적으로 전달 되는지 확인 필요(App Server -> In-App 결제 서버, App -> App Server)
  * signdata에 공백이 존재 하는지 확인 필요
  * signdata 저장 시 다른 문자(특수문자, ex:+ 등)가 포함되지 않았는지 확인 필요
* txid, appid, sigdata 정보가 정상일 경우 오류가 발생하지 않습니다.
* 해당 정보 중 일부에 오류가 있는 것으로 판단되오며, 정확한 확인을 위해 하기 추가 정보 기입하시어 전달 부탁 드립니다.\
  (+ 혹은 / 등의 기호가 제대로 표시되는지 확인 부탁 드립니다. 간혹 공백으로 전달되는 경우가 있으니 확인 부탁 드립니다.)

### **\[API V4] 결제 완료 후 원스토어 개발자센터에서 전자영수증 발급 처리 되었으나,네트워크 연결 끊김 등으로 개발서버에서 Response를 받지 못하는 경우 전자 영수증을 재 발급 받을수 있는 방법이 있나요?** <a href="#id-apiv4-response" id="id-apiv4-response"></a>

* 전자 영수증의 재발급은 기술적으로 불가합니다. 전자영수증을 취득하지 못하여 아이템 지급이 불가한 경우가 발생할 수 있기 때문에 방어로직으로 sdk에서 제공하는 [request\_purchase\_history ](https://github.com/ONE-store/inapp-sdk/wiki/IAP-Sample-Specification#request_purchase_history)api를 호출하거나 Server API인 '[TID 구매이력 조회](https://github.com/ONE-store/inapp-sdk/wiki/IAP-Reference-Server-API#tid-%EA%B5%AC%EB%A7%A4%EC%9D%B4%EB%A0%A5-%EC%A1%B0%ED%9A%8C-api)' 연동을 권장합니다.&#x20;

### **\[API V4] 가로 <-> 세로 화면 전환 시 In-App 결제 페이지 노출 되지 않는 현상이 있습니다** <a href="#id-apiv4-less-than-greater-than-in-app" id="id-apiv4-less-than-greater-than-in-app"></a>

* In-App 결제 모듈은 In-App 결제 페이지의 생존을 보장 하고 있으며 화면 모드가 변경 되는 경우 결제 페이지가 사라지고 다시 생성되는 과정을 거쳐야 하기 때문에 결제 페이지가 노출 되지 않는 현상이 발생 하게 됩니다.
* 화면 전환 시 결제 페이지가 노출 되지 않을 경우 App에서 가로/세로 전환을 못하도록 설정 하여 결제 페이지를 올바르게 유지 해야 하며 App이나 화면의 설정이 변경 되는 경우 아래 URL을 참고 하여 AndroidManifest.xml 파일에 해당 옵션을 적용 해야 합니다.
* [관련 가이드 보기](http://developer.android.com/guide/topics/manifest/activity-element.html#config)&#x20;

### **구버전 인앱결제가 종료했다고 하는데, 어디까지가 구버전인가요?** <a href="#id" id="id"></a>

* 2015년말 종료되는 구버전 인앱SDK는 아래 이미지와 같이 검은색 결제창이 뜨는 버전을 의미합니다.
* 웹뷰 기반의 결제창이 뜨는 경우는 종료되지 않습니다.<br>
* ![](https://1837360763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fot0z57AnnXZ02C5qyePV%2Fuploads%2FLAIBMK2j2s0KFq7bvxyN%2Fimage.png?alt=media\&token=08eb575d-cb6a-48c6-9204-dc04581b55e5)![](https://1837360763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fot0z57AnnXZ02C5qyePV%2Fuploads%2FQn4Iyb2y12eR12jkFnzx%2Fimage.png?alt=media\&token=a51b15d4-56b3-4e49-8a19-d23b764cb2d7)

<br>

<br>
