안드로이드 마켓 인앱 결제는 인앱 구매를 위한 안드로이드 마켓에서 제공되는 서비스이다. 이를 이용하기 위해 당신의 애플리케이션에서는 특정 제품에 대한 결제 요청을 보낸다. 서비스는 요청 및 지불 양식을 검증하고 금융 거래를 포함하여 결제 정보를 모두 처리한다. 결제 프로세스가 완료되면, 당신의 애플리케이션에 구매 정보들을(주문 번호, 주문 날짜 및 시간, 지불 금액) 전송한다. 당신의 애플리케이션은 어떠한 금융 거래를 처리 할 필요가 없다. 이러한 역할은 안드로이드 마켓의 인앱 결제 서비스가 담당하는 것이다.

인앱 결제 구조

인앱 결제는 당신의 애플리케이션과 안드로이드 마켓 서버간의 결제 요청 및 결제 응답을 주고 받기 위해 비동기식 메시지 루프를 사용한다. 실제로, 당신의 애플리케이션은 결코 안드로이드 마켓 서버와 직접적으로 통신을 하지 않는다(그림 1). 대신, 당신의 애플리케이션은 IPC(Interprocess Communication)를 통해 안드로이드 마켓 애플리케이션에 결제 요청을 전송하고 비동기식 브로드캐스트 인텐트의 형태로 마켓으로부터 구매 응답들을 수신한다. 당신의 애플리케이션은 당신과 안드로이드 마켓 서버 사이의 어떠한 통신에 대한 관리하거나 안드로이드 플랫폼에서 특별한 API도 사용하지 않는다. 일부 인앱 결제 구현에 있어 컨텐츠 전송 및 거래 확인을 위해 개인 원격 서버를 이용할 수도 있지만, 원격 서버는 인앱 결제를 구현할 필요가 없다. 만약 원격 서버가 당신이 디지털 컨텐츠(미디어파일이나 사진들)를 사용자의 단말에 전송하기 위해 사용한다면 매우 유용할 수 있다. 또한 당신은 원격 서버를 이용하여 사용자의 거래 내역이나 다양한 인앱 결제 보안 사항들(서명 확인)을 저장할 수도 있다. 당신이 애플리케이션 내부에서 모든 보안관련 작업들을 처리 할 수 있을지라도 그런 작업들은 원격 서버에서 수행되는 것을 추천한다. 왜냐하면 그것이 당신의 애플리케이션에서 보안 공격에 취약함을 감소 시켜주기 때문이다.

 전형적인 인앱 결제 구현에 있어 다음 세가지 사항에 의존한다: 

그림 1. 당신의 애플리케이션은 안드로이드 마켓 애플리케이션을 통해 결제 메시지들을 송수신하고, 안드로이드 마켓 서버와 모든 대화들을 처리한다.


  • Service(샘플 애플리케이션에서는 BillingService)는 애플리케이션으로부터 구매 메시지들을 처리하고 안드로이드 마켓의 인앱 빌링 서비스에 결제 요청들을 전송한다.
     
  • BroadcastReceiver(샘플 애플리케이션에서는 BillingReceiver)는 안드로이드 마켓 애플리케이션으로부터 모든 비동기식 결제 응답을 수신한다.

  • Security 컴포넌트(샘플 애플리케이션에서는 Security)는 보안관련 작업(서명 확인, nonce생성)들을 수행한다. 인앱 결제의 보안과 관련된 정보가 필요하면 Security controls 문서를 참고하도록 한다.

 당신은 또한 인앱 결제를 지원하는 두 다른 요소를 통합 할 수도 있다:

  • 응답 Handler(샘플 애플리케이션에서는 ResponseHandler)는 구매 알림, 오류, 다른 상태 메시지들의 애플리케이션에서의 특정 과정을 제공한다.
  • Observer(샘플 애플리케이션에서는 PurchaseObserver)는 구매 정보와 상태를 당신의 사용자 인터페이스에서 업데이트 할 수 있도록 콜백을 전송할 책임이 있다. 


이러한 컴포넌트들 뿐만 아니라, 당신의 애플리케이션은 사용자들이 구매 아이템을 선택할 수 있도록 일부 정렬된 사용자 인터페이스와 사용자들의 구매들에 관한 정보 저장 방법을 제공해야만 한다. 당신은 결제 사용자 인터페이스를 제공할 필요가 없다. 한 사용자가 인앱 결제를 시작하려 할 때, 안드로이드 마켓 애플리케이션은 결제 사용자 인터페이스를 당신의 사용자에게 보여주게 된다. 사용자는 계산 과정을 마치게 되면, 당신의 애플리케이션이 다시 시작된다.

인앱 결제 메시지들

사용자가 구매를 시작할 때, 당신의 애플리케이션은 간단한 IPC 함수를 호출함으로써 안드로이드 마켓 인앱 결제 서비스(MarketBillingService라는 이름)에 인앱 결제 메시지들을 전송한다. 안드로이드 마켓 애플리케이션은 상태 알림 및 기타 다른 정보들을 당신의 애플리케이션에 제공하면서, 모든 결제 요청들에 대해 동기적으로 응답한다. 또한 안드로이드 마켓 애플리케이션은 에러 메시지들과 세부화된 결제 처리 정보들과 함께 당신의 애플리케이션에 제공하면서, 몇몇 결제 요청들에 대해 비동기적으로 응답한다. 이번 구절에서는 당신의 애플리케이션과 안드로이드 마켓 애플리케이션 사이에서 일어나는 기본 요청-응답 메시지들에 대해 설명한다.
 

인앱 결제 요청들

당신의 애플리케이션은 MarketBillingService 인터페이스에 의해 노출된 단일 함수(sendBillingRequest()) 호출에 의해 인앱 결제 요청들을 보낸다. 이 인터페이스는 Android Interface Definition Language 파일(IMarketBillingService.aidl)이라 정의된다. 당신은 인앱 결제 샘플 애플리케이션과 함께 이 AIDL 파일을 다운로드 할 수 있다.

sendBillingRequest() 함수는 단일의 Bundle(번들) 매개변수를 갖고있다. 번들은 요청에 필요한 특정하고 다양한 매개변수들의 여러 키 값들의 쌍을 반드시 포함해서 보내야만 하는 것인데, 가령 당신은 결제 요청의 종류들을 만들고 그 아이템은 팔릴 수 있으며 해당 애플리케이션은 요청을 만들어 낸다. 요청과 함께 전송되는 번들 키들에 대한 자세한 내용은, In-app Billing Service Interface를 참조하라.

가장 중요한 키들 가운데 하나는 모든 요청 번들이 갖고 있어야만 하는 BILLING_REQUEST 이다. 이 키는 당신이 만드는 구매 요청의 유형을 특정짓게 해준다. 안드로이드 마켓의 인앱 결제 서비스는 다음과 같이 다섯 가지의 결제 요청 사항들을 지원한다:
 
  • CHECK_BILLING_SUPPORTED

    이 요청은 안드로이드 마켓 애플리케이션이 인앱 결제를 지원하는지를 확인한다. 당신은 보통 이 요청을 당신의 애플리케이션이 처음 시작 될 때 전송한다. 이 요청은 당신이 오직 인앱 결제에 관련된 UI 특징들만 활성화 혹은 비활성화를 원하는지를 확실히 하는데 유용하다.

  • REQUEST_PURCHASE

    이 요청은 안드로이드 마켓 애플리케이션에 구매 메시지를 보내고 인앱 결제의 기초가 된다. 당신은 한 사용자가 당신의 애플리케이션 안에서 아이템 구매를 원할 때 이 요청을 보낸다. 그러면 안드로이드 마켓은 계산 UI를 보여줌으로써 금융 거래를 처리하게 된다.

  • GET_PURCHASE_INFORMATION

    이 요청은 구매 상태 변경의 세부 사항들을 검색한다. 구매 상태는 요청했던 구매가 성공적으로 결제됐거나 사용자가 계산하는 동안 거래를 취소하였을 때 변경된다. 또한 이전에 구매했던 것이 환불 되었을 때도 발생한다. 안드로이드 마켓은 구매상태가 변경 되었을때 당신의 애플리케이션에 알리게 되므로, 당신은 검색할 거래 정보가 있을 때만 해당 요청을 보내기만 하면 된다.

  • CONFIRM_NOTIFICATIONS

    이 요청은 당신의 애플리케이션이 구매 상태의 변경의 상세 사항을 받았다는 것을 인정한다. 안드로이드 마켓은 구매 상태 변경 알림을 당신이 받아서 수락 할 때까지 보내게 된다.

  • RESTORE_TRANSACTIONS

    이 요청은 한 사용자가 관리된 구매들의 처리 상태를 검색한다. 당신은 이 요청을 한 사용자의 처리 상태의 검색을 필요로 할 때 보내야만 하는데, 대개 당신의 애플리케이션이 재설치 되거나 단말에 처음으로 설치 되었을 때가 된다.

