Google Pay
Client-Side Implementation
The SSL certificates for all Braintree SDKs are set to expire by June 30, 2025. This will impact existing versions of the SDK in published versions of your app. To reduce the impact, upgrade the Android SDK to version 4.45.0+ or version 5.0.0+ for the new SSL certifications.
If you do not decommission your app versions that include the older SDK versions or force upgrade your app with the updated certificates by the expiration date, 100% of your customer traffic will fail.
Get the SDK
Add the following in your app-level build.gradle
:
- Kotlin
- Groovy
dependencies {
implementation("com.braintreepayments.api:google-pay:5.2.0")
}
Initialization
Create a GooglePayLauncher
inside of your Activity's onCreate()
. The GooglePayLauncherCallback
is invoked after the buyer leaves the Google Pay Flow.
Create a GooglePayClient
with a Tokenization Key or Client Token.
Before showing the Google Pay button, use the GooglePayClient.isReadyToPay()
function to check whether the user's current device is compatible. When the result is GooglePayReadinessResult.ReadyToPay
, show the Google Pay button. When the result is not GooglePayReadinessResult.ReadyToPay
, display other checkout options.
- Kotlin
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// GooglePayLauncher must be initialized in onCreate
googlePayLauncher = GooglePayLauncher(this) {
// Handle GooglePayPaymentAuthResult
}
// can initialize the GooglePayClient outside of onCreate if desired
googlePayClient = GooglePayClient(this, "[TOKENIZATION_KEY or CLIENT_TOKEN]")
googlePayClient.isReadyToPay(this) { googlePayReadinessResult ->
if (googlePayReadinessResult is GooglePayReadinessResult.ReadyToPay) {
// show Google Pay button
}
}
}
You will need a button element on your page styled according to Google's brand guidelines.
The CARD
payment method type is supplied by the Braintree Android SDK as an allowed payment method when calling isReadyToPay()
. It also provides the PAYPAL
payment method type if you are using Google Pay v2 and currently accept PayPal payments. If you desire different behavior than isReadyToPay()
, you can follow Google's documentation and make the IsReadyToPayRequest
outside of the Braintree Android SDK.
Requesting a payment
After the user clicks the Google Pay button, create a GooglePayRequest
and call GooglePayClient.createPaymentAuthRequest()
and handle its result. If the result is ReadyToLaunch
, invoke GooglePayLauncher.launch()
to launch the Google Pay flow. If the result is Failure
, handle the error.
- Kotlin
private fun onGooglePayButtonClick() {
val googlePayRequest = GooglePayRequest(
currencyCode = "USD",
totalPrice = "12.34",
totalPriceStatus = GooglePayTotalPriceStatus.TOTAL_PRICE_STATUS_FINAL
)
googlePayClient.createPaymentAuthRequest(googlePayRequest) { googlePayPaymentAuthRequest ->
when (googlePayPaymentAuthRequest) {
is GooglePayPaymentAuthRequest.ReadyToLaunch -> {
googlePayLauncher.launch(googlePayPaymentAuthRequest)
}
is GooglePayPaymentAuthRequest.Failure -> {
// Handle error
}
}
}
}
When the user completes or cancels the Google Pay flow, the GooglePayLauncherCallback
will be invoked. Inside of that callback call GooglePayClient.tokenize()
, passing in the GooglePayPaymentAuthRequest
. Handle the GooglePayResult
returned in the GooglePayTokenizeCallback
.
- Kotlin
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
googlePayLauncher = GooglePayLauncher(this) { googlePayPaymentAuthResult ->
googlePayClient.tokenize(googlePayPaymentAuthResult) { googlePayResult ->
when (googlePayResult) {
is GooglePayResult.Failure -> { /* handle error */ }
is GooglePayResult.Cancel -> { /* handle cancel */ }
is GooglePayResult.Success -> { /* handle nonce */ }
}
}
}
}
Complete Integration
- Kotlin
class MyActivity : AppCompatActivity() {
private lateinit var googlePayLauncher: GooglePayLauncher
private lateinit var googlePayClient: GooglePayClient
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// GooglePayLauncher must be initialized in onCreate
googlePayLauncher = GooglePayLauncher(this) { googlePayPaymentAuthResult ->
googlePayClient.tokenize(googlePayPaymentAuthResult) { googlePayResult ->
when (googlePayResult) {
is GooglePayResult.Failure -> { /* handle error */ }
is GooglePayResult.Cancel -> { /* handle cancel */ }
is GooglePayResult.Success -> { /* handle nonce */ }
}
}
}
// can initialize the GooglePayClient outside of onCreate if desired
googlePayClient = GooglePayClient(this, "[TOKENIZATION_KEY or CLIENT_TOKEN]")
googlePayClient.isReadyToPay(this) { googlePayReadinessResult ->
if (googlePayReadinessResult is GooglePayReadinessResult.ReadyToPay) {
// show Google Pay button
}
}
}
private fun onGooglePayButtonClick() {
val googlePayRequest = GooglePayRequest(
currencyCode = "USD",
totalPrice = "12.34",
totalPriceStatus = GooglePayTotalPriceStatus.TOTAL_PRICE_STATUS_FINAL
)
googlePayClient.createPaymentAuthRequest(googlePayRequest) { googlePayPaymentAuthRequest ->
when (googlePayPaymentAuthRequest) {
is GooglePayPaymentAuthRequest.ReadyToLaunch -> {
googlePayLauncher.launch(googlePayPaymentAuthRequest)
}
is GooglePayPaymentAuthRequest.Failure -> {
// Handle error
}
}
}
}
}