Skip to content
Merged
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
2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 10 additions & 5 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,17 @@

## Unreleased

* Add overloaded functions with callbacks for `start` and `vault` methods in
`PayPalWebCheckoutClient`
* Modify `PayPalWebCheckoutRequest` to include `appSwitchWhenEligible` property to control app
* Adds new property `appSwitchWhenEligible`in `PayPalWebCheckoutRequest` to include to control app
switch behavior
* Breaking Changes
* Make start and vault functions in `PayPalWebCheckoutClient` suspend functions
* Adds new property `appSwitchWhenEligible`in `PayPalWebVaultRequest` to include to control app
switch behavior
* Adds new property `appLinkUrl` in `PayPalWebCheckoutRequest` to specify app link url that will be
used to recognize app after approving order
* Adds new property `appLinkUrl` in `PayPalWebVaultRequest` to specify app link url that will be
used to recognize app after vaulting
* Deprecates `urlScheme` property in `PayPalWebCheckoutClient`
* Adds new functions `startAsync` and `vaultAsync` in `PayPalWebCheckoutClient` to support Kotlin
coroutines

## 2.3.0 (2025-11-03)
* PayPalWebPayments
Expand Down
38 changes: 0 additions & 38 deletions CorePayments/api/CorePayments.api
Original file line number Diff line number Diff line change
Expand Up @@ -112,18 +112,6 @@ public final class com/paypal/android/corepayments/UpdateClientConfigAPI$Default
public static final field USER_EXPERIENCE_FLOW Ljava/lang/String;
}

public final class com/paypal/android/corepayments/UpdateClientConfigResponse {
public static final field Companion Lcom/paypal/android/corepayments/UpdateClientConfigResponse$Companion;
public fun <init> (Ljava/lang/String;)V
public final fun component1 ()Ljava/lang/String;
public final fun copy (Ljava/lang/String;)Lcom/paypal/android/corepayments/UpdateClientConfigResponse;
public static synthetic fun copy$default (Lcom/paypal/android/corepayments/UpdateClientConfigResponse;Ljava/lang/String;ILjava/lang/Object;)Lcom/paypal/android/corepayments/UpdateClientConfigResponse;
public fun equals (Ljava/lang/Object;)Z
public final fun getUpdateClientConfig ()Ljava/lang/String;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public final class com/paypal/android/corepayments/UpdateClientConfigResponse$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
public static final field INSTANCE Lcom/paypal/android/corepayments/UpdateClientConfigResponse$$serializer;
public fun childSerializers ()[Lkotlinx/serialization/KSerializer;
Expand All @@ -139,9 +127,6 @@ public final class com/paypal/android/corepayments/UpdateClientConfigResponse$Co
public final fun serializer ()Lkotlinx/serialization/KSerializer;
}

public abstract class com/paypal/android/corepayments/UpdateClientConfigResult {
}

public final class com/paypal/android/corepayments/UpdateClientConfigResult$Failure : com/paypal/android/corepayments/UpdateClientConfigResult {
public fun <init> (Lcom/paypal/android/corepayments/PayPalSDKError;)V
public final fun component1 ()Lcom/paypal/android/corepayments/PayPalSDKError;
Expand All @@ -160,29 +145,6 @@ public final class com/paypal/android/corepayments/UpdateClientConfigResult$Succ
public fun toString ()Ljava/lang/String;
}

public final class com/paypal/android/corepayments/UpdateClientConfigVariables {
public static final field Companion Lcom/paypal/android/corepayments/UpdateClientConfigVariables$Companion;
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Ljava/lang/String;
public final fun component2 ()Ljava/lang/String;
public final fun component3 ()Ljava/lang/String;
public final fun component4 ()Ljava/lang/String;
public final fun component5 ()Ljava/lang/String;
public final fun component6 ()Ljava/lang/String;
public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/paypal/android/corepayments/UpdateClientConfigVariables;
public static synthetic fun copy$default (Lcom/paypal/android/corepayments/UpdateClientConfigVariables;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/paypal/android/corepayments/UpdateClientConfigVariables;
public fun equals (Ljava/lang/Object;)Z
public final fun getButtonSessionId ()Ljava/lang/String;
public final fun getFundingSource ()Ljava/lang/String;
public final fun getIntegrationArtifact ()Ljava/lang/String;
public final fun getProductFlow ()Ljava/lang/String;
public final fun getToken ()Ljava/lang/String;
public final fun getUserExperienceFlow ()Ljava/lang/String;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public final class com/paypal/android/corepayments/UpdateClientConfigVariables$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
public static final field INSTANCE Lcom/paypal/android/corepayments/UpdateClientConfigVariables$$serializer;
public fun childSerializers ()[Lkotlinx/serialization/KSerializer;
Expand Down
11 changes: 11 additions & 0 deletions Demo/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,17 @@
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />

<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

<data
android:host="ppcp-mobile-demo-sandbox-87bbd7f0a27f.herokuapp.com"
android:pathPrefix="/"
android:scheme="https" />
</intent-filter>
</activity>
</application>

Expand Down
12 changes: 6 additions & 6 deletions Demo/src/main/java/com/paypal/android/DemoConstants.kt
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.paypal.android

object DemoConstants {
const val APP_URL = "com.paypal.android.demo://"
const val SUCCESS_URL = "${APP_URL}success"
const val CANCEL_URL = "${APP_URL}cancel"
const val VAULT_SUCCESS_URL = "${APP_URL}vault/success"
const val VAULT_CANCEL_URL = "${APP_URL}vault/cancel"
const val RETURN_URL = "${APP_URL}example.com/returnUrl"
const val APP_URL = "https://ppcp-mobile-demo-sandbox-87bbd7f0a27f.herokuapp.com"
const val APP_FALLBACK_URL_SCHEME = "com.paypal.android.demo"
const val SUCCESS_URL = "$APP_URL/success"
const val CANCEL_URL = "$APP_URL/cancel"
const val VAULT_SUCCESS_URL = "$APP_URL/vault/success"
const val VAULT_CANCEL_URL = "$APP_URL/vault/cancel"
}
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ class ApproveOrderViewModel @Inject constructor(
expirationYear = dateString.formattedYear,
securityCode = cardSecurityCode
)
CardRequest(orderId, card, DemoConstants.RETURN_URL, scaOption)
CardRequest(orderId, card, DemoConstants.APP_URL, scaOption)
}

private var createOrderState
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import android.util.Log
import androidx.activity.ComponentActivity
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.paypal.android.DemoConstants.APP_FALLBACK_URL_SCHEME
import com.paypal.android.DemoConstants.APP_URL
import com.paypal.android.api.model.Order
import com.paypal.android.api.model.OrderIntent
import com.paypal.android.api.services.SDKSampleServerAPI
Expand Down Expand Up @@ -43,7 +45,7 @@ class PayPalCheckoutViewModel @Inject constructor(
private val coreConfig = CoreConfig(SDKSampleServerAPI.clientId)
private val payPalDataCollector = PayPalDataCollector(coreConfig)
private val paypalClient =
PayPalWebCheckoutClient(applicationContext, coreConfig, "com.paypal.android.demo")
PayPalWebCheckoutClient(applicationContext, coreConfig)

private val _uiState = MutableStateFlow(PayPalUiState())
val uiState = _uiState.asStateFlow()
Expand Down Expand Up @@ -106,26 +108,32 @@ class PayPalCheckoutViewModel @Inject constructor(
if (orderId == null) {
payPalWebCheckoutState = ActionState.Failure(Exception("Create an order to continue."))
} else {
viewModelScope.launch {
startCheckoutWithOrderId(activity, orderId)
}
startCheckoutWithOrderId(activity, orderId)
}
}

private suspend fun startCheckoutWithOrderId(activity: ComponentActivity, orderId: String) {
private fun startCheckoutWithOrderId(activity: ComponentActivity, orderId: String) {
payPalWebCheckoutState = ActionState.Loading

val checkoutRequest =
PayPalWebCheckoutRequest(orderId, fundingSource, appSwitchWhenEligible)
when (val startResult = paypalClient.start(activity, checkoutRequest)) {
is PayPalPresentAuthChallengeResult.Success -> {
// do nothing; wait for user to authenticate PayPal checkout in Chrome Custom Tab
}

is PayPalPresentAuthChallengeResult.Failure ->
payPalWebCheckoutState = ActionState.Failure(startResult.error)
val checkoutRequest = PayPalWebCheckoutRequest(
orderId,
fundingSource,
appSwitchWhenEligible,
APP_URL,
APP_FALLBACK_URL_SCHEME
)

paypalClient.start(activity, checkoutRequest) { startResult ->
when (startResult) {
is PayPalPresentAuthChallengeResult.Success -> {
// do nothing; wait for user to authenticate PayPal checkout in Chrome Custom Tab
}

is PayPalPresentAuthChallengeResult.Failure ->
payPalWebCheckoutState = ActionState.Failure(startResult.error)
}
}
}

fun completeOrder(context: Context) {
val orderId = createdOrder?.id
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import android.content.Intent
import androidx.activity.ComponentActivity
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.paypal.android.DemoConstants.APP_FALLBACK_URL_SCHEME
import com.paypal.android.DemoConstants.APP_URL
import com.paypal.android.api.model.PayPalSetupToken
import com.paypal.android.api.services.SDKSampleServerAPI
import com.paypal.android.corepayments.CoreConfig
Expand All @@ -29,13 +31,8 @@ class PayPalVaultViewModel @Inject constructor(
val createPayPalSetupTokenUseCase: CreatePayPalSetupTokenUseCase,
val createPayPalPaymentTokenUseCase: CreatePayPalPaymentTokenUseCase,
) : ViewModel() {

companion object {
const val URL_SCHEME = "com.paypal.android.demo"
}

private val coreConfig = CoreConfig(SDKSampleServerAPI.clientId)
private val paypalClient = PayPalWebCheckoutClient(applicationContext, coreConfig, URL_SCHEME)
private val paypalClient = PayPalWebCheckoutClient(applicationContext, coreConfig)

private val _uiState = MutableStateFlow(PayPalVaultUiState())
val uiState = _uiState.asStateFlow()
Expand Down Expand Up @@ -83,7 +80,9 @@ class PayPalVaultViewModel @Inject constructor(
viewModelScope.launch {
val request = PayPalWebVaultRequest(
setupTokenId,
appSwitchWhenEligible
appSwitchWhenEligible,
APP_URL,
APP_FALLBACK_URL_SCHEME
)
vaultSetupTokenWithRequest(activity, request)
}
Expand All @@ -96,8 +95,8 @@ class PayPalVaultViewModel @Inject constructor(
) {
vaultPayPalState = ActionState.Loading

viewModelScope.launch {
when (val result = paypalClient.vault(activity, request)) {
paypalClient.vault(activity, request) { result ->
when (result) {
is PayPalPresentAuthChallengeResult.Success -> {
// do nothing; wait for user to authenticate PayPal vault in Chrome Custom Tab
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import android.content.Intent
import androidx.activity.ComponentActivity
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.paypal.android.DemoConstants
import com.paypal.android.DemoConstants.APP_URL
import com.paypal.android.api.model.CardSetupToken
import com.paypal.android.api.services.SDKSampleServerAPI
import com.paypal.android.cardpayments.Card
Expand Down Expand Up @@ -123,8 +123,7 @@ class VaultCardViewModel @Inject constructor(
private fun updateSetupTokenWithId(activity: ComponentActivity, setupTokenId: String) {
updateSetupTokenState = ActionState.Loading
val card = parseCard(_uiState.value)
val returnUrl = DemoConstants.RETURN_URL
val cardVaultRequest = CardVaultRequest(setupTokenId, card, returnUrl)
val cardVaultRequest = CardVaultRequest(setupTokenId, card, APP_URL)
cardClient.vault(cardVaultRequest) { result ->
when (result) {
is CardVaultResult.Success -> {
Expand Down
Loading
Loading