인앱 결제 응답들


안드로이드 마켓 애플리케이션은 인앱 결제 요청에 대한 응답을 동기식, 비동기식 두가지로 응답한다. 동기식 응답은 다음 세 가지의 키와 함께 번들을 응답한다:

  • RESPONSE_CODE
    이 키는 상태 정보 및 요청에 대한 오류 정보를 제공한다.

  • PURCHASE_INTENT

    이 키는 당신이 체크아웃 액티비티를 실행하는데 사용되는 PendingIntent를 제공한다.

  • REQUEST_ID

    이 키는 당신이 요청과 비동기식 응답이 일치하는지에 대해 사용할 수 있는 요청 식별자를 제공한다.

이 키들 중에서 몇몇은 모든 요청과 관련있지는 않다. 자세한 내용은, 이 문서 후반부에 Messaging sequence 를 보도록 한다.

비동기식 응답 메시지는 개인적인 브로드캐스트 인텐트의 형태로 전송되며, 다음을 포함한다:

  • com.android.vending.billing.RESPONSE_CODE
    이 응답은 안드로이드 마켓 서버의 응답 코드를 포함하고, 당신이 인앱 결제 요청을 만들고 난 뒤에 전송된다. 서버 응답 코드는 안드로이드 마켓에 결제 요청이 성공적으로 보내졌는지, 또는 간혹 결제 요청 동안 발생한 오류를 나타낼 수 있다. 
    이 응답은 어떠한 구매 상태 변경을 보고 하는데 사용되지 않는다(가령 환불 또는 구매 정보와 같은 것들). 이 응답과 함께 보내진 응답 코드들에 관한 자세한 내용은, Server Response Codes for In-app Billing을 참조하라.

  • com.android.vending.billing.IN_APP_NOTIFY

    이 응답은 구매가 상태를 변경했음을 나타내고, 그것은 구매가 성공, 취소, 혹은 환불 되었음을 의미한다. 이 응답은 하나 이상의 알림 ID들을 포함한다. 각 알림 ID는 특정 서버측 메시지에 부합하고, 각 메시지들은 하나 이상의 거래에 관한 정보를 포함한다. 당신의 애플리케이션은 IN_APP_NOTIFY 브로드캐스트 인텐트를 받은 후, 메시지 내용을 검색할 알림 ID와 함께 GET_PURCHASE_INFORMATION 요청을 보낸다.

  • com.android.vending.billing.PURCHASE_STATE_CHANGED

    이 응답은 하나 이상의 거래에 관한 상세 정보를 포함한다. 거래 정보는 JSON 문자열에 포함되어 있다. JSON 문자열은 서명되어 있고 서명은 JSON 문자열(암호화되지 않음)과 함께 당신의 애플리케이션에 전송된다. 당신의 인앱 결제 메시지들의 안전성 보장을 돕기 위해, 당신의 애플리케이션은 이 JSON 문자열의 서명을 검증 할 수 있다.

PURCHASE_STATE_CHANGED 인텐트와 함께 반환된 JSON 문자열은 당신의 애플리케이션에 하나 이상의 결제 거래 정보를 제공한다. JSON 문자열의 한 예는 아래와 같다:

{ "nonce" : 1836535032137741465,
  "orders" :
    { "notificationId" : "android.test.purchased",
      "orderId" : "transactionId.android.test.purchased",
      "packageName" : "com.example.dungeons",
      "productId" : "android.test.purchased",
      "developerPayload" : "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ",
      "purchaseTime" : 1290114783411,
      "purchaseState" : 0 }
}
이 JSON 문자열에 항목들에 관한 자세한 내용은, In-app Billing Broadcast Intents를 참조하라.

메시지 흐름

