ID: 42 - Debit / Credit Card (CLP) — Lyra Klap

Channel: 42

Provider: Lyra (Klap acquirer)

Payment Method: Debit / Credit Card

Available Currencies

NameCodeCountry
Chilean PesosCLPChile

How it works

The shopper pays without leaving the ALPS checkout: the card form is embedded in the ALPS payment page and the card data is captured and tokenized directly by Lyra. Neither ALPS nor the merchant ever receives the card number.

  1. The merchant creates the transaction with channel=42.
  2. The shopper is taken to the ALPS checkout, where the card form is displayed.
  3. The shopper enters the card data and pays.
  4. Result:
    • Approved: the shopper is redirected to url_ok.
    • Rejected: the shopper is redirected to url_error.
    • Cancelled (the shopper clicks the cancel button): the transaction is cancelled and the shopper is redirected to url_error.

Note: the browser redirect is not a payment confirmation. The final status is always the one sent to your notification URL (see Notifications).

Request example

curl --request POST \
  --url https://uat-payments.alps.cl/justpay/check-out/SecurePayment \
  --data public_key=YOUR_PUBLIC_KEY \
  --data time=2026-10-21T14:39:09 \
  --data channel=42 \
  --data amount=300 \
  --data currency=CLP \
  --data trans_id=1 \
  --data time_expired=120 \
  --data url_ok=https://example.com/ok \
  --data url_error=https://example.com/error \
  --data signature=YOUR_SIGNATURE \
  --data shopper_information='{"name_shopper": "Jon","last_name_Shopper": "Snow","type_doc_identi": "RUT","Num_doc_identi": "11111111-1","email": "[email protected]","country_code": "+56","Phone": "999763655"}'
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://uat-payments.alps.cl/justpay/check-out/SecurePayment",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => http_build_query([
    'public_key'          => 'YOUR_PUBLIC_KEY',
    'time'                => '2026-10-21T14:39:09',
    'channel'             => 42,
    'amount'              => 300,
    'currency'            => 'CLP',
    'trans_id'            => '1',
    'time_expired'        => 120,
    'url_ok'              => 'https://example.com/ok',
    'url_error'           => 'https://example.com/error',
    'signature'           => 'YOUR_SIGNATURE',
    'shopper_information' => json_encode([
      'name_shopper'      => 'Jon',
      'last_name_Shopper' => 'Snow',
      'type_doc_identi'   => 'RUT',
      'Num_doc_identi'    => '11111111-1',
      'email'             => '[email protected]',
      'country_code'      => '+56',
      'Phone'             => '999763655',
    ]),
  ]),
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
import json
import requests

url = "https://uat-payments.alps.cl/justpay/check-out/SecurePayment"

payload = {
    "public_key": "YOUR_PUBLIC_KEY",
    "time": "2026-10-21T14:39:09",
    "channel": "42",
    "amount": "300",
    "currency": "CLP",
    "trans_id": "1",
    "time_expired": "120",
    "url_ok": "https://example.com/ok",
    "url_error": "https://example.com/error",
    "signature": "YOUR_SIGNATURE",
    "shopper_information": json.dumps({
        "name_shopper": "Jon",
        "last_name_Shopper": "Snow",
        "type_doc_identi": "RUT",
        "Num_doc_identi": "11111111-1",
        "email": "[email protected]",
        "country_code": "+56",
        "Phone": "999763655",
    }),
}

response = requests.post(url, data=payload)

print(response.text)
const qs = require("querystring");
const https = require("https");

const options = {
  "method": "POST",
  "hostname": "uat-payments.alps.cl",
  "port": null,
  "path": "/justpay/check-out/SecurePayment",
  "headers": {
    "Content-Type": "application/x-www-form-urlencoded"
  }
};

