Skip to main content
The Cashfree Custom Card Component lets you embed a secure, SDK-managed card input field directly into your Android application UI. Because the CFCardNumberView component captures and processes the card number entirely within the SDK, your application never receives the raw card number. This makes the integration suitable for non-PCI merchants, that is, merchants who are not certified to store, process, or transmit raw cardholder data, and who rely on the SDK to handle card data securely on their behalf.
This page covers the custom card component integration only. For the full Android Element integration, including net banking, wallet, and UPI, see Android Integration.

Prerequisites

Complete the following tasks before you start the integration: The integration consists of three steps:

Step 1

Create an order

Step 2

Open the payment page

Step 3

Confirm the payment

Step 1: Create an order Server-side

Create an order from your backend server before you process any payment.
This API requires your secret key. Create orders through your server only — do not call this API directly from your mobile application.
API request for creating an order
Here’s a sample request for creating an order using your desired backend language. Cashfree offers backend SDKs to simplify the integration process.
After successfully creating an order, you will receive a unique order_id and payment_session_id that you need for subsequent steps. You can view the complete API request and response for /orders in the Create Order API.

Step 2: Open the payment page Client-side

After you create the order, set up the card component and open the payment page so the customer can provide their card details.

1. Set up the SDK

The Cashfree Android SDK is available on Maven Central. The latest version is 2.5.0. The SDK requires Android API level 19 or higher. Add the following dependency to your app-level build.gradle file:

2. Complete the payment

To complete the payment, follow these steps:
  1. Add the CFCardNumberView component to your layout XML.
  2. Initialise the card component in your activity or fragment.
  3. Create a CFSession object.
  4. Set up the ICardInfo callback.
  5. Set up the payment callback.
  6. Build the payment object and initiate the payment.

Add the card component to your layout

The CFCardNumberView component extends TextInputLayout, which means all standard TextInputLayout properties and methods apply to it. Add it to your layout XML file as follows:
The following XML attributes are available to customise the card component’s appearance: Because CFCardNumberView extends TextInputLayout, you can also call standard TextInputLayout methods programmatically. The following example shows commonly used methods:

Initialise the card component

Obtain a reference to the CFCardNumberView in your activity or fragment:

Create a session

The CFSession object holds the session context for the payment. It accepts the payment_session_id and order_id obtained from Step 1, and the Cashfree environment (.SANDBOX or .PRODUCTION).

Set up the ICardInfo callback

Call the initialize() method on the CFCardNumberView object after you have created the session. The callback delivers card metadata to your application after each digit the customer enters.
The callback delivers a JSONObject with the following structure:
The cardBinInfo object is only present in the callback after the customer has entered at least 8 digits. Always check that the key exists in the JSONObject before accessing it to avoid a JSONException.
The following log output illustrates how the callback data evolves as the customer enters their card number:

Set up the payment callback

The SDK exposes an interface CFCheckoutResponseCallback to receive callbacks from the SDK once the payment flow ends. This interface consists of two methods:
Register the callback in your activity’s onCreate method. This configuration also handles activity restart cases correctly.
The following example shows how to implement the callback in your activity:

Build the payment object and initiate payment

When the customer fills in their card details and taps the pay button, build the CFCard and CFCardPayment objects and call doPayment() on the CFCardNumberView instance.
You must set .setCfCard(true) on the CFCard builder, and you must not call setCardNumber. Because the SDK manages the card number internally via CFCardNumberView, your application does not have access to the raw card number. Setting .setCfCard(true) tells the SDK to retrieve the card number from the component rather than expecting it from your code. Omitting this field causes the payment to fail. Never calling setCardNumber is what keeps your application out of PCI scope for card data.
Call doPayment() on the cfElementCard object, not on CFCorePaymentGatewayService. This is different from the raw card flow described in the Android Integration page.

Sample code

The following example shows a complete custom card component payment flow, including session creation, card component initialisation, optional theme customisation, and payment initiation.

Sample GitHub code

Step 3: Confirm the payment Server-side

After the SDK delivers a callback via onPaymentVerify, confirm the payment status from your backend before taking any action. The SDK callback signals only that the payment flow has ended. It does not guarantee a successful payment. To verify an order you can call our /pg/orders endpoint from your backend. You can also use our SDK to achieve the same.
Always verify the order status from your backend before you deliver goods or services to the customer. You can use the Get Order API for this. An order is successful when the order_status is PAID.

Error codes

To confirm the error returned in your Android application, you can view the error codes exposed by the SDK.
The SDK validation errors are grouped by category as follows:

Session errors

Card errors

Callback and general errors

Other options

The following optional configurations let you customise the payment screen appearance and enable SDK logging for troubleshooting.
Apply a custom theme to the payment screen to match your application’s visual design. Use the CFTheme builder to set colours for the navigation bar, buttons, and text. Apply the theme to your payment object before you call doPayment().
To enable SDK logging, add the following entry to your values.xml file:
The following logging levels are available, listed from least to most verbose: