Accept an Affirm payment (2024)

Caution

Stripe automatically presents your customers payment method options by evaluating their currency, payment method restrictions, and other parameters. We recommend that you configure your payment methods from the Stripe Dashboard using the instructions in Accept a payment.

If you want to continue manually configuring the payment methods you present to your customers with Checkout, use this guide (for example, to accept payments in Subscription mode). Otherwise, migrate to the dashboard.

Affirm is a single use, immediate notification payment method that requires customers to authenticate their payment. Customers are redirected to the Affirm site, where they agree to the terms of an installment plan. When the customer accepts the terms, funds are guaranteed and transferred to your Stripe account. The customer repays Affirm directly over time.

Note

Before you start the integration, make sure your account is eligible for Affirm by navigating to your Payment methods settings.

Determine compatibility

A Checkout Session must satisfy all of the following conditions to support Affirm payments:

  • You can only use one-time line items. Affirm doesn’t support recurring subscription plans.
  • Express all Prices in your domestic currency.
Accept a payment

Use this guide to learn how to enable Affirm—it shows the differences between accepting a card payment and using Affirm.

Enable Affirm as a payment methodAccept an Affirm payment (3)

When creating a new Checkout Session, you need to:

  1. Add affirm to the list of payment_method_types.
  2. Make sure all your line_items use your domestic currency.
  3. We recommend collecting shipping addresses by adding your country to shipping_address_collection[allowed_countries]. If you don’t want to collect shipping addresses with Checkout, you can also provide the shipping address using payment_intent_data[shipping]. Doing so helps with loan acceptance rates.

Stripe::Checkout::Session.create({ mode: 'payment', payment_method_types: ['card'], payment_method_types: ['card', 'affirm'], line_items: [{ price_data: { currency: 'usd', product_data: { name: 'T-shirt', }, # Make sure the total amount fits within Affirm's transaction amount limits unit_amount: 5000, }, quantity: 1, }], shipping_address_collection: { # Shipping address is optional but recommended to pass in # Specify which shipping countries Checkout should provide as options for shipping locations allowed_countries: ['CA', 'US'], }, # If you already have the shipping address, provide it in payment_intent_data: # payment_intent_data: { # shipping: { # name: 'Jenny Rosen', # address: { # line1: '1234 Main Street', # city: 'San Francisco', # state: 'CA', # country: 'US', # postal_code: '94111', # }, # }, # }, success_url: 'https://example.com/success', cancel_url: 'https://example.com/cancel', })

Fulfill your ordersAccept an Affirm payment (4)

Use a method such as webhooks to handle order fulfillment, instead of relying on your customer to return to the payment status page.

The following events are sent when the payment status changes:

Event NameDescriptionNext steps
checkout.session.completedThe customer successfully authorized the payment by submitting the Checkout form.Wait for the payment to succeed or fail.
payment_intent.succeededThe customer’s payment succeeded. The PaymentIntent transitions to succeeded.Fulfill the goods or services that the customer purchased.
payment_intent.payment_failedThe customer’s payment was declined, or failed for some other reason. The PaymentIntent returns to the requires_payment_method status.Email the customer to request that they place a new order.

Learn more about fulfilling orders.

Test your integration

When testing your Checkout integration, select Affirm as the payment method and click the Pay button.

Test your Affirm 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 transitions from requires_action 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, close the Affirm modal window and verify that payment failed. The PaymentIntent transitions from requires_action to requires_payment_method.

For manual capture PaymentIntents in testmode, the uncaptured PaymentIntent auto-expires 10 minutes after successful authorization.

Failed payments

Affirm takes into account multiple factors when deciding to accept or decline a transaction (for example, the length of time buyer has used Affirm, the outstanding amount the customer has to repay, and the value of the current order).

Always present additional payment options such as card in your checkout flow, as Affirm payments have a higher rate of decline than many payment methods. In these cases, the PaymentMethod is detached and the PaymentIntent object’s status automatically transitions to requires_payment_method.

Other than a payment being declined, for an Affirm PaymentIntent with a status of requires_action, customers need to complete the payment within 12 hours after you redirect them to the Affirm site. If the customer takes no action within 12 hours, the PaymentMethod is detached and the PaymentIntent object’s status automatically transitions to requires_payment_method.

In these cases, inform your customer to try again with a different payment option presented in your checkout flow.

Error codes

These are the common error codes and corresponding recommended actions:

Error codeRecommended action
invalid_amount_too_smallEnter an amount within Affirm’s default transaction limits, for the country.
invalid_amount_too_largeEnter an amount within Affirm’s default transaction limits, for the country.
missing_required_parameterCheck the error message for more information on the required parameter.
nonexistent_countryEnter a valid two-letter ISO country code for the country property in the shipping and billing details.
payment_intent_invalid_currencyEnter the appropriate currency. Affirm only supports payments in your local currency.
payment_intent_redirect_confirmation_without_return_urlProvide a return_url when confirming a PaymentIntent with Affirm.
payment_method_invalid_parameterCheck the error message for more information on the parameter.
Accept an Affirm payment (2024)
Top Articles
Latest Posts
Article information

Author: Horacio Brakus JD

Last Updated:

Views: 5948

Rating: 4 / 5 (71 voted)

Reviews: 94% of readers found this page helpful

Author information

Name: Horacio Brakus JD

Birthday: 1999-08-21

Address: Apt. 524 43384 Minnie Prairie, South Edda, MA 62804

Phone: +5931039998219

Job: Sales Strategist

Hobby: Sculling, Kitesurfing, Orienteering, Painting, Computer programming, Creative writing, Scuba diving

Introduction: My name is Horacio Brakus JD, I am a lively, splendid, jolly, vivacious, vast, cheerful, agreeable person who loves writing and wants to share my knowledge and understanding with you.