Skip to main content
The Cashfree Subscription Custom Card Component lets you embed a secure, SDK-managed card input field directly into your iOS application UI. The CFSubsCardComponent captures and processes the card number entirely within the SDK. Your application never receives the raw card number. This integration is suitable for non-PCI merchants. A non-PCI merchant is not certified to store, process, or transmit raw cardholder data and relies on the SDK to handle card data securely on their behalf. The component provides auto-formatted card number input (groups of four digits), real-time card network detection with icon display, Luhn validation on every keystroke, and automatic BIN lookup after eight digits. Metadata is delivered through CFSubsCardListener. You receive only digit count, Luhn result, and BIN info, not the raw card number.
This page covers the custom card component integration only. For the full iOS Subscription Element integration, including UPI and eNach (net banking), see iOS Integration.
For merchants with raw card access (PCI-DSS certified), use .setCardNumber() on CFCardSubs.CFCardSubsBuilder() directly instead of CFSubsCardComponent. That path follows the standard subscription card flow.

Prerequisites

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

Step 1

Create a subscription

Step 2

Open the payment page

Step 3

Confirm the payment

Step 1: Create a subscription Server-side

Create a subscription from your backend server before you process any payment.
This API requires your secret key. Create subscriptions through your server only. Do not call this API directly from your mobile application.
After the subscription is created, your backend receives a subscription_id and a subscription_session_id. Pass both values to your iOS client to proceed with the payment.
The following example shows how to create a subscription using the Create Subscription API:
A successful response returns the subscription_id and subscription_session_id. Use these values to build the CFSubscriptionSession object in Step 2. The API returns the following response on success:
For the full list of request parameters and response fields, see the Create Subscription API.

Step 2: Open the payment page Client-side

After you create the subscription, 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 iOS SDK is available via CocoaPods. The integration requires version 2.4.0 or above and iOS 13.0 or higher. Add the following to your Podfile:
Run pod install to install the dependency.

2. Complete the payment

To complete the payment, follow these steps:
  1. Add the CFSubsCardComponent to your view.
  2. Initialise the card component after the session is ready.
  3. Create a CFSubscriptionSession object.
  4. Conform to CFSubsCardListener to receive card metadata.
  5. Set up the payment callback.
  6. Build the payment object and initiate the payment.

Add the card component to your view

CFSubsCardComponent is a UIView that you can add in Interface Builder or programmatically. In Interface Builder, set the custom class of a UIView to CFSubsCardComponent and connect it as an outlet:
Apply standard UIView styling as needed:
The component manages only the card number field. Collect cardholder name, expiry month, expiry year, and CVV in separate input fields in your checkout UI.

Initialise the card component

Call initializeCardComponent only after you have a valid CFSubscriptionSession. The component uses the session to authenticate BIN lookup requests. The following example initialises the component with custom font and text colour:

Create a session

The CFSubscriptionSession object holds the session context for the payment. It accepts the subscription_session_id and subscription_id obtained from Step 1, and the Cashfree environment (.SANDBOX or .PRODUCTION). Set the environment to .SANDBOX for testing or .PRODUCTION for live payments. The following example shows how to create the session object:

Set up the CFSubsCardListener callback

Conform your view controller to CFSubsCardListener and implement cardMetaData(card_listener_response:). This callback fires on every keystroke and again after the BIN lookup completes.
The callback delivers a CFSubsCardListenerResponse with the following top-level fields: The meta_data dictionary contains the following keys:
The card_bin_info object is only present in the callback after the customer has entered at least 8 digits. Always check that the key exists in meta_data before accessing it.
After 8 digits are entered, the component calls the Cashfree BIN API automatically. The response is delivered in meta_data["card_bin_info"] on the next cardMetaData callback. No additional setup is required. Authentication uses the x-sub-session-id from the session provided at initialisation. The card_bin_info dictionary returned from the BIN lookup API contains the following fields: The component auto-detects the following card networks and displays the corresponding icon: Visa, Mastercard, American Express (Amex), RuPay, Diners Club, Discover, and JCB. The following example illustrates how callback data evolves as the customer enters their card number:

Set up the payment callback

The SDK exposes the CFResponseDelegate protocol to receive callbacks when the subscription payment journey ends. This protocol consists of two methods:
Register the callback on CFPaymentGatewayService before you call doSubsPayment. Set paymentService.setCallback(self) in your view controller before initiating payment.
The following example shows how to implement the callback:
Backend verification is mandatory. The SDK signals that the payment UI flow ended, not that payment succeeded. Always verify payment status from your backend before presenting success.

Build the payment object and initiate payment

When the customer fills in their card details and taps the pay button, build the CFCardSubs and CFCardSubsPayment objects and call doSubsPayment() on CFPaymentGatewayService.
You must call .setCardComponent(cfCardComponent) on the CFCardSubs builder. Because the SDK manages the card number internally via CFSubsCardComponent, your application does not have access to the raw card number. .setCardComponent() and .setCardNumber() are mutually exclusive. Never call both. Omitting .setCardComponent() or calling .setCardNumber() alongside it causes the payment to fail.
The CFCardSubs.CFCardSubsBuilder() supports the following methods:
There is no public API to read the card number out of CFSubsCardComponent. The SDK uses it securely when doSubsPayment is called.

Sample code

The following example shows a complete custom card component payment flow, including session creation, card component initialisation, metadata handling, and payment initiation.
The following example demonstrates a complete non-PCI card payment integration using CFSubsCardComponent:
For a working end-to-end implementation, refer to the sample integration on GitHub.

Step 3: Confirm the payment Server-side

After the SDK delivers a callback via verifyPayment, 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. Use the Fetch Details of All Payments of a Subscription API to retrieve the current payment status.
The following request fetches all payments for a subscription:
A successful response returns an array of payment objects. Check the payment_status field to determine the outcome. The API returns the following response on success:
Always verify the subscription status from your backend before delivering goods or services to the customer. Proceed only when payment_status is SUCCESS.

Error codes

If a required field or object is missing when you initiate payment, the SDK returns an error through the catch block or onError callback. The following table lists common SDK-level validation errors and when they occur.
The SDK validation errors are grouped by category as follows:

Session errors

These errors occur when the CFSubscriptionSession object or its required fields are not provided.

Payment method object errors

These errors occur when a payment method object is absent or one of its required fields is not set.

Callback errors

These errors occur when the payment callback is not registered before initiating payment.

Other options

The following optional configurations let you customise the payment screen behaviour.
To present the payment flow in full screen, call setFullScreen(true) on the payment object before you call doSubsPayment():