← Back to Main Menu

Card Tokens

Please enter a payer reference and click "Load Tokens" or press Enter to view tokens

💳 Pay with Selected Token

Enter amount in minor units (e.g., 2000 for £20.00)
Your unique reference for this payment
Your identifier for the order
Text to appear on payer's bank statement (max 22 characters)

🔧 KodyPay SDK Usage - Token Management

SDK Information

Service: KodyEcomPaymentsService

Methods: GetCardTokens(), DeleteCardToken(), PayWithCardToken()

Requests: GetCardTokensRequest, DeleteCardTokenRequest, PayWithCardTokenRequest

Responses: GetCardTokensResponse, DeleteCardTokenResponse, PaymentDetailsResponse

📋 Get Card Tokens - SDK Examples

<?php
require __DIR__ . '/../vendor/autoload.php';

use Com\Kodypay\Grpc\Ecom\V1\KodyEcomPaymentsServiceClient;
use Com\Kodypay\Grpc\Ecom\V1\GetCardTokensRequest;
use Grpc\ChannelCredentials;

// Configuration
$HOSTNAME = "grpc-staging.kodypay.com";
$API_KEY = "your-api-key";

// Step 1: Initialize SDK client with SSL credentials
$client = new KodyEcomPaymentsServiceClient($HOSTNAME, [
    'credentials' => ChannelCredentials::createSsl()
]);

// Step 2: Set authentication headers with your API key
$metadata = ['X-API-Key' => [$API_KEY]];

// Step 3: Create GetCardTokensRequest and set required fields
$request = new GetCardTokensRequest();
$request->setStoreId('your-store-id');
$request->setPayerReference('user123'); // The payer for whom to list tokens

// Step 4: Call GetCardTokens() method and wait for response
list($response, $status) = $client->GetCardTokens($request, $metadata)->wait();

// Step 5: Handle gRPC response status
if ($status->code !== \Grpc\STATUS_OK) {
    echo "Error: " . $status->details . PHP_EOL;
    exit;
}

// Step 6: Process response
if ($response->hasResponse()) {
    $responseData = $response->getResponse();
    $tokens = $responseData->getTokens();

    echo "Found " . count($tokens) . " tokens:" . PHP_EOL;
    foreach ($tokens as $token) {
        echo "Token ID: " . $token->getTokenId() . PHP_EOL;
        echo "Payment Token: " . $token->getPaymentToken() . PHP_EOL;
        echo "Status: " . $token->getStatus() . PHP_EOL;
        echo "Card: " . $token->getPaymentMethod() . " **** " . $token->getCardLast4Digits() . PHP_EOL;
        echo "---" . PHP_EOL;
    }
} else if ($response->hasError()) {
    $error = $response->getError();
    echo "API Error: " . $error->getMessage() . PHP_EOL;
}
?>
import com.kodypay.grpc.ecom.v1.KodyEcomPaymentsServiceGrpc;
import com.kodypay.grpc.ecom.v1.GetCardTokensRequest;
import com.kodypay.grpc.ecom.v1.GetCardTokensResponse;
import io.grpc.ManagedChannelBuilder;
import io.grpc.Metadata;
import io.grpc.stub.MetadataUtils;

public class GetCardTokensExample {
    public static final String HOSTNAME = "grpc-staging.kodypay.com";
    public static final String API_KEY = "your-api-key";

    public static void main(String[] args) {
        // Step 1: Create metadata with API key
        Metadata metadata = new Metadata();
        metadata.put(Metadata.Key.of("X-API-Key", Metadata.ASCII_STRING_MARSHALLER), API_KEY);

        // Step 2: Build secure channel and create client
        var channel = ManagedChannelBuilder.forAddress(HOSTNAME, 443)
            .useTransportSecurity()
            .build();
        var client = KodyEcomPaymentsServiceGrpc.newBlockingStub(channel)
            .withInterceptors(MetadataUtils.newAttachHeadersInterceptor(metadata));

        // Step 3: Create GetCardTokensRequest and set required fields
        GetCardTokensRequest request = GetCardTokensRequest.newBuilder()
            .setStoreId("your-store-id")
            .setPayerReference("user123") // The payer for whom to list tokens
            .build();

        // Step 4: Call GetCardTokens() method and get response
        GetCardTokensResponse response = client.getCardTokens(request);

        // Step 5: Process response
        if (response.hasResponse()) {
            var responseData = response.getResponse();
            System.out.println("Found " + responseData.getTokensCount() + " tokens:");

            responseData.getTokensList().forEach(token -> {
                System.out.println("Token ID: " + token.getTokenId());
                System.out.println("Payment Token: " + token.getPaymentToken());
                System.out.println("Status: " + token.getStatus());
                System.out.println("Card: " + token.getPaymentMethod() + " **** " + token.getCardLast4Digits());
                System.out.println("---");
            });
        } else if (response.hasError()) {
            var error = response.getError();
            System.out.println("API Error: " + error.getMessage());
        }
    }
}
import grpc
import kody_clientsdk_python.ecom.v1.ecom_pb2 as kody_model
import kody_clientsdk_python.ecom.v1.ecom_pb2_grpc as kody_client

def get_card_tokens():
    # Configuration
    HOSTNAME = "grpc-staging.kodypay.com:443"
    API_KEY = "your-api-key"

    # Step 1: Create secure channel
    channel = grpc.secure_channel(HOSTNAME, grpc.ssl_channel_credentials())

    # Step 2: Create client and set metadata with API key
    client = kody_client.KodyEcomPaymentsServiceStub(channel)
    metadata = [("x-api-key", API_KEY)]

    # Step 3: Create GetCardTokensRequest and set required fields
    request = kody_model.GetCardTokensRequest(
        store_id="your-store-id",
        payer_reference="user123"  # The payer for whom to list tokens
    )

    # Step 4: Call GetCardTokens() method and get response
    response = client.GetCardTokens(request, metadata=metadata)

    # Step 5: Process response
    if response.HasField("response"):
        response_data = response.response
        print(f"Found {len(response_data.tokens)} tokens:")

        for token in response_data.tokens:
            print(f"Token ID: {token.token_id}")
            print(f"Payment Token: {token.payment_token}")
            print(f"Status: {token.status}")
            print(f"Card: {token.payment_method} **** {token.card_last_4_digits}")
            print("---")
    elif response.HasField("error"):
        error = response.error
        print(f"API Error: {error.message}")

if __name__ == "__main__":
    get_card_tokens()
using Grpc.Core;
using Grpc.Net.Client;
using Com.Kodypay.Ecom.V1;

class Program
{
    static async Task Main(string[] args)
    {
        // Configuration
        var HOSTNAME = "grpc-staging.kodypay.com";
        var API_KEY = "your-api-key";

        // Step 1: Create secure channel
        var channel = GrpcChannel.ForAddress("https://" + HOSTNAME);

        // Step 2: Create client
        var client = new KodyEcomPaymentsService.KodyEcomPaymentsServiceClient(channel);

        // Step 3: Set authentication headers with API key
        var metadata = new Metadata
        {
            { "X-API-Key", API_KEY }
        };

        // Step 4: Create GetCardTokensRequest and set required fields
        var request = new GetCardTokensRequest
        {
            StoreId = "your-store-id",
            PayerReference = "user123" // The payer for whom to list tokens
        };

        // Step 5: Call GetCardTokens() method and get response
        var response = await client.GetCardTokensAsync(request, metadata);

        // Step 6: Process response
        if (response.ResponseCase == GetCardTokensResponse.ResponseOneofCase.Response)
        {
            var responseData = response.Response;
            Console.WriteLine($"Found {responseData.Tokens.Count} tokens:");

            foreach (var token in responseData.Tokens)
            {
                Console.WriteLine($"Token ID: {token.TokenId}");
                Console.WriteLine($"Payment Token: {token.PaymentToken}");
                Console.WriteLine($"Status: {token.Status}");
                Console.WriteLine($"Card: {token.PaymentMethod} **** {token.CardLast4Digits}");
                Console.WriteLine("---");
            }
        }
        else if (response.ResponseCase == GetCardTokensResponse.ResponseOneofCase.Error)
        {
            var error = response.Error;
            Console.WriteLine($"API Error: {error.Message}");
        }
    }
}

🗑️ Delete Card Token - SDK Examples

<?php
require __DIR__ . '/../vendor/autoload.php';

use Com\Kodypay\Grpc\Ecom\V1\KodyEcomPaymentsServiceClient;
use Com\Kodypay\Grpc\Ecom\V1\DeleteCardTokenRequest;
use Grpc\ChannelCredentials;

// Configuration
$HOSTNAME = "grpc-staging.kodypay.com";
$API_KEY = "your-api-key";

// Step 1: Initialize SDK client with SSL credentials
$client = new KodyEcomPaymentsServiceClient($HOSTNAME, [
    'credentials' => ChannelCredentials::createSsl()
]);

// Step 2: Set authentication headers with your API key
$metadata = ['X-API-Key' => [$API_KEY]];

// Step 3: Create DeleteCardTokenRequest and set required fields
$request = new DeleteCardTokenRequest();
$request->setStoreId('your-store-id');
$request->setTokenId('token-id-to-delete'); // or use setTokenReference('your-token-reference')

// Step 4: Call DeleteCardToken() method and wait for response
list($response, $status) = $client->DeleteCardToken($request, $metadata)->wait();

// Step 5: Handle gRPC response status
if ($status->code !== \Grpc\STATUS_OK) {
    echo "Error: " . $status->details . PHP_EOL;
    exit;
}

// Step 6: Process response
if ($response->hasResponse()) {
    echo "Token deleted successfully!" . PHP_EOL;
} else if ($response->hasError()) {
    $error = $response->getError();
    echo "API Error: " . $error->getMessage() . PHP_EOL;
}
?>
import com.kodypay.grpc.ecom.v1.KodyEcomPaymentsServiceGrpc;
import com.kodypay.grpc.ecom.v1.DeleteCardTokenRequest;
import com.kodypay.grpc.ecom.v1.DeleteCardTokenResponse;
import io.grpc.ManagedChannelBuilder;
import io.grpc.Metadata;
import io.grpc.stub.MetadataUtils;

public class DeleteCardTokenExample {
    public static final String HOSTNAME = "grpc-staging.kodypay.com";
    public static final String API_KEY = "your-api-key";

    public static void main(String[] args) {
        // Step 1: Create metadata with API key
        Metadata metadata = new Metadata();
        metadata.put(Metadata.Key.of("X-API-Key", Metadata.ASCII_STRING_MARSHALLER), API_KEY);

        // Step 2: Build secure channel and create client
        var channel = ManagedChannelBuilder.forAddress(HOSTNAME, 443)
            .useTransportSecurity()
            .build();
        var client = KodyEcomPaymentsServiceGrpc.newBlockingStub(channel)
            .withInterceptors(MetadataUtils.newAttachHeadersInterceptor(metadata));

        // Step 3: Create DeleteCardTokenRequest and set required fields
        DeleteCardTokenRequest request = DeleteCardTokenRequest.newBuilder()
            .setStoreId("your-store-id")
            .setTokenId("token-id-to-delete") // or use setTokenReference("your-token-reference")
            .build();

        // Step 4: Call DeleteCardToken() method and get response
        DeleteCardTokenResponse response = client.deleteCardToken(request);

        // Step 5: Process response
        if (response.hasResponse()) {
            System.out.println("Token deleted successfully!");
        } else if (response.hasError()) {
            var error = response.getError();
            System.out.println("API Error: " + error.getMessage());
        }
    }
}
import grpc
import kody_clientsdk_python.ecom.v1.ecom_pb2 as kody_model
import kody_clientsdk_python.ecom.v1.ecom_pb2_grpc as kody_client

