2013년 10월 3일 목요일

[구글인앱]Purchasing In-app Billing Products(인앱 빌링 제품 구매하기) #4

 던전워즈

Purchasing In-app Billing Products(인앱 빌링 제품 구매하기)

THIS LESSON TEACHES YOU TO

  1. Purchase an Item
  2. Query Purchased Items
  3. Consume a Purchase

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’s onActivityResult 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 샘플의 예에서 시작시 어떻게 이를 구현하는지 보라.

댓글 1개: