This topic lists and describes the types of Real-time developer notifications that you can receive from Google Play.
Encoding
Each publish made to a Cloud Pub/Sub topic contains a single base64-encoded data field.
{
"message": {
"attributes": {
"key": "value"
},
"data": "eyAidmVyc2lvbiI6IHN0cmluZywgInBhY2thZ2VOYW1lIjogc3RyaW5nLCAiZXZlbnRUaW1lTWlsbGlzIjogbG9uZywgIm9uZVRpbWVQcm9kdWN0Tm90aWZpY2F0aW9uIjogT25lVGltZVByb2R1Y3ROb3RpZmljYXRpb24sICJzdWJzY3JpcHRpb25Ob3RpZmljYXRpb24iOiBTdWJzY3JpcHRpb25Ob3RpZmljYXRpb24sICJ0ZXN0Tm90aWZpY2F0aW9uIjogVGVzdE5vdGlmaWNhdGlvbiB9",
"messageId": "136969346945"
},
"subscription": "projects/myproject/subscriptions/mysubscription"
}
After you decode the base64-encoded data field, the DeveloperNotification
contains the following fields:
{
"version": string,
"packageName": string,
"eventTimeMillis": long,
"oneTimeProductNotification": OneTimeProductNotification,
"subscriptionNotification": SubscriptionNotification,
"voidedPurchaseNotification": VoidedPurchaseNotification,
"testNotification": TestNotification
}
These fields are described in the following table.
Property name | Value | Description |
version | string | The version of this notification. Initially, this is "1.0". This version is distinct from other version fields. |
packageName | string | The package name of the application that this notification relates to (for example, `com.some.thing`). |
eventTimeMillis | long | The timestamp when the event occurred, in milliseconds since the Epoch. |
subscriptionNotification | SubscriptionNotification | If this field is present, then this notification is related to a subscription, and this field contains additional information related to the subscription. Note that this field is mutually exclusive with oneTimeProductNotification, voidedPurchaseNotification, and testNotification. |
oneTimeProductNotification | OneTimeProductNotification | If this field is present, then this notification is related to a one-time purchase, and this field contains additional information related to the purchase. Note that this field is mutually exclusive with subscriptionNotification, voidedPurchaseNotification, and testNotification. |
voidedPurchaseNotification | VoidedPurchaseNotification | If this field is present, then this notification is related to a voided purchase, and this field contains additional information related to the voided purchase. Note that this field is mutually exclusive with oneTimeProductNotification, subscriptionNotification, and testNotification. |
testNotification | TestNotification | If this field is present, then this notification is related to a test publish. These are sent only through the Google Play Developer Console. Note that this field is mutually exclusive with oneTimeProductNotification, subscriptionNotification, and voidedPurchaseNotification. |
SubscriptionNotification
A SubscriptionNotification
contains the following fields:
{
"version": string,
"notificationType": int,
"purchaseToken": string,
"subscriptionId": string
}
Property name | Value | Description |
version | string | The version of this notification. Initially, this is "1.0". This version is distinct from other version fields. |
notificationType | int | The notificationType for a subscription can have the following values:
|
purchaseToken | string | The token provided to the user's device when the subscription was purchased. |
subscriptionId | string | The purchased subscription's product ID (for example, "monthly001"). |
Example
Here's an example of a notification for a new subscription purchase:
{
"version":"1.0",
"packageName":"com.some.thing",
"eventTimeMillis":"1503349566168",
"subscriptionNotification":
{
"version":"1.0",
"notificationType":4,
"purchaseToken":"PURCHASE_TOKEN",
"subscriptionId":"monthly001"
}
}
OneTimeProductNotification
A OneTimeProductNotification
contains the following fields:
{
"version": string,
"notificationType": int,
"purchaseToken": string,
"sku": string
}
Property Name | Value | Description |
version | string | The version of this notification. Initially, this will be "1.0". This version is distinct from other version fields. |
notificationType | int | The type of notification. It can have the following values:
|
purchaseToken | string | The token provided to the user’s device when purchase was made. |
sku | string | The purchased one-time product ID (for example, "sword_001") |
Example
Here's an example of a notification for a new one-time purchase:
{
"version":"1.0",
"packageName":"com.some.thing",
"eventTimeMillis":"1503349566168",
"oneTimeProductNotification":
{
"version":"1.0",
"notificationType":1,
"purchaseToken":"PURCHASE_TOKEN",
"sku":"my.sku"
}
}
VoidedPurchaseNotification
A VoidedPurchaseNotification
contains the following fields:
Property Name |
Value |
Description |
|
|
The token associated with the purchase that has been voided. This information is provided to the developer when a new purchase occurs. |
|
|
The unique order ID associated with the transaction that has been voided. For one time purchases, this represents the only order ID generated for the purchase. For auto-renewing subscriptions, a new order ID is generated for each renewal transaction. |
|
|
The
|
|
|
The
Note when the remaining total quantity of a multi-quantity purchase is
refunded, the |
Example
Here's an example of a notification for a new voided purchase:
{
"version":"1.0",
"packageName":"com.some.app",
"eventTimeMillis":"1503349566168",
"voidedPurchaseNotification":
{
"purchaseToken":"PURCHASE_TOKEN",
"orderId":"GS.0000-0000-0000",
"productType":1
"refundType":1
}
}
Consuming VoidedPurchaseNotification
When your RTDN client receives a VoidedPurchaseNotification
, note the
following information:
packageName
: This identifies the app.eventTimeMillis
: This informs the developer of the time the change in status occurred.purchaseToken
: The token provided to the user's device when the product was purchased.orderId
: This identifies the order associated with the voided transaction.productType
: This tells you if the voided purchase was an in-app purchase or a subscription.refundType
: This tells you the type of refund that voided the purchase.
If all you need to do for entitlement adjustments is locate the right purchase and order, then you have all the information you need at this point. To learn how to get additional information about the voided purchase, check out the Google Play Voided Purchases API, which is a pull model that provides additional data for voided purchases between a given timestamp.
For partially voided multi-quantity purchases, the refundableQuantity
field
provided by purchases.products
contains the remaining
number of purchased products that have not been voided.
TestNotification
A TestNotification
contains the following fields:
{
"version": string
}
Property name | Value | Description |
version | string | The version of this notification. Initially, this is "1.0". This version is distinct from other version fields. |
Example
Here's an example of a test notification:
{
"version":"1.0",
"packageName":"com.some.thing",
"eventTimeMillis":"1503350156918",
"testNotification":
{
"version":"1.0"
}
}