def delete_card_token():
    # Configuration
    HOSTNAME = "grpc-staging.kodypay.com:443"
    API_KEY = "your-api-key"

    # Step 1: Create secure channel
    channel = grpc.secure_channel(HOSTNAME, grpc.ssl_channel_credentials())

    # Step 2: Create client and set metadata with API key
    client = kody_client.KodyEcomPaymentsServiceStub(channel)
    metadata = [("x-api-key", API_KEY)]

    # Step 3: Create DeleteCardTokenRequest and set required fields
    request = kody_model.DeleteCardTokenRequest(
        store_id="your-store-id",
        token_id="token-id-to-delete"  # or use token_reference="your-token-reference"
    )

    # Step 4: Call DeleteCardToken() method and get response
    response = client.DeleteCardToken(request, metadata=metadata)

    # Step 5: Process response
    if response.HasField("response"):
        print("Token deleted successfully!")
    elif response.HasField("error"):
        error = response.error
        print(f"API Error: {error.message}")

if __name__ == "__main__":
    delete_card_token()
using Grpc.Core;
using Grpc.Net.Client;
using Com.Kodypay.Ecom.V1;

class Program
{
    static async Task Main(string[] args)
    {
        // Configuration
        var HOSTNAME = "grpc-staging.kodypay.com";
        var API_KEY = "your-api-key";

        // Step 1: Create secure channel
        var channel = GrpcChannel.ForAddress("https://" + HOSTNAME);

        // Step 2: Create client
        var client = new KodyEcomPaymentsService.KodyEcomPaymentsServiceClient(channel);

        // Step 3: Set authentication headers with API key
        var metadata = new Metadata
        {
            { "X-API-Key", API_KEY }
        };

        // Step 4: Create DeleteCardTokenRequest and set required fields
        var request = new DeleteCardTokenRequest
        {
            StoreId = "your-store-id",
            TokenId = "token-id-to-delete" // or use TokenReference = "your-token-reference"
        };

        // Step 5: Call DeleteCardToken() method and get response
        var response = await client.DeleteCardTokenAsync(request, metadata);

        // Step 6: Process response
        if (response.ResponseCase == DeleteCardTokenResponse.ResponseOneofCase.Response)
        {
            Console.WriteLine("Token deleted successfully!");
        }
        else if (response.ResponseCase == DeleteCardTokenResponse.ResponseOneofCase.Error)
        {
            var error = response.Error;
            Console.WriteLine($"API Error: {error.Message}");
        }
    }
}

💳 Pay With Card Token - SDK Examples

<?php
require __DIR__ . '/../vendor/autoload.php';

use Com\Kodypay\Grpc\Ecom\V1\KodyEcomPaymentsServiceClient;
use Com\Kodypay\Grpc\Ecom\V1\PayWithCardTokenRequest;
use Grpc\ChannelCredentials;

// Configuration
$HOSTNAME = "grpc-staging.kodypay.com";
$API_KEY = "your-api-key";

// Step 1: Initialize SDK client with SSL credentials
$client = new KodyEcomPaymentsServiceClient($HOSTNAME, [
    'credentials' => ChannelCredentials::createSsl()
]);

// Step 2: Set authentication headers with your API key
$metadata = ['X-API-Key' => [$API_KEY]];

// Step 3: Create PayWithCardTokenRequest and set required fields
$request = new PayWithCardTokenRequest();
$request->setStoreId('your-store-id');
$request->setIdempotencyUuid(uniqid('', true)); // Generate unique idempotency key
$request->setPaymentToken('payment-token-from-get-tokens-response');
$request->setAmountMinorUnits(2000); // £20.00 in minor units
$request->setCurrency('GBP');
$request->setPaymentReference('payment_' . time());

// Optional fields
$request->setOrderId('order-123');
$request->setPayerStatement('My Store Purchase');

// Step 4: Call PayWithCardToken() method and wait for response
list($response, $status) = $client->PayWithCardToken($request, $metadata)->wait();

// Step 5: Handle gRPC response status
if ($status->code !== \Grpc\STATUS_OK) {
    echo "Error: " . $status->details . PHP_EOL;
    exit;
}

// Step 6: Process payment response
if ($response->hasResponse()) {
    $paymentDetails = $response->getResponse();

    echo "Payment ID: " . $paymentDetails->getPaymentId() . PHP_EOL;
    echo "Status: " . $paymentDetails->getStatus() . PHP_EOL;

    if ($paymentDetails->hasSaleData()) {
        $saleData = $paymentDetails->getSaleData();
        echo "Amount: " . ($saleData->getAmountMinorUnits() / 100) . " " . $saleData->getCurrency() . PHP_EOL;
    }

    if ($paymentDetails->hasPaymentData()) {
        $paymentData = $paymentDetails->getPaymentData();
        echo "PSP Reference: " . $paymentData->getPspReference() . PHP_EOL;
        echo "Auth Status: " . $paymentData->getAuthStatus() . PHP_EOL;
    }
} else if ($response->hasError()) {
    $error = $response->getError();
    echo "Payment failed: " . $error->getMessage() . PHP_EOL;
}
?>
import com.kodypay.grpc.ecom.v1.KodyEcomPaymentsServiceGrpc;
import com.kodypay.grpc.ecom.v1.PayWithCardTokenRequest;
import com.kodypay.grpc.ecom.v1.PaymentDetailsResponse;
import io.grpc.ManagedChannelBuilder;
import io.grpc.Metadata;
import io.grpc.stub.MetadataUtils;
import java.util.UUID;

public class PayWithCardTokenExample {
    public static final String HOSTNAME = "grpc-staging.kodypay.com";
    public static final String API_KEY = "your-api-key";

    public static void main(String[] args) {
        // Step 1: Create metadata with API key
        Metadata metadata = new Metadata();
        metadata.put(Metadata.Key.of("X-API-Key", Metadata.ASCII_STRING_MARSHALLER), API_KEY);

        // Step 2: Build secure channel and create client
        var channel = ManagedChannelBuilder.forAddress(HOSTNAME, 443)
            .useTransportSecurity()
            .build();
        var client = KodyEcomPaymentsServiceGrpc.newBlockingStub(channel)
            .withInterceptors(MetadataUtils.newAttachHeadersInterceptor(metadata));

        // Step 3: Create PayWithCardTokenRequest and set required fields
        PayWithCardTokenRequest request = PayWithCardTokenRequest.newBuilder()
            .setStoreId("your-store-id")
            .setIdempotencyUuid(UUID.randomUUID().toString())
            .setPaymentToken("payment-token-from-get-tokens-response")
            .setAmountMinorUnits(2000) // £20.00 in minor units
            .setCurrency("GBP")
            .setPaymentReference("payment_" + System.currentTimeMillis())
            .setOrderId("order-123") // Optional
            .setPayerStatement("My Store Purchase") // Optional
            .build();

        // Step 4: Call PayWithCardToken() method and get response
        PaymentDetailsResponse response = client.payWithCardToken(request);

        // Step 5: Process payment response
        if (response.hasResponse()) {
            var paymentDetails = response.getResponse();

            System.out.println("Payment ID: " + paymentDetails.getPaymentId());
            System.out.println("Status: " + paymentDetails.getStatus());

            if (paymentDetails.hasSaleData()) {
                var saleData = paymentDetails.getSaleData();
                System.out.println("Amount: " + (saleData.getAmountMinorUnits() / 100.0) + " " + saleData.getCurrency());
            }

            if (paymentDetails.hasPaymentData()) {
                var paymentData = paymentDetails.getPaymentData();
                System.out.println("PSP Reference: " + paymentData.getPspReference());
                System.out.println("Auth Status: " + paymentData.getAuthStatus());
            }
        } else if (response.hasError()) {
            var error = response.getError();
            System.out.println("Payment failed: " + error.getMessage());
        }
    }
}
import grpc
import uuid
import time
import kody_clientsdk_python.ecom.v1.ecom_pb2 as kody_model
import kody_clientsdk_python.ecom.v1.ecom_pb2_grpc as kody_client

