Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import com.superwall.sdk.storage.LatestDeviceCustomerInfo
import com.superwall.sdk.storage.Storage
import com.superwall.sdk.storage.StoredTransactionHistory
import com.superwall.sdk.store.abstractions.product.StoreProduct
import com.superwall.sdk.store.abstractions.transactions.GoogleBillingPurchaseTransaction
import com.superwall.sdk.store.coordinator.ProductsFetcher
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch
Expand Down Expand Up @@ -144,7 +145,7 @@ class ReceiptManager(
}

// Collect receipt for original transaction
val txnId = purchase.orderId ?: purchase.purchaseToken
val txnId = GoogleBillingPurchaseTransaction.originalOrderId(purchase.orderId) ?: purchase.purchaseToken
if (!originalTransactionIds.contains(txnId)) {
transactionReceipts.add(
TransactionReceipt(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ data class GoogleBillingPurchaseTransaction(
constructor(transaction: Purchase) : this(
underlyingSK2Transaction = transaction,
transactionDate = Date(transaction.purchaseTime),
originalTransactionIdentifier = transaction.orderId,
originalTransactionIdentifier = originalOrderId(transaction.orderId),
state = StoreTransactionState.Purchased,
storeTransactionId = transaction.orderId,
originalTransactionDate = Date(transaction.purchaseTime),
Expand All @@ -66,4 +66,15 @@ data class GoogleBillingPurchaseTransaction(
purchaseToken = transaction.purchaseToken,
signature = transaction.signature,
)

companion object {
private val RECURRENCE_SUFFIX = Regex("""\.\.\d+$""")

/**
* Returns the original transaction id for a Google Play order id by stripping
* the recurrence suffix that renewals append, e.g.
* `GPA.1234-1234-1234-12345..1` -> `GPA.1234-1234-1234-12345`.
*/
internal fun originalOrderId(orderId: String?): String? = orderId?.replace(RECURRENCE_SUFFIX, "")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
@file:Suppress("ktlint:standard:function-naming")

package com.superwall.sdk.store.abstractions.transactions

import com.superwall.sdk.Given
import com.superwall.sdk.Then
import com.superwall.sdk.When
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Test

class GoogleBillingPurchaseTransactionTest {
@Test
fun `originalOrderId strips the Play recurrence suffix`() {
Given("Google Play order ids with and without recurrence suffixes") {
val baseOrderId = "GPA.1234-1234-1234-12345"

When("deriving the original order id") {
Then("an id without a suffix is unchanged") {
assertEquals(baseOrderId, GoogleBillingPurchaseTransaction.originalOrderId(baseOrderId))
}

Then("a `..0` suffix is stripped") {
assertEquals(baseOrderId, GoogleBillingPurchaseTransaction.originalOrderId("$baseOrderId..0"))
}

Then("a `..1` suffix is stripped") {
assertEquals(baseOrderId, GoogleBillingPurchaseTransaction.originalOrderId("$baseOrderId..1"))
}

Then("a multi-digit `..12` suffix is stripped") {
assertEquals(baseOrderId, GoogleBillingPurchaseTransaction.originalOrderId("$baseOrderId..12"))
}

Then("single dots within the id are not truncated") {
assertEquals(
"GPA.1234-1234-1234-12345",
GoogleBillingPurchaseTransaction.originalOrderId("GPA.1234-1234-1234-12345"),
)
}

Then("a null order id stays null") {
assertNull(GoogleBillingPurchaseTransaction.originalOrderId(null))
}
}
}
}
}
Loading