Reminder: By Aug 31, 2025, all new apps and updates to existing apps must use Billing Library version 7 or newer. If you need more time to update your app, you can request an extension until Nov 1, 2025. Learn about Play Billing Library version deprecation.
개발자 페이로드는 과거에 사기를 예방하고 구매에 기여한 사용자를 정확하게 분석하는 등 다양한 목적으로 사용되었습니다. Google Play 결제 라이브러리 버전 2.2 이상에서는 이전에 개발자 페이로드에 의존하도록 의도된 사용 사례가 이제 라이브러리의 다른 부분에서 완전히 지원됩니다.
이러한 지원이 제공되는 가운데 Google Play 결제 라이브러리 버전 2.2부터 개발자 페이로드는 지원이 중단됩니다. 개발자 페이로드와 연결된 메서드는 버전 2.2에서 지원 중단되었으며 버전 3.0에서 삭제되었습니다. 앱은 라이브러리의 이전 버전 또는 AIDL을 사용하여 발생한 구매의 개발자 페이로드를 계속 가져올 수 있습니다.
구매가 신뢰할 수 있고, 위조되거나 재생되지 않았다는 것을 보장하기 위해 Google Play Developer API와 함께 구매 토큰(Purchase 객체의 getPurchaseToken() 메서드에서 가져옴)을 사용하여 구매가 신뢰할 수 있는 것인지 확인하는 것이 좋습니다.
자세한 내용은 사기 및 악용 방지를 참조하세요.
구매 기여 분석
많은 앱, 특히 게임은 구매를 시작한 인게임 캐릭터/아바타 또는 인앱 사용자 프로필이 해당 구매에 기여한 것을 정확하게 확인해야 합니다. Google Play 결제 라이브러리 2.2부터 앱은 구매 대화상자를 시작할 때 Google에 난독화된 계정과 프로필 식별자를 전달하고 구매를 회수할 때 반환하도록 할 수 있습니다.
구매에 관한 메타데이터는 개발자가 유지하는 안전한 백엔드 서버에 저장하는 것이 좋습니다. 이러한 구매 메타데이터는 Purchase 객체의 getPurchaseToken 메서드를 사용하여 가져온 구매 토큰과 연결되어야 합니다. 구매가 성공적으로 이루어진 후에 PurchasesUpdatedListener가 호출될 때 구매 토큰과 메타데이터를 백엔드에 전달하여 이 데이터를 유지할 수 있습니다.
구매 흐름에 방해가 있을 때 메타데이터의 연결을 보장하려면 구매 대화상자를 실행하고 메타데이터를 사용자의 계정 ID, 구매 중인 SKU 및 현재 타임스탬프와 연결하기 전에 개발자의 백엔드 서버에 저장하는 것이 좋습니다.
이 페이지에 나와 있는 콘텐츠와 코드 샘플에는 콘텐츠 라이선스에서 설명하는 라이선스가 적용됩니다. 자바 및 OpenJDK는 Oracle 및 Oracle 계열사의 상표 또는 등록 상표입니다.
최종 업데이트: 2025-07-27(UTC)
[null,null,["최종 업데이트: 2025-07-27(UTC)"],[],[],null,["# Developer payload has historically been used for various purposes, including\nfraud prevention and attributing purchases to the correct user. With versions\n2.2 and higher of the Google Play Billing Library, intended use cases that\npreviously relied on developer payload are now fully supported in other parts\nof the library.\n\nWith this support in place, we have deprecated developer payload, starting with\nversion 2.2 of the Google Play Billing Library. Methods associated with\ndeveloper payload have been deprecated in version 2.2 and were removed in\nversion 3.0. Note that your app can continue to retrieve developer\npayload for purchases made using either previous versions of the library or\nAIDL.\n\nFor a detailed list of changes, see the\n[Google Play Billing Library 2.2 release notes](/google/play/billing/release-notes#2-2).\nand [Google Play Billing Library 3.0 release notes](/google/play/billing/release-notes#3-0).\n\nPurchase verification\n---------------------\n\nTo ensure purchases are authentic and not forged or replayed, Google recommends\nusing the purchase token (obtained from the\n[`getPurchaseToken()`](/reference/com/android/billingclient/api/Purchase#getpurchasetoken)\nmethod in the\n[`Purchase`](/reference/com/android/billingclient/api/Purchase) object) along\nwith the Google Play Developer APIs to verify purchases are authentic.\nFor more information, see\n[Fight fraud and abuse](/google/play/billing/security).\n\nPurchase attribution\n--------------------\n\nMany apps, particularly games, need to ensure that a purchase is correctly\nattributed to the in-game character/avatar or in-app user profile that initiated\nthe purchase. Starting with Google Play Billing Library 2.2,\nyour app can pass obfuscated account and profile identifiers to Google\nwhen launching the purchase dialog and have them returned when retrieving a\npurchase.\n\nUse the\n[`setObfuscatedAccountId()`](/reference/com/android/billingclient/api/BillingFlowParams.Builder#setObfuscatedAccountId(java.lang.String))\nand\n[`setObfuscatedProfileId()`](/reference/com/android/billingclient/api/BillingFlowParams.Builder#setobfuscatedprofileid)\nparameters in\n[`BillingFlowParams`](/reference/com/android/billingclient/api/BillingFlowParams)\nand retrieve them using the\n[`getAccountIdentifiers()`](/reference/com/android/billingclient/api/Purchase#getAccountIdentifiers())\nmethod in the\n[`Purchase`](/reference/com/android/billingclient/api/Purchase) object.\n| **Note:** Purchases made using previous versions of the library using [`setAccountId()`](/reference/com/android/billingclient/api/BillingFlowParams.Builder#setAccountId(java.lang.String)) (renamed to `setObfuscatedAccountId()`) are not returned by `getAccountIdentifiers()`.\n\nAssociate metadata with a purchase\n----------------------------------\n\nGoogle recommends storing metadata about a purchase on a secure backend\nserver that you maintain. This purchase metadata should be associated with the\npurchase token obtained using the\n[`getPurchaseToken`](/reference/com/android/billingclient/api/Purchase#getPurchaseToken())\nmethod in the [`Purchase`](/reference/com/android/billingclient/api/Purchase)\nobject. This data can be persisted by passing the purchase token and metadata\nto your backend when your\n[`PurchasesUpdatedListener`](/reference/com/android/billingclient/api/PurchasesUpdatedListener)\nis called after a successful purchase.\n\nTo ensure metadata is associated in the case of purchase flow interruptions,\nGoogle recommends storing the metadata on your backend server prior to\nlaunching the purchase dialog and associating it with your user's account ID,\nthe SKU being purchased, and the current timestamp.\n\nIf the purchase flow is interrupted before your\n[`PurchasesUpdatedListener`](/reference/com/android/billingclient/api/PurchasesUpdatedListener)\nis called, your app will discover the purchase once your app resumes and calls\n[`BillingClient.queryPurchasesAsync()`](/reference/com/android/billingclient/api/BillingClient#queryPurchasesAsync(java.lang.String,%20com.android.billingclient.api.PurchasesResponseListener)).\nYou can then send the values retrieved from the `Purchase` object's\n[`getPurchaseTime()`](/reference/com/android/billingclient/api/Purchase#getPurchaseTime()),\n[`getSku()`](/reference/com/android/billingclient/api/Purchase#getsku),\nand [`getPurchaseToken()`](/reference/com/android/billingclient/api/Purchase#getpurchasetoken)\nmethods to your backend server to look up metadata, associate the metadata\nwith the purchase token, and continue processing the purchase. Note that the\ntimestamp you initially stored won't exactly match the value from the `Purchase` object's\n[`getPurchaseTime()`](/reference/com/android/billingclient/api/Purchase#getPurchaseTime()),\nso you would need to compare them in an approximate way. For example, you can check\nif the values are within a certain time period of each other."]]