def pay_with_card_token():
    # Configuration
    HOSTNAME = "grpc-staging.kodypay.com:443"
    API_KEY = "your-api-key"

    # Step 1: Create secure channel
    channel = grpc.secure_channel(HOSTNAME, grpc.ssl_channel_credentials())

    # Step 2: Create client and set metadata with API key
    client = kody_client.KodyEcomPaymentsServiceStub(channel)
    metadata = [("x-api-key", API_KEY)]

    # Step 3: Create PayWithCardTokenRequest and set required fields
    request = kody_model.PayWithCardTokenRequest(
        store_id="your-store-id",
        idempotency_uuid=str(uuid.uuid4()),
        payment_token="payment-token-from-get-tokens-response",
        amount_minor_units=2000,  # £20.00 in minor units
        currency="GBP",
        payment_reference=f"payment_{int(time.time())}",
        order_id="order-123",  # Optional
        payer_statement="My Store Purchase"  # Optional
    )

    # Step 4: Call PayWithCardToken() method and get response
    response = client.PayWithCardToken(request, metadata=metadata)

    # Step 5: Process payment response
    if response.HasField("response"):
        payment_details = response.response

        print(f"Payment ID: {payment_details.payment_id}")
        print(f"Status: {payment_details.status}")

        if payment_details.HasField("sale_data"):
            sale_data = payment_details.sale_data
            print(f"Amount: {sale_data.amount_minor_units / 100} {sale_data.currency}")

        if payment_details.HasField("payment_data"):
            payment_data = payment_details.payment_data
            print(f"PSP Reference: {payment_data.psp_reference}")
            print(f"Auth Status: {payment_data.auth_status}")

    elif response.HasField("error"):
        error = response.error
        print(f"Payment failed: {error.message}")

if __name__ == "__main__":
    pay_with_card_token()
using Grpc.Core;
using Grpc.Net.Client;
using Com.Kodypay.Ecom.V1;

class Program
{
    static async Task Main(string[] args)
    {
        // Configuration
        var HOSTNAME = "grpc-staging.kodypay.com";
        var API_KEY = "your-api-key";

        // Step 1: Create secure channel
        var channel = GrpcChannel.ForAddress("https://" + HOSTNAME);

        // Step 2: Create client
        var client = new KodyEcomPaymentsService.KodyEcomPaymentsServiceClient(channel);

        // Step 3: Set authentication headers with API key
        var metadata = new Metadata
        {
            { "X-API-Key", API_KEY }
        };

        // Step 4: Create PayWithCardTokenRequest and set required fields
        var request = new PayWithCardTokenRequest
        {
            StoreId = "your-store-id",
            IdempotencyUuid = Guid.NewGuid().ToString(),
            PaymentToken = "payment-token-from-get-tokens-response",
            AmountMinorUnits = 2000, // £20.00 in minor units
            Currency = "GBP",
            PaymentReference = $"payment_{DateTimeOffset.UtcNow.ToUnixTimeSeconds()}",
            OrderId = "order-123", // Optional
            PayerStatement = "My Store Purchase" // Optional
        };

        // Step 5: Call PayWithCardToken() method and get response
        var response = await client.PayWithCardTokenAsync(request, metadata);

        // Step 6: Process payment response
        if (response.ResponseCase == PaymentDetailsResponse.ResponseOneofCase.Response)
        {
            var paymentDetails = response.Response;

            Console.WriteLine($"Payment ID: {paymentDetails.PaymentId}");
            Console.WriteLine($"Status: {paymentDetails.Status}");

            if (paymentDetails.SaleData != null)
            {
                var saleData = paymentDetails.SaleData;
                Console.WriteLine($"Amount: {saleData.AmountMinorUnits / 100.0} {saleData.Currency}");
            }

            if (paymentDetails.PaymentData != null)
            {
                var paymentData = paymentDetails.PaymentData;
                Console.WriteLine($"PSP Reference: {paymentData.PspReference}");
                Console.WriteLine($"Auth Status: {paymentData.AuthStatus}");
            }
        }
        else if (response.ResponseCase == PaymentDetailsResponse.ResponseOneofCase.Error)
        {
            var error = response.Error;
            Console.WriteLine($"Payment failed: {error.Message}");
        }
    }
}