CARD_PAYMENT

Fund transactions using credit and debit cards.

Specifications

Refer example: https://github.com/QuoineFinancial/qex-b2b-examples/blob/master/currency-swap/react-fiat-crypto/src/app/card-payment.tsx

Accept funding using Visa credit and debit cards card using funding method CARD_PAYMENT.

Setup Parameters

None

Input Parameters

Note that an iframe should be rendered for card tokenization which will submit this information.

Field

Type

Description

Required

transaction_key

CARD_TOKEN

Tokenized card details

true

Result Parameters

Field

Type

Description

Always Present

transaction_key

TRANSCATION_RECEIPT

Third party transaction number

true

Tokenization

Card details must be recorded via loading a minimally intrusive and unstyled iframe. Card details cannot be submitted via normal API.

<iframe 
  id="qex-card-capture"
  src="https://partners.liquid.com/api/v1/method/card/{settlement_instruction_id}" 
  />
<script>
    window.addEventListener('message', (event) => {
      const data: CustomPostMessage = event.data;
      if (data !== undefined && data !== null && data.event !== undefined) {
        switch (data.event) {
          case 'success':
            console.log('Tokenization Success', data.payload);
            break;
          case 'failure':
            console.log('Tokenization Failed', data.payload );
            break;
          case '3ds-frame':
            console.log('Must render 3DS iframe', data.payload)
            break
          case 'card-validation':
            console.log('Card validation updated', data.payload);
            break;
        }
      }
    }, false);
    const iframe = document.getElementById('qex-card-capture');
    const initializePostMessage = {
      event: "initialize"
    };
    iframe.contentWindow.postMessage(initializePostMessage, "*");
</script>

The initialize postMessage is essential to loading the iframe. It can contain a payload attribute which specifies some optional custom parameters for the input form.

const initializePostMessage = {
  event: "initialize",
  payload: {
    style: {
      base: {
        color: "#FFF",
        fontSize: "15px",
      },
      placeholder: {
        base: {
          color: "#aaaaaa",
        },
      },
    };
    localization: {
      card_number: 'Card Number' ,
      card_month: 'MM',
      card_year: 'YY',
      card_cvv: 'CVV'
    },
  },
};

See swagger documentation: https://partners.liquid.com/swagger/#/default/get_api_v1_method_card__settlement_instruction_id_

Submit

The host application must render a "submit" button and call a submit post message when the user clicks it. This post message can optionally contain a payload which holds cardHolder information. This information is not always required, however some card issuers will reject transactions where it is not present.

const cardholder = {
  name: userInfo.fullName,
  billingAddress: userInfo.billingAddress,
  phone: userInfo.phoneNumber,
};
const submitMessage: CustomPostMessage = {
  event: "submit",
  payload: { cardholder },
};
iframe.contentWindow.postMessage(submitMessage, "*");

3D Secure

Card issuers must support the 3D Secure standard. To process 3DS, a second iframe must be rendered.

The address of this iframe must be obtained from the previous iframe. See 3ds-iframe postMessage in the code above.

When the user completes the 3DS the new iframe will fire either the success or failure event.

Example Responses

GET https://partners.liquid.com/api/v1/transaction/70f7cd4c-bb6b-48eb-abe8-b92eac9e3db8
{
  "success": true,
  "environment": "PRODUCTION",
  "message": "Transaction created. Transaction is filled. Payout has been delivered.",
  "payload": {
    "transaction_id": "70f7cd4c-bb6b-48eb-abe8-b92eac9e3db8",
    "api_key": "ef6cf2a7-a6e8-48d1-8c8a-677187dfcd8f",
    "status": "FILLED",
    "funding_settlement": {
      "settlement_instruction_id": "fba2b4eb-7d17-453a-a69f-c5e991384091",
      "transaction_id": "70f7cd4c-bb6b-48eb-abe8-b92eac9e3db8",
      "currency": "AUD",
      "direction": "FUNDING",
      "method": "CARD_PAYMENT",
      "quantity": "100.00",
      "status": "COMPLETE",
      "expires": {
        "unix_ms": 1589254269593,
        "iso8601": "2020-05-12T03:31:09.593Z",
        "ttl_ms": 20000
      },
      "input_parameters": {
        "card_token": "tok_wiooyb6dhkquvikbxsvw2uymhy"        
      },
      "result_parameters": {
        "card_receipt": "act_3ycvlqyprmme3kh3l36blhu7om"
      },
      "_links": {
        "status": {
          "href": "https://partners.liquid.com/api/v1/settlement/status/fba2b4eb-7d17-453a-a69f-c5e991384091"
        }
      }
    },
    "payout_settlement": {
      "settlement_instruction_id": "e6560d70-2fa8-4e2a-b86b-3979694016ad",
      "transaction_id": "70f7cd4c-bb6b-48eb-abe8-b92eac9e3db8",
      "currency": "USDC",
      "direction": "PAYOUT",
      "method": "BLOCKCHAIN_TRANSFER",
      "quantity": "60.640",
      "status": "COMPLETE",
      "expires": {
        "unix_ms": 1589254253947,
        "iso8601": "2020-05-12T03:30:53.947Z",
        "ttl_ms": 20000
      },
      "input_parameters": {
        "wallet_adress": "0xC5b83d3C0f48807AF09ee5Bd1c95Ee870878f36B"
      },
      "result_parameters": {
        "wallet_address": "0xC5b83d3C0f48807AF09ee5Bd1c95Ee870878f36B",
        "transaction_hash": "0x8698693ddaec3cad825c0c42e326105e3e14f70ebbcd425c3a8b577570168335"
      },
      "_links": {
        "status": {
          "href": "https://partners.liquid.com/api/v1/settlement/status/e6560d70-2fa8-4e2a-b86b-3979694016ad"
        }
      }
    },
    "_links": {
      "status": {
        "href": "https://partners.liquid.com/api/v1/transaction/status/70f7cd4c-bb6b-48eb-abe8-b92eac9e3db8"
      }
    }
  }
}

Last updated