SDK Html Receipt Template
Where is defined
The Html receipt template is defined as a child element of the <config> element, which is the root element of the Card Reader Config:
<config>
<HtmlReceiptTemplate><![CDATA[
/// ------ Html Template goes here --------- ////
]]></HtmlReceiptTemplate>
</config>
Since we are using a Java Template Engine called Chunk which is not pure XML we need to wrap it in a CDATA section.
How a Template Engine Works
The template engine enables us to combine a Receipt Template and a set of specific values to render a receipt:
Template Elements
Since the final HTML Receipt must be converted later to the printer format, we are using only a subset of HTML to make this conversion task easier. See https://handpoint.atlassian.net/wiki/spaces/TP/pages/1409187843
Adding Logic to the Template
Chunk supports a number of commands or expressions to control what we render. For instance we could print the error message only if the transaction failed:
<footer>
...
{% if ($SUCCESS_RESPONSE != 1) %}
<div>
<p class="large center">{$ERROR_MESSAGE}</p>
</div>
<div class="separator solid" style="margin-top: 10px; height: 2px; margin-bottom: 10px;"></div>
{% endif %}
...
</footer>
Go to the Chunk Documentation for a complete list of features.
Transaction Data
This is the template variables we currently have to generate dynamic content:
Field Name | Value Example | Description |
---|---|---|
MID | 000000001754852 |
|
AID | A0000000031010 |
|
TXN_TYPE | SALE |
|
TXN_TYPE_LABEL | VENTA (spanish) | i18n version of TXN_TYPE |
TVR | 0000000000 |
|
CURRENCY_WITH_AMOUNT | USD 55.00 |
|
ARC | 0000 |
|
TIME | 16:25 |
|
DATE | 22.11.2019 |
|
TSI | 0000 |
|
ENTRY | Contactless |
|
ERROR_MESSAGE | Successful |
|
MERCHANT_LOCATION | Ármúli 30 108 reykjavik |
|
APP_LABEL | VISA CREDIT |
|
TID | 01754852 |
|
CARD_NUMBER |
|
|
pin_entered | 0 |
|
SUCCESS_RESPONSE | 1 |
|
IAD | 06010A03A00000 |
|
RECEIPT_TYPE_DESCRIPTION |
|
|
CVM | VERIFICATION NOT REQUIRED |
|
PIN_VERIFIED_DESCRIPTION | PIN VERIFIED |
|
APP_EXP_DATE | 1222 |
|
RECEIPT_COPY |
|
|
REFERENCE | 5a5ffb60-0d3c-11ea-9248-8bf5d5600868 |
|
ORIGINAL_REFERENCE | 5a5ffb60-0d3c-11ea-9248-8bf5d5600868 | This field only appears in the case of a reversal. It represents the GUID of the transaction being reversed. |
SIGNATURE_REQUIRED | 0 |
|
MERCHANT_NAME | Borgun Test Merchant |
|
AUTH_CODE | 123456 |
|
RECEIPT_TYPE | MERCHANT_COPY |
|
RESPONSE | Successful |
|
RESPONSE_LABEL | Autorizada (spanish) | i18n version of RESPONSE |
AMOUNT_LABEL | Amount |
|
TIP_AMOUNT_LABEL | Tip | Taken from the header field in TipConfiguration Object |
TOTAL_AMOUNT_LABEL | Total Amount |
|
TENDER_TYPE_I18N | Tipo de Pago (Spanish) | Translated value of “Tender Type“ |
TENDER_TYPE | Credit |
|
Template Example
<html>
<head></head>
<body>
<header>
<img class="center" src="https://hndpt.co/34r676D" />
{% if ($MERCHANT_NAME) %}
<div id="merchant_name">
<p class="large bold center">{$MERCHANT_NAME}</p>
</div>
{% endif %}
{% if ($MERCHANT_LOCATION) %}
<div id="merchant_location">
<p class="center">{$MERCHANT_LOCATION}</p>
</div>
{% endif %}
<div id="datetime" class="separator solid" style="margin-top: 10px; height: 2px; margin-bottom: 10px;"></div>
{% if ($DATETIME) %}
<div>
<label class="left">{$DATETIME|date}</label>
<span class="right">{$DATETIME|time}</span>
</div>
{% endif %}
</header>
<main>
{% if ($RESPONSE_I18N) %}
<div id="response">
<p class="large bold center">{$RESPONSE_I18N|trim}{% if ($PRINT_ERROR_MESSAGE_I18N) %}:{% endif %}</p>
</div>
{% if ($PRINT_ERROR_MESSAGE_I18N) %}
<div id="error_response_message">
<p class="large bold center">{$ERROR_MESSAGE_I18N}</p>
</div>
{% endif %}
{% elseIf ($RESPONSE) %}
<div id="response">
<p class="large bold center">{$RESPONSE|trim}{% if ($PRINT_ERROR_MESSAGE) %}:{% endif %}</p>
</div>
{% if ($PRINT_ERROR_MESSAGE) %}
<div id="error_response_message">
<p class="large bold center">{$ERROR_MESSAGE}</p>
</div>
{% endif %}
{% endif %}
{% if ($TXN_TYPE) %}
<div id="txn_type">
<p class="large bold center">{$TXN_TYPE_I18N}</p>
</div>
{% endif %}
{% if ($TOTAL_AMOUNT) %}
{% if ($AMOUNT) %}
<div id="amount">
<label class="left">{$AMOUNT_LABEL}: </label>
<span class="large right">{$AMOUNT|currency($CURRENCY)}</span>
</div>
{% endif %}
{% if ($TIP_AMOUNT) %}
<div id="tip_amount">
<label class="left">{$TIP_AMOUNT_LABEL}: </label>
<span class="large right">{$TIP_AMOUNT|currency($CURRENCY)}</span>
</div>
{% endif %}
<div id="total_amount">
<label class="xlarge left bold">{$TOTAL_AMOUNT_LABEL}: </label>
<span class="xlarge bold right">{$TOTAL_AMOUNT|currency($CURRENCY)}</span>
</div>
{% elseIf ($AMOUNT) %}
<div id="amount">
<label class="left">{$AMOUNT_LABEL}: </label>
<span class="large right">{$AMOUNT|currency($CURRENCY)}</span>
</div>
{% endif %}
{% if ($ACCOUNT_TYPE) %}
<div id="account_type">
<label class="left bold">{$ACCOUNT_TYPE_I18N}</label>
<span class="right">{$ACCOUNT_TYPE}</span>
</div>
{% endif %}
{% if ($DUE_AMOUNT) %}
<div id="due_amount">
<label class="left bold">{$DUE_AMOUNT_I18N}</label>
<span class="right">{$DUE_AMOUNT|currency($CURRENCY)}</span>
</div>
{% endif %}
<div class="separator dotted" style="margin-top: 10px; height: 2px; margin-bottom: 10px;"></div>
{% if ($MID) %}
<div id="mid">
<label class="left bold">{$MID_I18N}</label>
<span class="right">{$MID}</span>
</div>
{% endif %}
{% if ($TID) %}
<div id="tid">
<label class="left bold">{$TID_I18N}</label>
<span class="right">{$TID}</span>
</div>
{% endif %}
{% if ($CARD_NUMBER) %}
<div id="card_number">
<label class="left bold">{$APP_LABEL}</label>
<span class="right">{$CARD_NUMBER}</span>
</div>
{% endif %}
{% if ($ENTRY) %}
<div id="entry">
<label class="left bold">{$ENTRY_I18N}</label>
<span class="right">{$ENTRY}</span>
</div>
{% endif %}
{% if ($CVM != null) && ($TXN_TYPE != "SALE VOID") && ($TXN_TYPE != "REFUND VOID") %}
<div id="cvm">
<label class="left bold">{$CVM_I18N}</label>
<span class="right">{$CVM}</span>
</div>
{% endif %}
{% if ($AUTH_CODE) %}
<div id="auth_code">
<label class="left bold">{$AUTH_CODE_I18N}</label>
<span class="right">{$AUTH_CODE}</span>
</div>
{% endif %}
{% if ($TENDER_TYPE_I18N) %}
<div id="tender_type">
<label class="left bold">{$TENDER_TYPE_I18N}</label>
<span class="right">{$TENDER_TYPE}</span>
</div>
{% endif %}
<div class="separator dotted" style="margin-top: 10px; height: 2px; margin-bottom: 10px;"></div>
{% if ($ORIGINAL_REFERENCE) %}
<div>
<p class="left bold">GUID</p>
</div>
<div id="guid">
<p class="small left">{$ORIGINAL_REFERENCE}</p>
</div>
<div>
<p class="left bold">{$TXN_TYPE_I18N} GUID</p>
</div>
<div id="guid">
<p class="small left">{$REFERENCE}</p>
</div>
{% elseIf ($REFERENCE) %}
<div>
<p class="left bold">GUID</p>
</div>
<div id="guid">
<p class="small left">{$REFERENCE}</p>
</div>
{% endif %}
{% if ($RRN) %}
<div>
<p class="left bold">{$RRN_I18N}</p>
</div>
<div id="rrn">
<p class="small left">{$RRN}</p>
</div>
{% endif %}
<div class="separator dotted" style="margin-top: 10px; height: 2px; margin-bottom: 10px;"></div>
{% if ($RECEIPT_TYPE_DESCRIPTION) %}
<div id="receipt_type_description">
<p class="center">{$RECEIPT_TYPE_DESCRIPTION}</p>
</div>
{% endif %}
<div class="separator solid" style="margin-top: 10px; height: 2px; margin-bottom: 10px;"></div>
{% if ($SWIPE != 1) %}
{% if ($TVR != null || $AID != null || $IAD != null || $TSI != null || $ARC != null) %}
<div>
<p class="center bold">{$EMV_DETAILS_I18N}</p>
</div>
{% endif %}
{% if ($AID) %}
<div id="aid">
<label class="small left bold">{$AID_I18N}</label>
<span class="left">{$AID}</span>
</div>
{% endif %}
{% if ($TVR) %}
<div id="tvr">
<label class="small left bold">{$TVR_I18N}</label>
<span class="left">{$TVR}</span>
</div>
{% endif %}
{% if ($IAD) %}
<div id="iad">
<label class="small left bold">{$IAD_I18N}</label>
<span class="left">{$IAD}</span>
</div>
{% endif %}
{% if ($TSI) %}
<div id="tsi">
<label class="small left bold">{$TSI_I18N}</label>
<span class="left">{$TSI}</span>
</div>
{% endif %}
{% if ($ARC) %}
<div id="arc">
<label class="small left bold">{$ARC_I18N}</label>
<span class="left">{$ARC}</span>
</div>
{% endif %}
{% if ($TVR != null || $AID != null || $IAD != null || $TSI != null || $ARC != null) %}
<div class="separator solid" style="margin-top: 10px; height: 2px; margin-bottom: 10px;"></div>
{% endif %}
{% endif %}
</main>
<footer>
{% if ($SUCCESS_RESPONSE != 1 && $RESPONSE != $ERROR_MESSAGE) %}
<div id="error_message">
<p class="large center">{$ERROR_MESSAGE}</p>
</div>
<div class="separator solid" style="margin-top: 10px; height: 2px; margin-bottom: 10px;"></div>
{% endif %}
<div class="separator" style="margin-top: 20px; margin-bottom: 20px;"></div>
{% if ($SIGNATURE ) %}
<div id="signature">
<img class="center" src="{$SIGNATURE}" />
</div>
<div class="separator solid" style="margin-top: 10px; height: 2px; margin-bottom: 10px;"></div>
{% endif %}
</footer>
</body>
</html>
This is how it looks rendered as HTML in the mPOS Handpoint app:
And this the PAX printed version of it:
Copyright 2018 Handpoint