PayPal

Vaultanchor

Vaulting a PayPal account will allow you to charge the account in the future without requiring your customer to be present during the transaction or re-authenticate with PayPal when they are present during the transaction.

Vaulting creates a PayPal pre-approved payment between you and the customer, displayed in the customer's account profile on PayPal.com.

The vaulted payment flow supports the following features:

  • Select or add shipping addresses in the PayPal account
  • Select or add funding instruments in the PayPal account
  • Two factor authentication support (currently only for US, UK, CA, DE, AT, and AU)

pwpp_android_screens

Typical use cases for the vaulted payment flow:

  • Faster payments for repeat customers
  • Subscriptions
  • Recurring billing (e.g. automatic top-up or usage based charges)

Setupanchor

Get the SDKanchor

Add the following in your app-level build.gradle:

  1. Groovy
dependencies {
  implementation 'com.braintreepayments.api:paypal:4.39.0'
}

Invoking the Vault flowanchor

First, make sure you have defined your URL scheme. Next, create a BraintreeClient with a ClientTokenProvider or Tokenization Key. Construct a PayPalClient and implement a PayPalListener to receive results. Call PayPalClient#tokenizePayPalAccount to launch the PayPal flow. An example integration might look like this:

  1. Java
  2. Kotlin
public class MyActivity extends AppCompatActivity implements PayPalListener {

  private BraintreeClient braintreeClient;
  private PayPalClient payPalClient;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    braintreeClient = new BraintreeClient(this, new ExampleClientTokenProvider());
    payPalClient = new PayPalClient(this, braintreeClient);
    dataCollector = new DataCollector(braintreeClient);
    payPalClient.setListener(this);
  }

  private void myTokenizePayPalAccountWithVaultMethod() {
    PayPalVaultRequest request = new PayPalVaultRequest();
    request.setBillingAgreementDescription("Your agreement description");

    payPalClient.tokenizePayPalAccount(this, request)
  }

  @Override
  public void onPayPalSuccess(@NonNull PayPalAccountNonce payPalAccountNonce) {
      // send payPalAccountNonce.getString() to server
  }

  @Override
  public void onPayPalFailure(@NonNull Exception error) {
    if (error instanceof UserCanceledException) {
      // user canceled
    } else {
      // handle error
    }
  }
}

If you are using using an Activity and your Activity's launch mode is singleTop, singleTask, or singleInstance you will also need to override onNewIntent:

  1. Java
  2. Kotlin
public class MyActivity extends AppCompatActivity {

  @Override
  protected void onNewIntent(Intent newIntent) {
    super.onNewIntent(newIntent);

    setIntent(newIntent);
  }
}

When you receive a result via onPayPalSuccess, you can query the PayPalAccountNonce result for specific customer information.

Collecting device dataanchor

Collecting device data from your customers is required when initiating non-recurring transactions from Vault records. Collecting and passing this data with transactions will help reduce decline rates.

DataCollector enables you to collect data about a customer's device and correlate it with a session identifier on your server.

Shipping addressanchor

Shipping addresses may or may not be collected during the PayPal Vault flow. However, if you choose to collect shipping addresses yourself, it can be passed along with the server side Transaction.Sale call. Look at the Server-side page for more information.

Country and language supportanchor

PayPal is available to merchants in all countries that we support and to customers in 140+ countries.

Currency presentmentanchor

In the Vault flow itself, the transaction currency and amount are not displayed to the customer. It is up to you to display these details in your checkout flow somewhere (e.g. cart page, order review page, etc.). Our Server-Side guide outlines which currencies are supported for PayPal transactions.


Next Page: Server-side