# SDK Payment flows

{% hint style="info" %}
If you're complete beginner to Digital Payments, take a look at this [Payments 101 ](https://hyperswitch.io/blogs/payments-101-for-a-developer)blog to get familiar with terminologies.
{% endhint %}

### **Payments flow**

There are multiple stages in a Payment flow depending on the payment methods that are involved. Considering an one-time payment method where there was no redirection involved, the following stages form the Payment flow:

**a) Creating a Payment:** When your customer wants to checkout, create a payment by hitting the payments/create endpoint. Fetch and store the payment\_id and client\_secret

**b) Loading the SDK:** After your customer checks out, load the Hyperswitch SDK by initiating it with the client\_secret and publishable\_key

**c) SDK being rendered:** After you initiate the SDK, the SDK makes several API calls involving the /sessions and /payment\_methods endpoints to load relevant payment methods and any saved cards associated with the customer

**d) Customer enters the payment method data:** After the SDK is fully rendered, your customer would choose a payment method and enter the relevant information and click pay

**e) Confirming the payment:** After the customer clicks pay, the SDK calls the payments/confirm endpoint with the customer's payment method details and post response, it displays the payment status

<figure><img src="/files/BWwJ15mkYFS6ZuwhayXM" alt=""><figcaption></figcaption></figure>

Here's a more detailed version of the payment flow:

{% @mermaid/diagram content="%%{init: {
"theme": "base",
"themeVariables": {
"primaryColor": "#ffffff",
"primaryBorderColor": "#2563EB",
"lineColor": "#2563EB",
"secondaryColor": "#EFF6FF",
"tertiaryColor": "#DBEAFE",
"fontFamily": "Inter, system-ui, sans-serif",
"fontSize": "14px",
"textColor": "#000000",

```
"actorBkg": "#346DDB",
"actorBorder": "#999999",
"actorTextColor": "#ffffff",

"signalColor": "#000000",
"signalTextColor": "#696969",

"labelBoxBkgColor": "#346DDB",
"labelBoxBorderColor": "#2563EB",
"loopTextColor": "#000080"
```

}
}}%%
sequenceDiagram
participant MS as Merchant Server
participant MC as Merchant Client
participant SDK as Hyperswitch SDK
participant HS as Hyperswitch Server
participant PS as Processor Server

```
MS->>HS: payments/create (amount, currency, api_key)
HS-->>MS: payments/create response (payment_id, client_secret)
MS->>MC: pass client_secret, publishable_key
MC->>SDK: initiate SDK (client_secret, publishable_key)
SDK->>HS: /payment_methods_list (client_secret)
HS-->>SDK: /payment_methods_list response (eligible payment methods)
Note over SDK: Display payment sheet with eligible methods
Note over SDK: Customer selects desired payment method <br>(Say Card and Enters their Card Details)
SDK->>HS: payments/confirm (client_secret, payment_method_data)
HS->>PS: payments/confirm to processor (with merchant credentials)
PS-->>HS: payments/confirm response (status)
HS-->>SDK: payments/confirm response (status)
SDK-->>MC: return to return_url with status" %}
```

### **How does Payment flow vary across Payment methods?**

<table data-full-width="false"><thead><tr><th>Customer Action</th><th>Direct/Redirect flows</th><th>Payment- finalized immediately</th><th>Payment- finalized later</th></tr></thead><tbody><tr><td><strong>Customer action required before payments/ confirm</strong></td><td><strong>Within Hyperswitch SDK</strong></td><td><ul><li>Non 3DS Cards</li></ul></td><td><ul><li>Bank Debits like ACH Debit, BACS Debit, SEPA Debit</li></ul></td></tr><tr><td><strong>Customer action required before payments/ confirm</strong></td><td><strong>3rd party Redirect/SDK</strong></td><td><ul><li>Wallets like Apple Pay, Google pay, Paypal, AliPay</li><li>BNPL like Klarna, Afterpay, Affirm</li></ul></td><td><br></td></tr><tr><td><strong>Customer action required after payments/ confirm</strong></td><td><strong>3rd party Redirect</strong></td><td><ul><li>3DS cards</li><li>Bank Redirects like iDeal, Giropay, eps</li></ul></td><td><ul><li>Bank Transfers like ACH Transfer, SEPA Transfer, BACS Transfer, Multibanco</li><li>Crypto wallets like Cryptopay</li></ul></td></tr></tbody></table>

### **Functionalities provided by Hyperswitch**

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-cover data-type="files"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Accept online payments</strong></td><td>Get started with accepting one time payments globally on your online store</td><td></td><td><a href="/files/bCAWLoNxDHOg3QcQxcCX">/files/bCAWLoNxDHOg3QcQxcCX</a></td><td><a href="/pages/FgH8DjTXnf5Th2C7B2hA">/pages/FgH8DjTXnf5Th2C7B2hA</a></td></tr><tr><td><strong>Setup mandates &#x26; recurring payments</strong></td><td>Setup payments for a future date or charge your customers on a recurring basis</td><td></td><td><a href="/files/4TGjQBQxLyKgH9W8txTC">/files/4TGjQBQxLyKgH9W8txTC</a></td><td><a href="/pages/vjpY8TSr0sGJmjWYiifd">/pages/vjpY8TSr0sGJmjWYiifd</a></td></tr><tr><td><strong>Manage payouts</strong></td><td>Facilitate payouts for global network of partners and service providers</td><td></td><td><a href="/files/VBT7SYLnisWYmCYagzp9">/files/VBT7SYLnisWYmCYagzp9</a></td><td><a href="/pages/Aj7TIQDmiomFn5GwFemr">/pages/Aj7TIQDmiomFn5GwFemr</a></td></tr><tr><td><strong>Save a card during payment</strong></td><td>Learn how you can save your customers' cards in a secure PCI compliant manner</td><td></td><td><a href="/files/8LU0asFl64BOjSwrJ8Tl">/files/8LU0asFl64BOjSwrJ8Tl</a></td><td><a href="/pages/xUD3tdwLRlVNcXIxLLia">/pages/xUD3tdwLRlVNcXIxLLia</a></td></tr><tr><td><strong>Manage payments on your platform / marketplace</strong></td><td>Accept payments from your customers and process payouts to the sellers on your marketplace</td><td></td><td><a href="/files/ck7qSNRmkozreP60oZYl">/files/ck7qSNRmkozreP60oZYl</a></td><td><a href="/pages/7IbHrxgL3awnEZxY4x4S">/pages/7IbHrxgL3awnEZxY4x4S</a></td></tr><tr><td><strong>Accept payments on your e-commerce platform</strong></td><td>Give your Wordpress store a lightweight and embedded payment experience with the Hyperswitch WooCommerce plugin</td><td></td><td><a href="/files/m2JKIcMQZUOSicY63lqJ">/files/m2JKIcMQZUOSicY63lqJ</a></td><td><a href="/pages/ywDpx6aO2SB9SWfj7tCk">/pages/ywDpx6aO2SB9SWfj7tCk</a></td></tr><tr><td><strong>Create payment links</strong></td><td>Accept payments for your products through reusable links without writing any code</td><td></td><td><a href="/files/KrF8WgJPBrDY035pM64y">/files/KrF8WgJPBrDY035pM64y</a></td><td><a href="/pages/9AYUf5mZWCiTXihcSYbf">/pages/9AYUf5mZWCiTXihcSYbf</a></td></tr></tbody></table>

### **What are `PaymentIntent` and `PaymentAttempt` objects and how do they work in Hyperswitch?**

Hyperswitch uses the `PaymentIntent` object to track the status of a payment initiated by you. Since, Hyperswitch enables retrying a single payment multiple times across different processors until a successful transaction, we track each of these payment attempts through separate `PaymentAttempt` objects.

While `PaymentIntent` and `PaymentAttempt` have their own state machines, the various states in `PaymentAttempt` are also constrained by their respective mapping to the `PaymentIntent` statuses.

#### **PaymentIntent state machine:**

The following is an abridged version of the `PaymentIntent` state machine flow that covers majority of the above payment use-cases.

{% @mermaid/diagram content="flowchart TD
A{PaymentsAPI} --> |amount,currency|RequiresPaymentMethod
RequiresPaymentMethod -->|payment\_method| RequiresConfirmation
RequiresConfirmation --> |confirm| Processing
Processing --> AuthType{auth type\nselection}
AuthType --> |3ds| RequiresCustomerAction
AuthType --> |no-3ds| CaptureMethod{capture method\nselection}
CaptureMethod --> |manual| RequiresCapture
CaptureMethod --> |automatic| Succeeded
RequiresCustomerAction --> CustomerAction{customer\_action\nresult}
CustomerAction -->|success| CaptureMethod
CustomerAction -->|failure| Failed

RequiresCapture --> |capture|Succeeded" %}

#### **PaymentAttempt state machine:**

The following is an abridged version of the `PaymentAttempt` state machine flow that covers majority of the above payment use-cases.

{% @mermaid/diagram content="flowchart TD

AuthenticationFailed
AuthenticationPending
AuthenticationSuccessful
Authorized
AuthorizationFailed
Charged
Voided
CaptureInitiated
CaptureFailed
Pending
PaymentMethodAwaited
ConfirmationAwaited
DeviceDataCollectionPending

A{PaymentsAPI} --> |amount,currency|PaymentMethodAwaited
PaymentMethodAwaited -->|payment\_method| ConfirmationAwaited
ConfirmationAwaited --> |confirm| Pending

%% Before calling the connector change status to Pending
Pending --> CallConnector{CallConnector}
CallConnector -->|Success| AuthType{auth\_type}
CallConnector -->|Fail| AuthorizationFailed
AuthType --> |no-3ds| CaptureMethod{capture\_method}
AuthType --> |3ds| DeviceDataCollectionPending
DeviceDataCollectionPending --> |CollectDeviceData|AuthenticationPending --> Authenticate{Authenticate}
Authenticate --> |Success| AuthenticationSuccessful --> CaptureMethod{capture method}
Authenticate --> |Failure| AuthenticationFailed

%% Capture
CaptureMethod --> |automatic| Charged
CaptureMethod --> |manual| Authorized

Authorized --> |capture| CaptureInitiated --> Capture{Capture at connector}
Capture -->|Success| Charged
Capture -->|Failed| CaptureFailed

%% Payment can be voided after calling the connector but not charged
%% This will not void the payment at connector
DeviceDataCollectionPending -->|void| Voided
AuthenticationPending -->|void| Voided

%% Voiding a payment after it is Authorized will void at connector
" %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.hyperswitch.io/about-hyperswitch/sdk-payment-flows.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