const req = https.request(options, function (res) {
  const chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    const body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.write(qs.stringify({
  public_key: 'YOUR_PUBLIC_KEY',
  time: '2026-10-21T14:39:09',
  channel: '42',
  amount: '300',
  currency: 'CLP',
  trans_id: '1',
  time_expired: '120',
  url_ok: 'https://example.com/ok',
  url_error: 'https://example.com/error',
  signature: 'YOUR_SIGNATURE',
  shopper_information: JSON.stringify({
    name_shopper: 'Jon',
    last_name_Shopper: 'Snow',
    type_doc_identi: 'RUT',
    Num_doc_identi: '11111111-1',
    email: '[email protected]',
    country_code: '+56',
    Phone: '999763655'
  })
}));
req.end();

Mandatory Data

AttributeMandatoryData typeDescription
public_keyTrueString (255)Public key, unique value that identifies the commerce
timeTrueDatetimeRequest data time
channelTrueIntegerPayment Channel. Use 42
amountTrueIntegerThe amount of the transaction. CLP does not allow decimals: send whole pesos (e.g. 300). Amounts with a fractional part are rejected (NO_DECIMALS)
currencyTrueString (3)Transaction currency code. Only CLP
trans_idTrueString (255)Transaction id
time_expiredTrueString (255)Time in minutes to expire the token. Value given in minutes. Minimum Suggested: Online: 30 minutes
url_okTrueString (255)URL where shopper will be redirected if payment was successful (Must be Https)
url_errorTrueString (255)URL where shopper will be redirected if payment was rejected or cancelled (Must be Https)
signatureTrueString (255)Signature hash256: Review signature calculation
shopper_informationTrueJSON StringJSON String Data: Review JSON index & format

shopper_information JSON format

📘

Field shopper_information must be send in string format (JSON encode).

{
  "name_shopper": "Jon",
  "last_name_Shopper": "Snow",
  "type_doc_identi": "RUT",
  "Num_doc_identi": "11111111-1",
  "email": "[email protected]",
  "country_code": "+56",
  "Phone": "999763655"
}

The shopper_information field is a column corresponding to a json with the next keys:

ParameterMandatoryData TypeDescription
name_shopperTrueString (255)Shopper's name
last_name_ShopperTrueString (255)Shopper's last name
type_doc_identiTrueString (255)Identification document [RUT,DNI,CI, ID etc.]
Num_doc_identiTrueString (255)Identification document number
emailTrueString (255)Shopper's e-mail
country_codeTrueString (10)Country's phone code (Ex. +56)
PhoneTrueString (20)Shopper's phone number

Notifications

The final status of the transaction is sent to the merchant's notification URLs once Lyra confirms the payment.

Lyra resultNotification sent toContent
Payment authorised/capturedSuccess notification URLStandard ALPS success notification
Payment refusedRejection notification URLrejection_message: status reported by Lyra (e.g. REFUSED). rejection_code: 0
Any other non-approved stateRejection notification URLrejection_message: status reported by Lyra. rejection_code: 0

Notifications always include channel=42.


Test Transactions

Simulate payment

Once the notification URL is configured, please follow the steps below to begin the tests.

  1. Create Transaction with channel=42. You will be taken to the ALPS checkout with the embedded card form.
  2. Enter one of the Testing Cards below (card number, expiration date, CVV and cardholder name) and click on the Pay button.
  3. You will be redirected to url_ok (approved) or url_error (rejected), and the notification will be sent to your notification URL.

Credit and Debit TEST Cards CLP

TODO (ALPS): test cards pending confirmation with Lyra/Klap for the UAT shop. Do not use the Transbank (channel 3) test cards — they do not apply to this channel.

BrandTypeCard NumberCVVExp DateStatus
——————

Errors

To better error handling, we'll return the errors in the response body using the following fields:

{
  "error":{
    "code":"NO_DECIMALS",
    "message":"The currency[CLP] does not allow decimal values - {currency}"
  }
}

Request validation errors

CodeMessage
INVALID_CHANNELInvalid channel - {channel}
INVALID_AMOUNTAmount must be a valid number - {amount}
NEGATIVE_AMOUNTAmount must be greater than zero - {amount}
NO_DECIMALSThe currency[CLP] does not allow decimal values - {currency}
INVALID_CURRENCYInvalid currency. {currency}
INVALID_CURRENCY_CHANNELCurrency code not allowed for this channel - {currency}