iFrame
Embed payment pages via iFrame.
The iFrame integration allows you to display a zahls.ch tool within your website. All you need to do is copy the code snippets onto your website.
Integration
Examples
Payment Page from Pages Tool
<iframe
src="https://{INSTANCE_NAME}.zahls.ch/pay?tid={PAYMENT_TEMPLATE_ID}"
width="530"
height="700"
allow="payment *">
</iframe>
- INSTANCE_NAME - Name of the payment instance
- PAYMENT_TEMPLATE_ID - Page ID of a payment Page: Pages Tool
Payment Page with Terminal
<iframe
src="https://{INSTANCE_NAME}.zahls.ch/vpos"
width="530"
height="700"
allow="payment *">
</iframe>
- INSTANCE_NAME - Name of the payment instance
Advanced
An embedded zahls.ch-iFrame sends messages to the page. These messages can be caught and processed. The following example shows how the messages can be caught.
var iFrame = jQuery('iframe');
var postMessage = function(e) {
if (typeof e.data === 'string') {
try {
var data = JSON.parse(e.data);
} catch (e) {}
if (data && data.zahls) {
jQuery.each(data.zahls, function(name, value) {
switch (name) {
// implement functions here
}
});
}
}
};
iFrame.on('load', function() {
jQuery(this)[0].contentWindow.postMessage(JSON.stringify({origin: window.location.origin}), iFrame.attr('src'));
});
window.addEventListener('message', postMessage, false);
There are four types of messages:
- height: Used to dynamically set the height of the iFrame so that there is no need to scroll inside the iFrame. You should not set the param appview if you want a dynamic height!
- top: If you have the dynamic height functionality implemented, you probably need to implement the scroll functionality to have the page scrolled if necessary. (e.g. on "Add to cart" button or on "Go to checkout").
- transaction: For all the transaction data, like the status, you can receive the transaction object.
- closeModal: Handle the iFrame close event. The value contains the redirect URL which you can use to lead the customer from the page with the iFrame to the according page. The iFrame is not allowed to make redirections on your site, therefore you need execute this redirection yourself.
Here you go with a full code example:
var iFrame = jQuery('iframe');
var transaction = null;
var lastPostMessageHeight = 0;
var updateIframeHeight = function() {
var height = lastPostMessageHeight;
// This can be changed individually.
// Currently the full height is only applied for big displays (> 590px in width)
if (window.innerWidth <= 590) {
iFrame.css('height', '100%');
} else if (height) {
iFrame.css('height', height + 'px');
}
};
var scrollPage = function(offset) {
var positionToScrollTo = iFrame.position().top + offset;
jQuery('body, html').animate({scrollTop: positionToScrollTo}, 1000, 'linear', function() {
jQuery(window).trigger('scroll')
});
};
var postMessage = function(e) {
if (typeof e.data === 'string') {
try {
var data = JSON.parse(e.data);
} catch (e) {}
if (data && data.zahls) {
jQuery.each(data.zahls, function(name, value) {
switch (name) {
// Adjust the height of the iFrame
case 'height':
lastPostMessageHeight = parseInt(value);
updateIframeHeight();
break;
// Scroll the page to a given point
case 'top':
scrollPage(parseInt(value));
break;
// Retrieve the transaction
case 'transaction':
if (typeof value === 'object') {
transaction = value;
}
break;
// Redirect from page with iFrame to given URL
case 'closeModal':
window.location.href = value;
break;
}
});
}
}
};
window.addEventListener('message', postMessage, false);
iFrame.on('load', function() {
jQuery(this)[0].contentWindow.postMessage(JSON.stringify({origin: window.location.origin}), iFrame.attr('src'));
jQuery(window).resize(updateIframeHeight);
updateIframeHeight();
});
var t;
jQuery(window).scroll(function(event) {
window.clearTimeout(t);
t = window.setTimeout(function() {
iFrame[0].contentWindow.postMessage(JSON.stringify({scrollTopShoppingCart: jQuery(window).scrollTop() - iFrame.position().top}), iFrame.attr('src'));
}, 100);
});