Set up future PayPal payments
Learn how to save PayPal details and charge your customers later.
Enable recurring payments support from the Stripe Dashboard
You can request access to the recurring payments directly from the Stripe Dashboard. To do that, go to the Payment Methods Settings page, find PayPal and click Enable next to the Recurring Payments section. You’ll see the pending status. It usually takes up to 5 business days to get access to the recurring payments for PayPal. When access is granted, you’ll see recurring payments on your PayPal settings page. For test mode, recurring payments are enabled by default.
Use Stripe Checkout to collect PayPal payment details in advance, and determine the final amount or payment date later. Use it to:
- Save payment methods to a wallet to streamline future purchases
- Collect surcharges after fulfilling a service
- Start a free trial for a subscription
Set up StripeServer-side
First, you need a Stripe account. Register now.
Use our official libraries for access to the Stripe API from your application:
Create or retrieve a Customer before setupServer-side
To reuse a PayPal payment method for future payments, it must be attached to a Customer.
You should create a Customer object when your customer creates an account on your business. Associating the ID of the Customer object with your own internal representation of a customer will enable you to retrieve and use the stored payment method details later. If your customer hasn’t created an account, you can still create a Customer object now and associate it with your internal representation of the customer’s account later.
Create a Checkout SessionClient-sideServer-side
Before you can accept PayPal payments, your customer must authorise you to use their PayPal account for future payments through Stripe Checkout.
Add a checkout button to your website that calls a server-side endpoint to create a Checkout Session.
<html> <head> <title>Checkout</title> </head> <body> <form action="/create-checkout-session" method="POST"> <button type="submit">Checkout</button> </form> </body> </html>
Create a Checkout Session in setup
mode to collect the required information. After creating the Checkout Session, redirect your customer to the URL returned in the response.
When your customer provides their payment method details, they’re redirected to the success_
, a page on your website that informs them that their payment method was saved successfully. Make the Session ID available on your success page by including the {CHECKOUT_
template variable in the success_
as in the above example.
When your customer clicks on your logo in a Checkout Session without providing their payment method details, Checkout redirects them back to your website by navigating to the cancel_
. This is usually the page on your website that the customer viewed prior to redirecting to Stripe Checkout.
Caution
Don’t rely on the redirect to the success_
alone for detecting payment initiation, as:
- Malicious users could directly access the
success_
without paying and gain access to your goods or services.url - Customers may not always reach the
success_
after a successful payment—they might close their browser tab before the redirect occurs.url
Retrieve the payment methodServer-side
After a customer submits their payment details, retrieve the PaymentMethod object. A PaymentMethod stores the customer’s PayPal account information for future payments. You can retrieve the PaymentMethod synchronously using the success_
or asynchronously using webhooks.
The decision to retrieve the PaymentMethod synchronously or asynchronously depends on your tolerance for dropoff, as customers might not always reach the success_
after a successful payment (for example, it’s possible for them to close their browser tab before the redirect occurs). Using webhooks prevents your integration from experiencing this form of dropoff.
Handle post-setup eventsServer-side
Use a method such as webhooks to confirm the billing agreement was authorised successfully by your customer, instead of relying on your customer to return to the payment status page. When a customer successfully authorises the billing agreement, the SetupIntent emits the setup_intent.succeeded webhook event. If a customer doesn’t successfully authorise the billing agreement, the SetupIntent will emit the setup_intent.setup_failed webhook event and returns to a status of requires_
. When a customer revokes the billing agreement from their PayPal account, the mandate.updated is emitted.
Test the integration
Test your PayPal integration with your test API keys by viewing the redirect page. You can test the successful payment case by authenticating the payment on the redirect page. The PaymentIntent will transition from requires_
to succeeded
.
To test the case where the user fails to authenticate, use your test API keys and view the redirect page. On the redirect page, click Fail test payment. The PaymentIntent will transition from requires_
to requires_
.
Use the payment method for future paymentsServer-side
When you’re ready to charge your customer off-session, use the Customer and PaymentMethod IDs to create a PaymentIntent.
To find a paypal
instrument to charge, list the PaymentMethods associated with your Customer.
When you have the Customer and PaymentMethod IDs, create a PaymentIntent with the amount and currency of the payment. Set a few other parameters to make the off-session payment:
- Set off_session to
true
to indicate that the customer is not in your checkout flow during this payment attempt. This causes the PaymentIntent to throw an error if authentication is required. - Set the value of the PaymentIntent’s confirm property to
true
, which causes confirmation to occur immediately when the PaymentIntent is created. - Set payment_method to the ID of the PaymentMethod and customer to the ID of the Customer.
User-initiated payment method cancellationServer-side
A customer can cancel the subscription (Billing Agreement) through their PayPal account. When they do so, Stripe emits a mandate.updated webhook. All subsequent Payment Intents using the saved Payment Method will fail until you change to a Payment Method with active mandates. When payments fail for Subscriptions, the status changes to the Subscription status configured in your automatic collection settings. Notify the customer of failure and charge them with a different payment method.