THIS LESSON TEACHES YOU TO
YOU SHOULD ALSO READ
Once your application is connected to Google
Play, you can initiate purchase requests for in-app products. Google Play
provides a checkout interface for users to enter their payment method, so your
application does not need to handle payment transactions directly.
단한번 당신의 애플리케이션은 구글플레이에 연결되고, 인앱 제품의 구매 요구를 시작할
수 있다. 구글플레이는 유저가 그들의 지불 메소드에 진입할 수 있도록 결제 인터페이스를 제공한다, 그렇기 때문에 당신의 애플리케이션은 지불
트랜젝션을 직접적으로 다룰필요 없다.
When an item is purchased, Google Play recognizes
that the user has ownership of that item and prevents the user from purchasing
another item with the same product ID until it is consumed. You can control how
the item is consumed in your application, and notify Google Play to make the
item available for purchase again.
아이템이 구매되었을때, 구글플레이는 사용자가 아이템을 소유했음을 인지하고, 유저가
같은 ID를 가진 아이템을 소모하기 전에 재구매하는 것을 방지한다. 당신은 애플리케이션에서 어떻게 아이템이 소비될지 제어 할 수 있고,
구글플레이에 다시 구매가 가능한 아이템으로 만들 수 있다.
You can also query Google Play to quickly
retrieve the list of purchases that were made by the user. This is useful, for
example, when you want to restore the user's purchases when your user launches
your app.
당신은 또한, 구글 플레이로 부터 빠르게 유저가 구매한 아이템들의 목록을 되찾을 수
있다. 이것은 유저가 당신의 앱을 실핼 할때 구매한 제품들을 다시 복구하는데 유용하다.
Purchase an Item(아이템 구매)
To start a purchase request from your app,
call
launchPurchaseFlow(Activity,
String, int, OnIabPurchaseFinishedListener, String)
on your IabHelper
instance.
You must make this call from the main thread of your Activity
.
Here’s an explaination of the launchPurchaseFlow
method
parameters:
앱에서 구매 요구를 시작하기 위해서,
launchPurchaseFlow(Activity,
String, int, OnIabPurchaseFinishedListener, String)
메소드를 IabHelper
의
인스턴스에서 호출한다. 당신은 반드시 액티비티의 메인 쓰레드에서 호출되도록해야한다. 여기에 launchPurchaseFlow
파라메터들의
설명이있다:- The first argument is the calling
Activity
.(첫번쨰 인자는 호출하는 액티비티다.) - The second argument is the product ID (also called its SKU) of the item to purchase. Make sure that you are providing the ID and not the product name. You must have previously defined and activated the item in the Developer Console, otherwise it won’t be recognized.(두번째 인자는 구매할 제품의 ID다(또한 SKU라 불려진다). 재품의 이름이 아닌 제품의 ID를 제공하는 지 확인해야한다. 반드시 이전에 개발자 콘솔에서 아이템을 선언하고 할성화 시켜야한다, 그렇지 않을경우 그것은 인정되지 않을것이다.)
- The third argument is a request code value. This
value can be any positive integer. Google Play reurns this request code to the
calling
Activity
’sonActivityResult
along with the purchase response.(세번째 인자는 요청 코드 값이다 이것은 임의의 양의 정수 값이 될 수 있다. 구글 플레이는 구매 응답시Activity
의onActivityResult
호출할때 요청코드를 되돌려준다.) - The fourth argument is a listener that is notified when the purchase operation has completed and handles the purchase response from Google Play.(네번째 인자는 구매 작업이 완료될때 통지 받는 리스너다, 구글 플레이로 부터 구매 응답을 받아 다룬다.)
- The fifth argument contains a ‘developer
payload’ string that you can use to send supplemental information about an order
(it can be an empty string). Typically, this is used to pass in a string token
that uniquely identifies this purchase request. If you specify a string value,
Google Play returns this string along with the purchase response. Subsequently,
when you make queries about this purchase, Google Play returns this string
together with the purchase details.(5번쨰 인자는 '개발자 payload' 스트링을 담고 있다, 당신은 주문에
대한 추가정보를 담아 보낼 수 있다(이것은 빈문자열이 될수있다). 일반적으로, 이것은 구매 요청의 유일한 식별자를 담는 스트링 토큰으로
전될되는데 사용된다. 만일 스트링 값을 지정하는 경우, 구글플레이는 구매 응답과 함께 스트링을 되돌려준다. 이어서, 이 구매에 대해 조회할때,
구글 플레이는 응답 상세 정보에 스트링을 함께 포함하여 되돌려준다.)
Security Recommendation: It’s good practice to pass in a string that helps your application to identify the user who made the purchase, so that you can later verify that this is a legitimate purchase by that user. For consumable items, you can use a randomly generated string, but for non-consumable items you should use a string that uniquely identifies the user.보안권고 : 스트링에 어떤유저가 구매하는지 애플리케이션에 도움이 되는 식별자를 담아 보내는것은 좋은 습관이다, 이럴경우 당신은 이후에 구매가 합법적인지 검증할 수 있다. 소모성 아이템들에 대해서, 임의로 생성된 스트링을 사용할 수 있다, 그러나 비 소모성 아이템들은 유저별 고유식별자를 사용하여야한다.
The following example shows how you can make a
purchase request for a product with ID
SKU_GAS
,
using an arbitrary value of 10001 for the request code, and an encoded developer
payload string.
다음의 예는 제품 ID
SKU_GAS
의
구매 요청을 어떻게 만드는지 보여준다, 임의의 10001 값을 요청 코드로 하고 , 인코딩된 payload 문자열을 사용한다.mHelper.launchPurchaseFlow(this, SKU_GAS, 10001, mPurchaseFinishedListener, "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");
If the purchase order is successful, the response
data from Google Play is stored in an
Purchase
object
that is passed back to the listener.
구매 주문이 성공한다면, 구글플레이로부터의 응답 데이터는 Purchase 오브젝트를
담아 리스너에 전달된다.
The following example shows how you can handle
the purchase response in the listener, depending on whether the purchase order
was completed successfully, and whether the user purchased gas or a premium
upgrade. In this example, gas is an in-app product that can be purchased
multiple times, so you should consume the purchase to allow the user to buy it
again. To learn how to consume purchases, see the Consuming Productssection. The premium upgrade is a one-time
purchase so you don’t need to consume it. It is good practice to update the UI
immediately so that your users can see their newly purchased items.
다음 예는 구매 주문이 성공했는지에 따라서, 유저가 가스 또는 프리미엄 업그레이드를
하는지에 따라서 리스너에서 구매 응답을 어떻게 다루는지 보여준다. 예제에서, 가스 인앱 제품은 계속적인 구매가 가능하다, 그렇기 때문에 유저가
그것을 다시 살수 있게 하기 위해서 소비를 해야한다. 구매를 어떻게 소비하는지 배우기 위해서, Consuming Products를 보라. 프리이엄 업그레이드는 단 한번 구매한다, 그렇기 때문에 그것을 소비할
필요없다. 즉각 적인 UI업데이트는 좋은 방법이다, 유저는 그들이 새로 구매한 아이템들을 볼 수 있을 것이다.
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { public void onIabPurchaseFinished(IabResult result, Purchase purchase) { if (result.isFailure()) { Log.d(TAG, "Error purchasing: " + result); return; } else if (purchase.getSku().equals(SKU_GAS)) { // consume the gas and update the UI } else if (purchase.getSku().equals(SKU_PREMIUM)) { // give user access to premium content and update the UI } } };
Security Recommendation: When you receive the
purchase response from Google Play, make sure to check the returned data
signature, the
orderId
,
and the developerPayload
string
in the Purchase
object
to make sure that you are getting the expected values. You should verify that
the orderId
is
a unique value that you have not previously processed, and the developerPayload
string
matches the token that you sent previously with the purchase request. As a
further security precaution, you should perform the verification on your own
secure server.
보안권고 : 구글 플레이로부터 구매 응답을 수신했을때,
Purchase
로
되돌려진 데이터의 서명(signature), orderId
와
developerPayload
가 올바른 값인지 확인하라. 당신은 아마 orderId가
이전에 처리하지않은 유일한 값인지 , developerPayload가
이전 구매 요청때 전송된 값과 일치하는지 검증할것이다. 그 이상의 보안 예방으로, 당신은 자신의 서버에서 검증을 구현할 수
있다.Query Purchased Items(구매 아이템 조회)
Upon a successful purchase, the user’s purchase
data is cached locally by Google Play’s In-app Billing service. It is good
practice to frequently query the In-app Billing service for the user’s
purchases, for example whenever the app starts up or resumes, so that the user’s
current in-app product ownership information is always reflected in your
app.
구매 성공시에, 유저의 구매 데이터는 구글 플레이의 인앱 빌링 서비스의 로컬에
캐시된다. 이것은 빈번하게 인앱빌링 서비스에 유저의 구매를 조회하는데 유용하다, 예를 들어, 앱이 시작또는 재시작 될때, 유저의 현재 소유한
인앱 재품의 정보를 항상 앱에 반영할 수 있다.
To retrieve the user’s purchases from your app,
call
queryInventoryAsync(QueryInventoryFinishedListener)
on
your IabHelper
instance.
The QueryInventoryFinishedListener
argument
specifies a listener that is notified when the query operation has completed and
handles the query response. It is safe to make this call fom your main
thread.
당신의 앱에서 유저의 구매제품들을 되찾기 위해서,
queryInventoryAsync(QueryInventoryFinishedListener)
메소드를 IabHelper
인스턴스에서
호출 할 수 있다. QueryInventoryFinishedListener
인자는
조회 작업이 완료되고 조회의 결과를 다룰 수 있을때 통지 받는 리스너이다. 당신의 메인쓰레드에서 이것을 호출하는것이 안전하다.mHelper.queryInventoryAsync(mGotInventoryListener);
If the query is successful, the query results are
stored in an
Inventory
object
that is passed back to the listener. The In-app Billing service returns only the
purchases made by the user account that is currently logged in to the
device.
만일 조회가 성공한다면, 조회의 결과들은
Inventory
오브젝트를
담아 리스너에 전달된다. 인앱 빌링 서비스는 오직 현재 디바이스에 로그인한 유저의 계정으로 부터 만들어진 구매들만 돌려준다.IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() { public void onQueryInventoryFinished(IabResult result, Inventory inventory) { if (result.isFailure()) { // handle error here } else { // does the user have the premium upgrade? mIsPremium = inventory.hasPurchase(SKU_PREMIUM); // update UI accordingly } } };
Consume a Purchase(구입물 소비)
You can use the In-app Billing Version 3 API to
track the ownership of purchased items in Google Play. Once an item is
purchased, it is considered to be "owned" and cannot be purchased again from
Google Play while in that state. You must send a consumption request for the
item before Google Play makes it available for purchase again. All managed
in-app products are consumable. How you use the consumption mechanism in your
app is up to you. Typically, you would implement consumption for products with
temporary benefits that users may want to purchase multiple times (for example,
in-game currency or replenishable game tokens). You would typically not want to
implement consumption for products that are purchased once and provide a
permanent effect (for example, a premium upgrade).
당신은 인앱 빌링 버전3의 API를 사용하여 구글플레이에서 구매된 소유물을 추적할
수 있다. 단한번, 아이템은 구매되며, 그것은 소유된것으로 취급되어 해당 상태에 있는 이상은 구글 플레이로 부터 다시 구매할 수 없다. 당신은
구글 플레이가 아이템을 다시 구매 가능한 상태로 만들도록 아이템 소비를 전송해야만 한다. 모든 관리되는 제품들은 소비 가능하다. 어떻게
소비하는지에 대한 매커니즘은 당신의 앱에 설정하는것에 달려있다. 보통, 당신은 제품의 소비를 통해서 일시적인 이득을 주고 유저가 계속적으로
구매할 수 있게 하기를 원할것이다(예를 들어, 인게임통화나 게임토큰보충).당신은 한번의 구매로 영구적인 효과를 주는 제품의 소비를 원하지 않을
것이다(예를 들어, 프리미엄 업그레이드)
It's your responsibility to control and track how
the in-app product is provisioned to the user. For example, if the user
purchased in-game currency, you should update the player's inventory with the
amount of currency purchased.
유저에게 인앱 제품이 어떻게 지급되는지 추적하고 제어하는 것은 당신의 책임이다.
예를들어, 유저가 인게임 통화를 구매하면, 당신은 플레이어의 인벤토리에 구매한 만큼의 통화를 업데이트해야한다.
Security Recommendation: You must send a consumption
request before provisioning the benefit of the consumable in-app purchase to the
user. Make sure that you have received a successful consumption response from
Google Play before you provision the item.
보안권고 : 당신은 유저에게 인앱제품의 소비를 통해 이득을 지급하기 전에 소비 요청을 반드시 전송해야한다. 당신은
아이템 지급전 구글플레이로 부터 성공적인 소비 응답수신을 확인해야한다.
To record a purchase consumption, call
consumeAsync(Purchase,
OnConsumeFinishedListener)
on yourIabHelper
instance.
The first argument that the method takes is the Purchase
object
representing the item to consume. The second argument is a OnConsumeFinishedListener
that
is notified when the consumption operation has completed and handles the
consumption response from Google Play. It is safe to make this call fom your
main thread.
구입물 소비를 기록하기 위해,
consumeAsync(Purchase,
OnConsumeFinishedListener)
를 IabHelper
인스턴스에서
호출해야한다. 메소드의 첫번째 인자는 소비될 아이템을 나타내는 Purchase
오브젝트이다.
두번째 인자는 OnConsumeFinishedListener 리스너로
소비 작업이 완료되고 구글플레이로 부터 소비 응답을 받아 다룰수 있는 경우 통지받게 된다. 이것을 당신의 메인쓰레드에서 호출하는것이
안전하다.
In this example, you want to consume the gas item
that the user has previously purchased in your app.
다음 예에서, 당신은 앱에서 유저가 이전에 구매한 아이템인 gas를 소비하기를
원한다.
mHelper.consumeAsync(inventory.getPurchase(SKU_GAS), mConsumeFinishedListener);
The following example shows how to implement
the
OnConsumeFinishedListener
.
다음 예는
OnConsumeFinishedListener
를
어떻게 구현하는지 보여준다.IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() { public void onConsumeFinished(Purchase purchase, IabResult result) { if (result.isSuccess()) { // provision the in-app purchase to the user(인앱 제품을 유저에게 지급한다) // (for example, credit 50 gold coins to player's character, 예를들어 50Gold의 코인을 플레이어 캐릭터에 지급) } else { // handle error } } };
Check for Consumable Items on Startup(시작시 소비성 아이템 확인)
It’s important to check for consumable items when
the user starts up your application. Typically, you would first query the In-app
Billing service for the items purchased by the user (via
queryInventoryAsync
),
then get the consumable Purchase
objects
from the Inventory. If your application detects that are any consumable items
that are owned by the user, you should send a consumption request to Google Play
immediately and provision the item to the user. See the TrivialDrive
sample
for an example of how to implement this checking at startup.
유저가 당신의 애플리케이션을 시작시 소비성 아템들을 확인하는 것은 중요하다. 보통,
당신은 유저가 구매한 아이템들을 인앱빌링서비스에 조회할 것이다(queryInventoryAsync를통해서),
그때 인벤토리로 부터 소비가능한
Purchase
오브젝트를
얻는다. 만일 애플리케이션에서 유저가 소유한 소모성 아이템이 감지된다면, 당신은 소비 요청을 구글 플레이에 즉각적으로 보내고, 유저의 아이템을
지급하면된다. TrivialDrive
샘플의
예에서 시작시 어떻게 이를 구현하는지 보라.
좋은 정보네요 감사합니다 .
답글삭제