# 결제 테스트 및 보안

### **개요** <a href="#id" id="id"></a>

원스토어는 개발환경(이하 Sandbox) 또는 상용 결제환경(이하 상용테스트)에서 인앱상품의 결제 테스트를 지원합니다.\
Sandbox는 상용 결제환경이 아닌 가상의 결제환경으로, 결제화면에서 결제실패 또는 성공 중 원하는 응답을 선택하면 해당 응답결과를 전송합니다.\
상용테스트는 상용 결제환경에서 해당 인앱상품의 결제를 진행하여 결제 결과를 전송합니다.\
상용테스트 환경에서 결제를 하실 경우 취소하지 않으면 과금이 발생할 수 있으니, 결제 테스트 후 반드시 결제취소를 진행해주셔야 합니다.

주의사항

* 모든 인앱상품은 반드시 Sandbox에서 테스트를 1회 이상 진행하셔야 하며, 테스트를 진행하지 않은 인앱상품이 1개라도 있을 경우에는 검증요청 버튼이 활성화되지 않습니다.
*   개발 및 상용환경에서 테스트하기 위해서는 사전에 원스토어 ID를 테스트 ID로 등록해야 합니다.

    등록하지 않은 원스토어 ID로 테스트할 경우 Sandbox에서 테스트가 불가능하고, 상용테스트 환경에서는 테스트 상용결제가 아닌 실제 상용결제가 진행되어 과금되니 주의해주시기 바랍니다.
* 원스토어는 테스트 ID를 통해 결제한 내역에 대해 책임지지 않습니다. 테스트 ID의 관리 및 결제 테스트는 개발사 내부 책임자의 관리감독 하에 진행하시기 바랍니다.

### &#x20;**인앱결제 테스트 프로세스** <a href="#id" id="id"></a>

<figure><img src="https://1837360763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fot0z57AnnXZ02C5qyePV%2Fuploads%2FAC6oRvqqrNpEpV7vLsuP%2Fimage.png?alt=media&#x26;token=59b15ef9-4f97-41d9-a733-820c59e60381" alt=""><figcaption></figcaption></figure>

### **인앱결제 테스트 화면** <a href="#id" id="id"></a>

* 개발자센터 > Apps > 상품선택 > In-App정보 화면에서 '결제 테스트' 버튼을 누르면 인앱결제 테스트 화면이 제공됩니다.
*   인입결제 테스트 화면에서 테스트 ID를 관리하거나, 결제 테스트 내역을 조회할 수 있습니다.



    <figure><img src="https://1837360763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fot0z57AnnXZ02C5qyePV%2Fuploads%2FI4GVnQXBT121W67HZUv8%2Fimage.png?alt=media&#x26;token=2dc47283-5656-4470-8d29-a7ad8da10a92" alt=""><figcaption></figcaption></figure>

### **테스트 ID 등록/관리** <a href="#id-id" id="id-id"></a>

* 개발 및 상용환경에서 인앱결제를 테스트하기 위해서는 사전에 테스트 ID를 등록해야 합니다.
* 인앱결제 테스트 화면에서 '테스트 ID 등록/관리' 탭을 선택하시면, 테스트 ID를 관리하는 화면으로 이동합니다.
*   테스트 ID는 원스토어 사용자 ID로, 원스토어에 회원으로 등록되어 있는 ID를 조회하여 등록할 수 있습니다.\
    만약, 원스토어 회원으로 등록되어 있지 않다면 원스토어 앱을 실행하여 테스트용 원스토어 ID를 만드신 후 해당 ID를 테스트 ID로 등록하면 됩니다.  \
    원스토어 ID를 만드는 방법은 아래 '원스토어 ID 만들기'를 참고하세요.&#x20;



    <figure><img src="https://1837360763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fot0z57AnnXZ02C5qyePV%2Fuploads%2FvqD1RNAvGuTi5R26UPqg%2Fimage.png?alt=media&#x26;token=03bb83e9-0338-47dd-b2c5-c212542f2f40" alt=""><figcaption></figcaption></figure>
* #### **테스트 ID 등록하기**   <a href="#id-id" id="id-id"></a>
  * 테스트 ID로 사용 할 원스토어 회원 ID를 조회합니다.
  * 조회한 원스토어 ID 확인 후, 해당 테스트 ID로 어느 결제환경(Sandbox, 상용테스트)에서 결제 테스트를 진행할지 선택합니다.
  *   필요한 경우 참고 사항을 입력하고 등록 버튼을 눌러 테스트 ID를 등록 합니다.

      하나의 테스트 ID는 하나의 결제환경만 선택가능하며, 결제환경 설정은 언제든 변경할 수 있습니다.



      <figure><img src="https://1837360763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fot0z57AnnXZ02C5qyePV%2Fuploads%2FgiZHIalLapdwqbVVSRRl%2Fimage.png?alt=media&#x26;token=d29a1f5d-00ac-4117-a2bd-018ad6870f04" alt=""><figcaption></figcaption></figure>
* 등록되어 있는 테스트 ID로 어느 환경에서 결제 테스트 할지 설정할 수 있습니다.&#x20;
*   테스트 ID 결제환경을 변경할 경우 반드시 '저장' 버튼을 눌러 새로운 설정을 저장해야 합니다.

    ![](https://1837360763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fot0z57AnnXZ02C5qyePV%2Fuploads%2FYFUOy79KNxbCXwl7vGVL%2Fimage.png?alt=media\&token=45e8131f-3d17-4cec-aea8-765e0cdac8eb)
* #### **테스트 ID 삭제하기 (개별 삭제, 일괄 삭제)** <a href="#id-id" id="id-id"></a>
  * 테스트 ID가 더 이상 유효하지 않을 경우 테스트 ID를 삭제할 수 있습니다.&#x20;
  *   '삭제'하기 버튼을 눌러 개별 테스트 ID를 삭제하거나, 여러 테스트 ID를 체크한 후 '체크한 ID 삭제' 버튼을 눌러 일괄 삭제할 수 있습니다.

      ![](https://1837360763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fot0z57AnnXZ02C5qyePV%2Fuploads%2FQo5Zcu7SvA0oYuiO7eLB%2Fimage.png?alt=media\&token=c008a132-7fa6-4e18-8333-58b7d4c7646a)
* #### **테스트 ID 설정 복사** <a href="#id-id" id="id-id"></a>
  * 동일한 테스트 ID를 여러 앱에 공통으로 사용할 경우, 테스트 ID 설정을 다른 앱으로 복사할 수 있습니다.
  * 복사가 가능한 앱만 체크 박스가 활성화 되며, 테스트 ID 설정을 복사할 대상 앱을 선택한 수 '복사하기'를 누르면 됩니다.
    * 참고사항
      * 인앱결제 API V5(SDK V17)를 적용한 앱만 테스트 ID 설정 복사가 가능합니다.
      *   인앱결제 API V5(SDK V17)를 적용하였더라도, 대상 앱에 바이너리(apk)가 등록되어 있지 않을 경우 Sandbox로 설정된 테스트 ID만 복사됩니다.



          <figure><img src="https://1837360763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fot0z57AnnXZ02C5qyePV%2Fuploads%2FkuZraqKVTBmxkCE0Alva%2Fimage.png?alt=media&#x26;token=35bf13ab-0d87-4aac-934c-f19cc4845d7d" alt=""><figcaption></figcaption></figure>

### **Sandbox 환경에서의 결제 테스트 (필수)**  <a href="#id-sandbox" id="id-sandbox"></a>

* Sandbox는 상용 결제환경이 아닌 가상의 결제환경으로, 결제화면에서 결제실패 또는 성공 중 원하는 응답을 선택하면 해당 응답결과를 전송합니다.
* Sandbox에서 결제한 내역은 인앱결제 테스트 화면의 'Sandbox' 탭에서 조회할 수 있으며, 결제취소도 가능합니다.
*   모든 인앱상품은 반드시 Sandbox에서 테스트를 1회 이상 진행해야 하며, 테스트를 수행하지 않은 인앱상품이 1개라도 있을 경우에는 검증요청 버튼이 활성화되지 않습니다.

    테스트 환경 (상용 및 Sandbox) 정보는 원스토어 서비스와 연결된 동안 메모리에 유지됩니다. 만약 개발자 센터를 통해 테스트 ID의 테스트 환경을 변경했다면, 반드시 앱을 종료하고 다시 시작해야 합니다.

    참고사항

    * 테스트 ID 설정이 Sandbox로 되어 있어야 Sandbox 결제 테스트가 가능합니다.
    * Sandbox 결제 테스트를 하지 않은 상품은 인앱상품의 테스트여부 값이 'N'으로 설정되며, 테스트를 진행하시면 'Y'로 변경됩니다.



    <figure><img src="https://1837360763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fot0z57AnnXZ02C5qyePV%2Fuploads%2FnBvOdZMPqInC37eYtmmF%2Fimage.png?alt=media&#x26;token=d12ce54c-11b8-46ed-ade0-18daf2644a07" alt=""><figcaption></figcaption></figure>

### **상용테스트 환경에서의 결제 테스트 (선택)**  <a href="#id" id="id"></a>

* 상용테스트는 상용 결제환경에서 해당 인앱상품의 결제를 진행하여 결제 결과를 전송합니다.
* 상용테스트로 결제한 내역은 인앱결제 테스트 화면의 '상용테스트' 탭에서 조회할 수 있으며, 결제취소도 가능합니다.
*   상용테스트 환경에서 결제를 하실 경우 취소하지 않으면 과금이 발생할 수 있으니, 결제 테스트 후 반드시 결제취소를 진행해주셔야 합니다.

    참고사항

    * 테스트 ID 설정이 상용테스트로 되어 있어야 상용테스트 환경에서 결제 테스트가 가능합니다.
    *   상용테스트로 설정하지 않은 테스트 ID 또는 테스트 ID로 등록되어있지 않은 원스토어 ID로 결제할 경우 테스트 상용결제가 아닌 실제 상용결제가 진행되어 과금되니 주의해주시기 바랍니다.

        실제 상용결제가 진행된 경우, 즉시 원스토어 측으로 결제정보를 전달하여 결제취소를 요청하시기 바랍니다.

### **인앱결제 테스트 결과 확인 및 결제취소** <a href="#id" id="id"></a>

* 인앱결제 테스트 내역의 결제상태 확인 및 결제취소를 할 수 있습니다.&#x20;
* Sandbox에서 결제한 내역은 인앱결제 테스트 화면의 'Sandbox' 탭에서, 상용테스트로 결제한 내역은 인앱결제 테스트 화면의 '상용테스트' 탭에서 결제내역을 조회할 수 있습니다.
*   #### Sandbox 환경 <a href="#id-sandbox" id="id-sandbox"></a>

    * Sandbox 환경에서 결제 테스트한 내역이 제공됩니다.&#x20;
    *   결제한 상품정보 및 결제상태를 조회할 수 있으며, 결제취소도 가능합니다.



        <figure><img src="https://1837360763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fot0z57AnnXZ02C5qyePV%2Fuploads%2FnSJMgEHC9mGJoEUABbGf%2Fimage.png?alt=media&#x26;token=198633ef-3989-43d5-870d-1ea368b6268e" alt=""><figcaption></figcaption></figure>

    \

* #### **상용테스트 환경** <a href="#id" id="id"></a>
  * 상용테스트 환경에서 결제 테스트한 내역이 제공됩니다.
  *   결제한 상품정보 및 결제상태를 조회할 수 있으며, 결제취소도 가능합니다.

      참고사항

      * 상용테스트 환경에서 결제를 하실 경우 취소하지 않으면 과금이 발생할 수 있으니, 결제 테스트 후 반드시 결제취소를 진행해주셔야 합니다.
      *   상용테스트로 설정하지 않은 테스트 ID 또는 테스트 ID로 등록되어있지 않은 원스토어 ID로 결제할 경우 테스트 상용결제가 아닌 실제 상용결제가 진행되어 과금되니 주의해주시기 바랍니다.

          실제 상용결제가 진행된 경우, 즉시 원스토어 측으로 결제정보를 전달하여 결제취소를 요청하시기 바랍니다.

      ![](https://1837360763-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fot0z57AnnXZ02C5qyePV%2Fuploads%2F3GBkIeF3aqK8P0ffbZJC%2Fimage.png?alt=media\&token=7d0f93fd-61c5-4ff7-a8e1-e8883e21ed40)

### **보안 및 인증** <a href="#id" id="id"></a>

* #### **인앱 결제의 보안** <a href="#id" id="id"></a>
  * 원스토어 API V5(SDK V17)에서는 안전한 결제를 위해 데이터의 위변조 여부를 확인하는 방법으로 서명(Signature)의 유효성 체크 방식을 사용합니다.모바일 앱은 많은 공격의 위협에 노출되어 있으므로 이러한 위험을 최소화하기 위해 개발사 앱이나 서버에서 서명 인증을 진행하는 것을 권장합니다. 다음은 좀 더 안전한 인앱결제를 위해 개발사에서 추가로 준비해야 할 사항입니다.
  * 개발사 서버 사용
    * APK Reverse Engineering 등을 이용한 공격을 어렵게 하기 위해서 구현 코드와 공개 키(Public key) 등은 서버에서 보관하고 인증을 진행할 수 있도록 합니다.
    * 구매 정보를 저장할 때도 단말기의 저장소보다 개발사 서버의 저장소를 사용하여 아이템의 사용 허가를 확인하도록 하는 것이 좋습니다.
  * 변경된 코드 사용
    * 원스토어에서 제공하는 샘플 코드는 많은 사람들에게 오픈 되어 있는 코드로, 원본을 그대로 사용하는 것보다는 수정해서 사용하는 것을 권장합니다. 동일한 코드를 사용하면 그만큼 공격의 위험에 노출되기 쉽습니다.
    * Proguard 같은 코드 난독화 툴을 이용하여 결제 관련 코드를 보호하는 것이 좋습니다.
    * 공개 키라 할지라도 앱 코드 안에 일반 문자열로 넣는 것은 안전한 방법이 아닙니다. 다른 문자열과 XOR하여 쉽게 노출되지 않도록 하는 등 공격자가 쉽게 접근 할 수 없도록 하는 것이 안전합니다.
  * 결제 요청의 ‘developerPayload’ 필드를 활용
    * 개발사는 결제 요청 시 ‘developerPayload’ 필드에 임의의 정보를 넣고 결제 완료 시 다시 전달받을 수 있습니다. 해당 필드에 timestamp 등을 조합한 추가적인 보안 검증용 데이터를 넣어 결제 결과에 대한 검증을 좀 더 안전하게 할 수 있습니다.
* #### **원스토어 인앱결제 인증 방법** <a href="#id" id="id"></a>
  * 인증 준비
    *   인증을 위한 키 알고리즘은 RSA 방식을 사용하며, 서명을 위한 알고리즘으로 ‘SHA512withRSA’를 사용합니다.

        서명 검증키는 [인앱결제 적용을 위한 사전준비](undefined-3) 페이지 내 '라이선스 키 및 OAuth 인증 정보 확인' 부분을 참고하시기 바랍니다.

        서명 검증키의 값은 단말기나 서버 등 인증을 하는 위치에 따라 적절하게 저장하여 사용합니다.
  * 서명 인증 샘플 코드
    * SDK에서는 'AppSecurity' 유틸리티 클래스를 제공하며 'verifyPurchase' 메서드를 이용해 서명 인증을 할 수 있습니다. SDK를 이용하지 않고 개발사가 직접 서명 인증을 하려면 'AppSecurity'와 동일한 기능을 하는 코드를 직접 구현해야 합니다. 자세한 구현 내용은 SDK 라이브러리와 함께 배포하는 샘플을 참고합니다.
