Welcome to Xendit’s latest documentation. For legacy content, access the previous version here.

Store payment details

Prev Next

Payment Sessions allow you to securely store your users' payment channels for future transactions. This feature ensures regulatory compliance and simplifies the integration process. Once a payment channel is stored, it can be used for subsequent transactions initiated by either your system or directly by the end-user within your application.

How to integrate

  1. During the end user's registration or via a menu option where users can store their payment channels, your system should Create a Payment Session with Xendit using the example payload provided below.

    Request - POST /sessions

    {
        "reference_id": "{{$randomUUID}}",
        "session_type": "SAVE",
        "mode": "PAYMENT_LINK",
        "amount": 0,
        "currency": "IDR",
        "country": "ID",
        "customer": {
            "reference_id": "{{$randomUUID}}",
            "type": "INDIVIDUAL",
            "email": "test@yourdomain.com",
            "mobile_number": "+6212345678",
            "individual_detail": {
                "given_names": "Lorem",
                "surname": "Ipsum"
            }
        },
        "channel_properties": {
            "cards":{
                "card_on_file_type":"RECURRING"
            }
        },
        "success_return_url":"https://yourcompany.com/example_item=my_example_item",
        "cancel_return_url":"https://yourcompany.com/example_item=my_example_item"
    }

    Response - POST /sessions

    {
        "payment_session_id": "ps-67527107dda8b2513acdaef0",
        "created": "2024-12-06T03:35:36.032Z",
        "updated": "2024-12-06T03:35:36.032Z",
        "status": "ACTIVE",
        "reference_id": "b767f88f-b5bc-4836-9c47-c14261909dec",
        "currency": "IDR",
        "amount": 0,
        "country": "ID",
        "customer_id": "cust-fe8743c3-f554-4d25-a0e9-9980226c4b1b",
        "expires_at": "2024-12-06T04:05:35.049Z",
        "session_type": "SAVE",
        "mode": "PAYMENT_LINK",
        "locale": "en",
        "business_id": "62440e322008e87fb29c1fd0",
        "channel_properties": {
            "cards":{
                "card_on_file_type":"RECURRING"
            }
        },
        "success_return_url": "https://yourcompany.com/example_item=my_example_item",
        "cancel_return_url": "https://yourcompany.com/example_item=my_example_item",
        "payment_link_url": "https://dev.xen.to/qZx5RD_7"
    }
    1. For Cards, it's recommended to specify channel_properties.cards.card_on_file_type during Payment Session creation. This field indicates the intended use of the payment token for subsequent transactions—whether RECURRING, MERCHANT_UNSCHEDULED, or CUSTOMER_UNSCHEDULED. Properly setting this value can significantly improve transaction success rates.

  2. Once the Payment Session is created, redirect your end user to the Xendit-hosted page using the payment_link_url from the response.

  3. Your end user will complete their linking process on Xendit-hosted page

  4. Upon successful linking, Xendit will send a payment_session.completed webhook to your system. This webhook contains the payment_token_id, which you should securely store for future use.

    You can use the payment_token_id for: