Pass additional data to PayPal to further configure your Android integration.
You can include the optional queryParams and scriptParams options in the PayPalComponentConfig to personalise your setup and help PayPal determine which funding sources and buttons to display to your shoppers.
Query parameters help define specific content or actions based on the data being passed, while script parameters allow you to provide information you need for your integration to work, a single-use token, or information you'd like to capture for analytics reasons.
import com.pxp.checkout.components.paypal.types.PayPalQueryParams
queryParams = PayPalQueryParams(
buyerCountry = "US",
debug = false,
integrationDate = "2025-07-01",
merchantId = "ABC123"
)| Parameter | Description |
|---|---|
queryParamsPayPalQueryParams? | Details about the optional query parameters. |
queryParams.buyerCountryString? | The country code for the buyer's country, in ISO-3166-1 alpha-2 format. This determines the eligible funding sources for a given buyer. Any country that you can pass as a locale is a valid buyer country. Defaults to the buyer's IP geolocation.buyerCountry is only used in the sandbox. Don't pass this query parameter in production. |
queryParams.debugBoolean | Whether to use debug mode. Debug mode is recommended only for testing and debugging, because it increases the size of the script and negatively impacts performance. Defaults to false.Always set debug = false for release builds. Debug mode increases script size and impacts performance. |
queryParams.integrationDateString? | The date when your PayPal client ID was created (YYYY-MM-DD). This helps the PayPal script automatically apply any backward-compatible updates introduced after that date. |
queryParams.merchantIdString? | The merchant ID of the merchant for whom you're facilitating a transaction. Use this parameter only for partner, marketplaces, and cart solutions when you are acting on behalf of another merchant to facilitate their PayPal transactions. |
Enable debug mode during development to get detailed logs. You can configure this automatically based on your build type:
val paypalConfig = PayPalComponentConfig(
queryParams = PayPalQueryParams(
debug = BuildConfig.DEBUG // Automatically use debug mode for debug builds
)
)You can filter debug logs in logcat:
# Filter PayPal debug logs
adb logcat | grep -E "(PayPal|PxpCheckout)"Configure query parameters based on your build environment:
val paypalConfig = PayPalComponentConfig(
queryParams = PayPalQueryParams(
debug = BuildConfig.DEBUG,
integrationDate = BuildConfig.PAYPAL_INTEGRATION_DATE,
merchantId = if (BuildConfig.DEBUG) "TEST_MERCHANT_ID" else "PROD_MERCHANT_ID"
)
)Script parameters provide additional context and tokens that PayPal uses to optimise the payment experience, enable advanced features like one-click payments, and ensure secure integration with your Android app.
import com.pxp.checkout.components.paypal.types.PayPalScriptParams
scriptParams = PayPalScriptParams(
cspNonce = "YOUR_CSP_NONCE",
clientToken = "abc123xyz==",
pageType = "checkout",
userIdToken = "YOUR_USER_ID_TOKEN"
)| Parameter | Description |
|---|---|
scriptParamsPayPalScriptParams? | Details about the optional script parameters. |
scriptParams.cspNonceString? | A single-use Content Security Policy (CSP) token, if you use them in your WebView. This is required if your app implements CSP for WebView security. |
scriptParams.clientTokenString? | The client token used to identify your shoppers. |
scriptParams.pageTypeString? | The type of page or screen. Use this to log page type and interactions. Possible values:
|
scriptParams.userIdTokenString? | Your user ID token. Required for one-click payment functionality with vaulting. Obtain this token from the vault status check. |
If your app uses Content Security Policy for WebView security, provide a CSP nonce:
import java.security.SecureRandom
import java.util.Base64
fun generateCSPNonce(): String {
val random = SecureRandom()
val bytes = ByteArray(32)
random.nextBytes(bytes)
return Base64.getEncoder().encodeToString(bytes)
}
val paypalConfig = PayPalComponentConfig(
scriptParams = PayPalScriptParams(
cspNonce = generateCSPNonce()
)
)Use the pageType parameter to track user flow through your app. Set different values for different screens:
@Composable
fun ProductDetailsPayPal() {
val paypalConfig = remember {
PayPalComponentConfig(
scriptParams = PayPalScriptParams(
pageType = "product-details"
)
)
}
// ... component rendering
}
@Composable
fun CheckoutPayPal() {
val paypalConfig = remember {
PayPalComponentConfig(
scriptParams = PayPalScriptParams(
pageType = "checkout"
)
)
}
// ... component rendering
}For one-click payment functionality, you need to provide a userIdToken obtained from the vault status check:
val paypalConfig = PayPalComponentConfig(
enableOneClickPayment = true,
scriptParams = PayPalScriptParams(
userIdToken = getUserIdTokenFromVaultStatus()
)
)To obtain the userIdToken:
import kotlinx.coroutines.launch
suspend fun getUserIdTokenFromVaultStatus(): String? {
return try {
val vaultStatus = checkPayPalVaultStatus(merchantShopperId)
vaultStatus.userIdToken
} catch (e: Exception) {
Log.e("PayPal", "Failed to get vault status", e)
null
}
}Here's a simple example showing how to use query and script parameters:
import com.pxp.checkout.components.paypal.PayPalComponentConfig
import com.pxp.checkout.components.paypal.types.*
val paypalConfig = PayPalComponentConfig(
renderType = "standalone",
fundingSources = "paypal",
queryParams = PayPalQueryParams(
buyerCountry = "US",
debug = false,
integrationDate = "2025-07-01",
merchantId = "ABC123"
),
scriptParams = PayPalScriptParams(
cspNonce = "YOUR_CSP_NONCE",
clientToken = "abc123xyz==",
pageType = "checkout",
userIdToken = "YOUR_USER_ID_TOKEN"
)
)Here's a complete example showing how to configure all parameters in a production Android app:
import com.pxp.checkout.components.paypal.PayPalComponentConfig
import com.pxp.checkout.components.paypal.types.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
@Composable
fun CompletePayPalConfiguration(
viewModel: PaymentViewModel
) {
val context = LocalContext.current
val isDebugBuild = BuildConfig.DEBUG
val paypalConfig = remember {
PayPalComponentConfig(
// Basic configuration
renderType = "standalone",
fundingSources = "paypal",
payeeEmailAddress = "merchant@example.com",
paymentDescription = "Order payment",
shippingPreference = "NoShipping",
userAction = "PayNow",
locale = "en-US",
// Query parameters
queryParams = PayPalQueryParams(
buyerCountry = if (isDebugBuild) "US" else null,
debug = isDebugBuild,
integrationDate = "2025-07-01",
merchantId = viewModel.getMerchantId()
),
// Script parameters
scriptParams = PayPalScriptParams(
cspNonce = generateCSPNonce(),
clientToken = viewModel.getClientToken(),
pageType = "checkout",
userIdToken = viewModel.getUserIdToken()
),
// Enable one-click if user token is available
enableOneClickPayment = viewModel.getUserIdToken() != null,
// Event callbacks
onSuccess = { data -> viewModel.handlePaymentSuccess(data) },
onError = { error -> viewModel.handlePaymentError(error) },
onCancel = { viewModel.handlePaymentCancel() }
)
}
val paypalComponent = remember(paypalConfig) {
pxpCheckout.createComponent(
type = ComponentType.PAYPAL,
config = paypalConfig
)
}
pxpCheckout.buildComponentView(
component = paypalComponent,
modifier = Modifier.fillMaxWidth()
)
}Configure parameters based on your build variant to ensure debug settings don't leak into production:
queryParams = PayPalQueryParams(
debug = BuildConfig.DEBUG,
buyerCountry = if (BuildConfig.DEBUG) "US" else null
)Track user flow by setting the appropriate pageType for each screen:
fun getPageTypeForScreen(screenName: String): String {
return when (screenName) {
"ProductList" -> "product-listing"
"ProductDetail" -> "product-details"
"Cart" -> "cart"
"Checkout" -> "checkout"
else -> "checkout"
}
}Never hardcode tokens or store them insecurely. Always retrieve them from secure storage or your backend:
scriptParams = PayPalScriptParams(
userIdToken = secureStorage.getUserIdToken(), // From secure storage
clientToken = viewModel.fetchClientToken() // From backend
)Add logging to help with debugging during development:
val config = PayPalComponentConfig(
queryParams = PayPalQueryParams(
debug = BuildConfig.DEBUG
),
scriptParams = PayPalScriptParams(
pageType = pageType
)
)
if (BuildConfig.DEBUG) {
Log.d("PayPal", "Config - Debug: ${config.queryParams?.debug}")
Log.d("PayPal", "Config - PageType: ${config.scriptParams?.pageType}")
Log.d("PayPal", "Config - UserIdToken available: ${config.scriptParams?.userIdToken != null}")
}