일반적인 구매 요청을 위한 메시지 흐름은 그림 2에서 보여진다. 각 sendBillingRequest() 메소드에 대한 요청 유형들은 볼드체로, 브로드캐스트 인텐트들은 이탤릭체로 보여진다. 그림 2는 모든 요청에 대해 전송되는 RESPONSE_CODE 브로드캐스트 인텐트들을 명확하게 보여주진 않는다.
 

인앱 구매 요청의 기본적인 메시지 흐름은 다음과 같다:

  1. 당신의 애플리케이션은 특정 상품 ID와 그밖에 매개변수의 구매 요청(REQUEST_PURCHASE 형태로)을 전송한다.
  2. 안드로이드 마켓 애플리케이션은 다음과 같은 키들과 함께 번들을 당신의 애플리케이션에 전송한다:
    RESPONSE_CODEPURCHASE_INTENT, 그리고 REQUEST_ID. PURCHASE_INTENT 키는 PendingIntent를 제공하고, 그것은 당신의 애플리케이션이 주어진 상품 ID에 대한 계산 UI를 시작하려고 사용한다.
  3. 당신의 애플리케이션은 펜딩 인텐트를 실행하고, 그것은 계산 UI를 실행한다.

    주의: 당신은 반드시 애플리케이션 컨텍스트가 아닌 액티비티 컨텍스트로부터 펜딩 인텐트를 실행하여야만 한다.

  4. 계산 흐름이 완료 되었을 때(즉, 사용자가 아이템을 성공적으로 구매하거나, 구매를 취소), 안드로이드 마켓은 당신의 애플리케이션에 알림 메시지(IN_APP_NOTIFY 브로드캐스트 인텐트)를 전송한다. 알림시지는 알림 ID를 포함하고, 그것은 거래 과정을 참조한다.
  5. 당신의 애플리케이션은 GET_PURCHASE_STATE_CHANGED 요청 전송에 의해 거래 정보를 요청하고,  거래에 대한 알림 ID를 지정한다.
  6. 안드로이드 마켓 애플리케이션은 RESPONSE_CODE 키, REQUEST_ID 키와 함께 번들을 전송한다.
  7. 안드로이드 마켓은 거래 정보를 당신 애플리케이션 PURCHASE_STATE_CHANGED 브로드캐스트 인텐트 내부로 전송한다.
  8. 당신의 애플리케이션은 당신이 확인 메시지(CONFIRM_NOTIFICATIONS 형태로)를 보냄으로써 주어진 알림 ID에 대한 거래 정보를 받았는지 확인하고, 당신이 거래 정보를 받기 위해 알림 ID를 지정한다.
  9. 안드로이드 마켓 애플리케이션은 당신의 애플리케이션에 RESPONSE_CODE 키, REQUEST_ID 키와 함께 번들을 전송한다.


그림 2. 구매 요청을 위한 메시지 흐름

명심해야 할 것은, 당신은 안드로이드 마켓으로부터(그림 2의 단계8) 거래 정보를 받았을 때 확인을 반드시 전송해야 한다. 만약 당신이 확인 메시지를 전송하지 않으면, 안드로이드 마켓은 당신이 확인하지 않은 거래들에 대한 
IN_APP_NOTIFY 메시지들을 계속 전송하게 될 것이다. 실제로 당신은 사용자에게 아이템이 전달될 때 까지 구매된 아이템에 대한 CONFIRM_NOTIFICATIONS 요청을 보내서는 안된다.


이 방법은 만약 당신의 애플리케이션이 충돌이 일거나 다른 무언가가 상품을 전달하는데에 있어 방해를 받는다면, 당신의 애플리케이션은 당신이 전달할 필요가 있는 상품에 대한 지시를
IN_APP_NOTIFY 브로드캐스트 인텐트를 안드로이드 마켓으로부터 계속 받으려 할 것이다. 또한 최선의 방법으로 당신의 애플리케이션은 다중 명령들을 포함한 IN_APP_NOTIFY 메시지들을 처리할 수 있어야만 한다.
 

복원 과정 요청을 위한 메시징 흐름은 그림 3에서 보여진다.  각 sendBillingRequest() 함수에 대한 요청 유형들은 볼드체로, 브로드캐스트 인텐트들은 이탤릭체로 보여진다. 그림 3은 모든 요청에 대해 보내진 RESPONSE_CODE 브로드캐스트 인텐트를 명확하게 보여주진 않는다.

그림 3. 복원 과정 요청을 위한 메시징 흐름

요청은 세가지의 응답을 발동시킨다. 첫번째는 
RESPONSE_CODE 키, REQUEST_ID 키의 번들이다. 다음은, 안드로이드 마켓 애플리케이션은 RESPONSE_CODE 브로드캐스트 인텐트를 전송하고, 그것은 요청에 관한 상태 정보나 오류 정보를 제공한다. 언제나처럼 응답코드 메시지는 특정한 요청 ID를 참조하고, 그래서 당신은 메시지와 관련된 요청을 결정할 수 있다.

또한 RESTORE_TRANSACTIONS 요청 유형은 PURCHASE_STATE_CHANGED 브로드캐스트 인텐트를 발동 시키고, 그것은 거래 정보와 같은 유형을 포함한다. 거래 정보는 비록 당신이 CONFIRM_NOTIFICATION 메시지와 함께 이 인텐트를 응답할 필요가 없음에도 불구하고 구매 요청을 하는 동안 보내지게 된다.

주의: 당신은 당신 애플리케이션이 처음 설치 되었을때나 장치에서 제거되고 재설치 되었을 때만 RESTORE_TRANSACTIONS 요청 유형을 사용해야 한다.

인앱 결제의 지원 여부 확인에 관한 메시징 흐름은 그림 4에서 보여진다. sendBillingRequest() 메소드의 요청 유형은 볼드체로 보여진다.

그림 4. 인앱 결제의 지원 여부 확인에 관한 메시징 흐름

CHECK_BILLING_SUPPORTED 요청에 관한 동기적 응답은 서버 응답 코드와 함께 번들을 제공한다. RESULT_OK 응답 코드는 인앱 결제가 지원되는지를 알려준다; API버전을 당신이 명확하게 알아낼 수 없거나 사용자가 인앱 결제를 사용할 자격이 없기 때문에 RESULT_BILLING_UNAVAILABLE 응답 코드는 인앱 결제가 유효하지 않은지를 알려준다(예를들어, 사용자 거주하는 지역이 인앱 결제가 허용되지 않을 때). 또한 SERVER_ERROR 반활 될 수도 있고, 그것은 안드로이드 마켓 서버가 문제가 있음을 알려준다.

IN_APP_NOTIFY 메시지들의 처리

일반적으로 당신의 애플리케이션은 
REQUEST_PURCHASE 메시지에 대한 응답으로 안드로이드 마켓으로부터 IN_APP_NOTIFY 브로드캐스트 인텐트를 수신한다(그림 2 참고). IN_APP_NOTIFY 브로드캐스트 인텐트는 당신의 애플리케이션에 구매된 요청의 상태가 변경되었음을 공지한다. 구매 상세 내역을 검색하고 싶다면, 당신의 애플리케이션은 GET_PURCHASE_INFORMATION 요청을 보낸다. 안드로이드 마켓은 구매 상태 변경에 관한 상세 내역이 포함된 PURCHASE_STATE_CHANGED 브로드캐스트 인텐트를 응답한다. 당신의 애플리케이션은 CONFIRM_NOTIFICATIONS 메시지를 전송하여 당신이 구매 상태 변경 공지를 통보 받았음을 안드로이드 마켓에 알린다.

몇몇 특별한 경우에 한해서, 당신은 
구매 정보 영수증들을 확인했음에도 불구하고 여러 IN_APP_NOTIFY 메시지들을 받거나, 당신이 결코 구매를 하지 않았더라도 구매 변경에 관한 IN_APP_NOTIFY 메시지들을 받을 수도 있다. 당신의 애플리케이션은 이런 특별한 경우 모두를 처리해야만 한다.

여러 IN_APP_NOTIFY 메시지들의 처리

안드로이드 마켓이 주어진 
PURCHASE_STATE_CHANGED 메시지에 대한 CONFIRM_NOTIFICATIONS 메시지를 받았을 때, 대개 PURCHASE_STATE_CHANGED 메시지의 IN_APP_NOTIFY 인텐트 전송을 멈춘다. 하지만 때때로 안드로이드 마켓은 당신의 애플리케이션이 CONFIRM_NOTIFICATIONS 메시지를 전달 받았을에도 불구하고 PURCHASE_STATE_CHANGED 메시지에 대한 IN_APP_NOTIFY 인텐트를 재전송 한다. 이것은 만약 단말이 CONFIRM_NOTIFICATIONS 메시지를 전송하는 동안 네트워크 연결이 손실 될 경우 발생될 수 있다. 이러한 경우, 안드로이드 마켓은 CONFIRM_NOTIFICATIONS 메시지를 못받았을지도 모르고,  당신이 처리 메시지를 받았다고 인정할 때 까지 여러 IN_APP_NOTIFY 메시지들을 보내게 될 것이다. 그러므로 당신의 애플리케이션은 추후에 IN_APP_NOTIFY 메시지들이 이전에 처리되었다는 것을 인지할 수 있어야만 한다. 당신은 모든 처리 과정에 있어 고유한 orderId를 갖고 있기 때문에, JSON 문자열 안에 포함되어 있는 orderID를 확인하여 이 일을 처리 할 수 있다.

환불 및 기타 원치않는 IN_APP_NOTIFY 메시지들의 처리

당신의 애플리케이션이 REQUEST_PURCHASE 메시지를 보내지 못하였음에도 IN_APP_NOTIFY 브로드캐스트 인텐트를 받을지도 모르는 두 가지 경우가 있다. 그림 5는 그러한 경우들 모두에 관한 메시징 흐름을 보여준다. 각각의 요청 종류들은 sendBillingRequest() 메소드는 볼드체로, 브로드캐스트 인텐트는 이탤릭체로 보여진다. 그림 5는 모든 요청에 관해 보내진 RESPONSE_CODE 브로드캐스트 인텐트를 명확하게 보여주지는 않는다.

그림 5. 환불 및 기타 원치않는 IN_APP_NOTIFY 메시지들의 메시징 흐름

첫번째 경우는, 한 사용자가 당신의 애플리케이션을 두 개의 단말에(혹은 그 이상) 설치하고 단말 중에 하나로부터 인앱 결제를 시도할 때 당신의 애플리케이션은
IN_APP_NOTIFY 브로드캐스트 인텐트를 받을지도 모른다. 이러한 경우, 안드로이드 마켓은 IN_APP_NOTIFY 메시지를 두번째 단말에 보내게 되고, 애플리케이션에 구매상태가 변경 되었음을 공지한다. 당신의 애플리케이션은 시작된 애플리케이션의 REQUEST_PURCHASE 메시지로부터 응답을 처리하는 것과 같은 방법으로 이 메시지를 처리 할 수 있고, 궁극적으로 당신의 애플리케이션은 구매 된 아이템들의 관한 정보가 포함된 PURCHASE_STATE_CHANGED 브로드캐스트 인텐트 메시지를 받는다. 이것은 오직 "사용자 계정마다 관리됨"의 구매 유형 아이템에만 적용이 된다.

두번째 경우는, 
당신의 애플리케이션은 안드로이드 마켓이 구글 체크아웃으로부터 환불 알림을 받았을 때 IN_APP_NOTIFY 브로드캐스트 인텐트를 받을 수 있다. 이러한 경우, 안드로이드 마켓은 IN_APP_NOTIFY 메시지를 당신의 애플리케이션에 전송한다. 당신의 애플리케이션은 시작된 애플리케이션의 REQUEST_PURCHASE 메시지로부터 응답을 처리하는 것과 같은 방법으로 이 메시지를 처리 할 수 있고, 궁극적으로 당신의 애플리케이션은 환불 된 아이템들의 관한 정보가 포함된 PURCHASE_STATE_CHANGED 메시지를 받는다. 환불 정보는 PURCHASE_STATE_CHANGED 브로드캐스트 인텐트를 동반한 JSON 문자열 안에 포함된다. 또한 JSON 문자열 안의 purchaseState 필드는 2로 설정된다.

중요: 당신은 환불 또는 인앱 결제 처리 과정에 있어 구글 체크아웃 API를 사용할 수 없다. 당신은 이것을 당신의 구글 체크아웃 판매 계정을 통해 직접 해야만 한다. 그러나, 당신은 주문 정보를 검색하는데 구글 체크아웃 API를 사용 할 수 있다.

보안 제어

당신의 애플리케이션에 보내진 거래 정보의 무결성을 보장하기 위해, 안드로이드 마켓은 PURCHASE_STATE_CHANGED 브로드캐스트 인텐트 안에 포함된 JSON 문자열에 서명을 한다. 안드로이드 마켓은 서명을 만들 당신의 발행자 계정과 관련된 개인 키를 사용한다. 발행자 사이트는 각 발행자 계정마다 RSA 키의 쌍을 생성한다. 당신은 당신의 계정 프로필 페이지에 이 키 쌍의 공개 키 부분을 찾을 수 있다. 그것은 안드로이드 마켓 라이센스와 함께 사용되는 공개 키와 같다.

안드로이드 마켓이 결제 응답을 서명할 때, 그것은 서명된 JSON 문자열(암호화되지 않음)과 서명이 포함된다. 당신의 애플리케이션이 서명된 응답을 받았을 때, 당신은 서명의 확인을 위해 당신의 RSA 키 쌍의 공개 키 부분을 이용 할 수 있다. 서명 확인을 수행함으로써 당신은 응답이 위조되었거나 스푸핑 되었는지 알아 낼 수 있다. 당신의 애플리케이션에서 서명 검증 단계를 수행할 수 있다; 만약 당신의 애플리케이션이 안전한 우너격 서버에 연결되어 있다면, 우리는 당신이 서버에서 서명을 검증 할 것을 추천한다.

또한 인앱 결제는 안드로이드 마켓으로부터 반환되는 구매 정보의 무결성 검증을 위해 nonces(일회용 무작위의 수)를 사용한다. 당신의 애플리케이션은 nonce를 생성하고 GET_PURCHASE_INFORMATION 요청과 RESTORE_TRANSACTIONS 요청을 함께 보내야만 한다. 안드로이드 마켓이 요청을 받았을 때, 처리 정보가 포함된 JSON문자열에 nonce를 더한다. JSON 문자열은 서명되고 당신의 애플리케이션으로 반환된다. 당신의 애플리케이션이 JSON 문자열을 받았을 때, 당신은 JSON 문자열의 서명과 마찬가지로 nonce의 검증을 필요로 한다.
 

보안 및 설계의 좋은 사례들에 관한 정보는 보안 및 설계를 참조하라.

인앱 결제의 요구사항 및 한계점

인앱 결제를 시작하기 전에, 다음 요구사항 및 한계점들을 검토하라.

  • 인앱 결제는 오직 안드로이드 마켓을 통해 발급된 애플리케이션 안에서만 구현 될 수 있다.
  • 당신은 안드로이드 마켓 인앱 결제를 사용하기 위해서는 반드시 구글 체크아웃 판매자 계정을 갖고 있어야만 한다.
  • 만약 당신의 단말이 안드로이드 3.0에서 구동중이라면, 인앱 결제는 MyApps 애프리케이션의 버전 5.0.12 (또는 그 이상)을 필요로 한다. 만약 당신의 단말이 다른 버전에서 구동중이라면, 인앱 결제는 안드로이드 마켓 애플리케이션의 버전 2.3.4 (또는 그 이상)을 필요로 한다.
  • 애플리케이션은 장치가 안드로이드 1.6(API 레벨 4) 또는 그 이상의 버전 경우만 사용할 수 있다.
  • 당신은 인앱 결제를 오직 디지털 컨텐츠를 판매하는데에만 사용할 수 있다. 당신은 인앱 결제를 실제 상품, 개인적인 서비스, 또는 물리적 배송이 필요한 어떤 것도 파는데 사용 할 수 없다.
  • 안드로이드 마켓은 컨텐츠 전달의 양식을 제공하지 않는다. 당신은 당신의 애플리케이션 내에서 판매하는 디지털 컨텐츠의 배송 책임이 있다.
  • 당신은 네트워크가 연결되지 않은 단말상의 인앱 결제를 구현할 수 없다. 인앱 구매 요청을 완료하기 위해서, 단말은반드시 안드로이드 마켓 서버에 네트워크로 접근 가능해야만 한다.

인앱 결제 요구사항에 관한 정보는 인앱 결제 가용 및 정책을 참조하라.

Posted by 레미파
,