Contact one of our friendly advisors today

Start accepting Payments on your website with our smarter payment system

Seamlessly process online payments in all card brands and in over 200 alternative payment methods.

Quaife Payments

Being able to accept online payments may help your business grow. With Quaife online payments you can accept payments through your website, by phone (via a virtual terminal) and through links on email invoices.

Our various online payment options accept all major credit and debit cards, provide access to a range of fraud screening tools and allow you to choose how you want to integrate your website to the payment gateway, depending on the requirements of your business

Global Coverage

Payment Gateway

Our Payment Gateway allows you to log into your merchant account, view all of your transactions, issue refunds, view payment analytics and edit fraud prevention settings.

Pay by link Provide your customers with a link, that they can click and pay instantly
Pay by Invoice Send invoices to your clients with our checkout link directly from the Payment
Online Checkout Integrate our payment methods by server to server, Payment Widget or web redirect
Mobile Checkout Add our Payment Checkout to your App (iOS, Android and Windows)
Virtual Terminal Take payments over the telephone and enter directly into the payment gateway for processing

Get Started

Integration

At Quaife, it is our belief that integrations should be as simple and painless as possible.

Every integration is different and comes with it’s own issues and solutions. Our dedicated support team will help guide you through this process as quickly and efficiently as possible to get your payments up-and-running and get you processing transactions with ease.

Follow the 3 easy steps below to get stated intergrating your payment gateway.

1 Prepare the checkout

First, perform a server-to-server POST request to prepare the checkout with the required data, including the order type, amount and currency. The response to a successful request is a JSON string with an id, which is required in the second step to create the payment form.

curl https://test.oppwa.com/v1/checkouts \ 
-d "entityId=8a82941756a2ab6f0156c1726c0b4d22" \ 
-d "amount=92.00" \ 
-d "currency=EUR" \ 
-d "paymentType=DB" \ 
-H "Authorization: Bearer OGE4Mjk0MTc1NmEyYWI2ZjAxNTZjMTcyNmQ3NTRkMjZ8Rk1EOVdSRTRocQ=="
public Dictionary<string, dynamic> Request() {
	Dictionary<string, dynamic> responseData;
	string data="entityId=8a82941756a2ab6f0156c1726c0b4d22" +
		"&amount=92.00" +
		"&currency=EUR" +
		"&paymentType=DB";
	string url = "https://test.oppwa.com/v1/checkouts";
	byte[]  buffer = Encoding.ASCII.GetBytes(data);
	HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
	request.Method = "POST";
        request.Headers["Authorization"] = "Bearer OGE4Mjk0MTc1NmEyYWI2ZjAxNTZjMTcyNmQ3NTRkMjZ8Rk1EOVdSRTRocQ==";
	request.ContentType = "application/x-www-form-urlencoded";
	Stream PostData = request.GetRequestStream();
	PostData.Write(buffer, 0, buffer.Length);
	PostData.Close();
	using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
	{
	    Stream dataStream = response.GetResponseStream();
	    StreamReader reader = new StreamReader(dataStream);
	    var s = new JavaScriptSerializer();
	    responseData = s.Deserialize<Dictionary<string, dynamic>>(reader.ReadToEnd());
	    reader.Close();
	    dataStream.Close();
	}
	return responseData;
}

responseData = Request()["result"]["description"];
import groovy.json.JsonSlurper

public static String request() {
  def data = "entityId=8a82941756a2ab6f0156c1726c0b4d22" +
  "&amount=92.00" +
  "&currency=EUR" +
  "&paymentType=DB"
  def url = "https://test.oppwa.com/v1/checkouts".toURL()
  def connection = url.openConnection()
  connection.setRequestMethod("POST")
  connection.setRequestProperty("Authorization","Bearer OGE4Mjk0MTc1NmEyYWI2ZjAxNTZjMTcyNmQ3NTRkMjZ8Rk1EOVdSRTRocQ==")
  connection.doOutput = true
  connection.outputStream << data
  def json = new JsonSlurper().parseText(connection.inputStream.text)
  json
}
println request()
private String request() throws IOException {
	URL url = new URL("https://test.oppwa.com/v1/checkouts");

	HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
	conn.setRequestMethod("POST");
        conn.setRequestProperty("Authorization", "Bearer OGE4Mjk0MTc1NmEyYWI2ZjAxNTZjMTcyNmQ3NTRkMjZ8Rk1EOVdSRTRocQ==");
	conn.setDoInput(true);
	conn.setDoOutput(true);

	String data = ""
		+ "entityId=8a82941756a2ab6f0156c1726c0b4d22"
		+ "&amount=92.00"
		+ "&currency=EUR"
		+ "&paymentType=DB";

	DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
	wr.writeBytes(data);
	wr.flush();
	wr.close();
	int responseCode = conn.getResponseCode();
	InputStream is;

	if (responseCode >= 400) is = conn.getErrorStream();
	else is = conn.getInputStream();

	return IOUtils.toString(is);
}
var https = require('https');
var querystring = require('querystring');

function request(callback) {
	var path='/v1/checkouts';
	var data = querystring.stringify( {
		'entityId':'8a82941756a2ab6f0156c1726c0b4d22',
		'amount':'92.00',
		'currency':'EUR',
		'paymentType':'DB'
	});
	var options = {
		port: 443,
		host: 'https://test.oppwa.com',
		path: path,
		method: 'POST',
		headers: {
			'Content-Type': 'application/x-www-form-urlencoded',
			'Content-Length': data.length,
			'Authorization':'Bearer OGE4Mjk0MTc1NmEyYWI2ZjAxNTZjMTcyNmQ3NTRkMjZ8Rk1EOVdSRTRocQ=='
		}
	};
	var postRequest = https.request(options, function(res) {
		res.setEncoding('utf8');
		res.on('data', function (chunk) {
			jsonRes = JSON.parse(chunk);
			return callback(jsonRes);
		});
	});
	postRequest.write(data);
	postRequest.end();
}
	
request(function(responseData) {
	console.log(responseData);
});
function request() {
	$url = "https://test.oppwa.com/v1/checkouts";
	$data = "entityId=8a82941756a2ab6f0156c1726c0b4d22" .
                "&amount=92.00" .
                "&currency=EUR" .
                "&paymentType=DB";

	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                   'Authorization:Bearer OGE4Mjk0MTc1NmEyYWI2ZjAxNTZjMTcyNmQ3NTRkMjZ8Rk1EOVdSRTRocQ=='));
	curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// this should be set to true in production
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	$responseData = curl_exec($ch);
	if(curl_errno($ch)) {
		return curl_error($ch);
	}
	curl_close($ch);
	return $responseData;
}
$responseData = request();
import urllib, urllib2, json

def request():
	url = "https://test.oppwa.com/v1/checkouts"
	data = {
		'entityId' : '8a82941756a2ab6f0156c1726c0b4d22',
		'amount' : '92.00',
		'currency' : 'EUR',
		'paymentType' : 'DB'
	}
	try:
		opener = urllib2.build_opener(urllib2.HTTPHandler)
		request = urllib2.Request(url, data=urllib.urlencode(data))
		request.add_header('Authorization', 'Bearer OGE4Mjk0MTc1NmEyYWI2ZjAxNTZjMTcyNmQ3NTRkMjZ8Rk1EOVdSRTRocQ==')
		request.get_method = lambda: 'POST'
		response = opener.open(request)
		return json.loads(response.read());
	except urllib2.HTTPError, e:
		return e.code;

responseData = request();
print responseData;
require 'net/https'
require 'uri'
require 'json'

def request()
	uri = URI('https://test.oppwa.com/v1/checkouts')
	http = Net::HTTP.new(uri.host, uri.port)
	http.use_ssl = true
	req = Net::HTTP::Post.new(uri.path)
	req.set_form_data({
		'entityId' => '8a82941756a2ab6f0156c1726c0b4d22',
		'amount' => '92.00',
		'currency' => 'EUR',
		'paymentType' => 'DB'
	})
	res = http.request(req)
	return JSON.parse(res.body)
end

puts request()
def initialPayment : String = {
	val url = "https://test.oppwa.com/v1/checkouts"
	val data = (""
		+ "entityId=8a82941756a2ab6f0156c1726c0b4d22"
		+ "&amount=92.00"
		+ "&currency=EUR"
		+ "&paymentType=DB"
	)
	val conn = new URL(url).openConnection()

	conn match {
		case secureConn: HttpsURLConnection  => secureConn.setRequestMethod("POST")
		case _ => throw new ClassCastException
	}
	conn.setDoInput(true)
	conn.setDoOutput(true)
	IOUtils.write(data, conn.getOutputStream())
	conn.setRequestProperty("Authorization", "Bearer OGE4Mjk0MTc1NmEyYWI2ZjAxNTZjMTcyNmQ3NTRkMjZ8Rk1EOVdSRTRocQ==")
	conn.connect()
	if (conn.getResponseCode() >= 400) {
		return IOUtils.toString(conn.getErrorStream())
	}
	else {
		return IOUtils.toString(conn.getInputStream())
	}
}
Public Function Request() As Dictionary(Of String, Object)
	Dim url As String = "https://test.oppwa.com/v1/checkouts"
	Dim data As String = "" +
		"entityId=8a82941756a2ab6f0156c1726c0b4d22" +
		"&amount=92.00" +
		"&currency=EUR" +
		"&paymentType=DB"

	Dim req As WebRequest = WebRequest.Create(url)
	req.Method = "POST"
        req.Headers.Add("Authorization", "Bearer OGE4Mjk0MTc1NmEyYWI2ZjAxNTZjMTcyNmQ3NTRkMjZ8Rk1EOVdSRTRocQ==")
	req.ContentType = "application/x-www-form-urlencoded"
	Dim byteArray As Byte() = Encoding.UTF8.GetBytes(data)
	req.ContentLength = byteArray.Length
	Dim dataStream As Stream = req.GetRequestStream()
	dataStream.Write(byteArray, 0, byteArray.Length)
	dataStream.Close()
	Dim res As WebResponse = req.GetResponse()
	Dim resStream = res.GetResponseStream()
	Dim reader As New StreamReader(resStream)
	Dim response As String = reader.ReadToEnd()
	reader.Close()
	resStream.Close()
	res.Close()
	Dim jss As New System.Web.Script.Serialization.JavaScriptSerializer()
	Dim dict As Dictionary(Of String, Object) = jss.Deserialize(Of Dictionary(Of String, Object))(response)

	Return dict
End Function

responseData = Request()("result")("description")
For a full list of parameters that can be sent in the prepare checkout request, check the documentation links below:
Full Documentation
2 Create the payment form

To create the payment form you just need to add the following lines of HTML/JavaScript to your page and populating the following variables.

i. The checkout's id that you get in the response from step 1

<script src="https://test.oppwa.com/v1/paymentWidgets.js?checkoutId={checkoutId}"></script>

ii. The shopperResultUrl, which is the page on your site where the customer should be redirected to after the payment is processed and the brands that will be available.

<form action="{shopperResultUrl}" class="paymentWidgets" data-brands="VISA MASTER AMEX"></form>

View the customization guide for more information on customizing the payment form.

3 Get the payment status

Once the payment has been processed, the customer is redirected to your shopperResultUrl along with a GET parameter resourcePath.

Important: The baseUrl must end in a "/", e.g. "https://test.oppwa.com/".

Then, to get the status of the payment, you should make a GET request to the baseUrl + resourcePath, including your authentication parameters.

Example of a resourcePath:

resourcePath=/v1/checkouts/{checkoutId}/payment
https://test.oppwa.com/v1/checkouts/8a82944a4cc25ebf014cc2c782423202/payment
curl -G https://test.oppwa.com/v1/checkouts/{id}/payment \
 -d "entityId=8a82941756a2ab6f0156c1726c0b4d22" \
 -H "Authorization: Bearer OGE4Mjk0MTc1NmEyYWI2ZjAxNTZjMTcyNmQ3NTRkMjZ8Rk1EOVdSRTRocQ=="
public Dictionary<string, dynamic> Request() {
	Dictionary<string, dynamic> responseData;
	string data="entityId=8a82941756a2ab6f0156c1726c0b4d22";
	string url = "https://test.oppwa.com/v1/checkouts/{id}/payment?" + data;
	HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
	request.Method = "GET";
        request.Headers["Authorization"] = "Bearer OGE4Mjk0MTc1NmEyYWI2ZjAxNTZjMTcyNmQ3NTRkMjZ8Rk1EOVdSRTRocQ==";
	using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
	{
	    Stream dataStream = response.GetResponseStream();
	    StreamReader reader = new StreamReader(dataStream);
	    var s = new JavaScriptSerializer();
	    responseData = s.Deserialize<Dictionary<string, dynamic>>(reader.ReadToEnd());
	    reader.Close();
	    dataStream.Close();
	}
	return responseData;
}

responseData = Request()["result"]["description"];
import groovy.json.JsonSlurper

public static String request() {
  def data = "entityId=8a82941756a2ab6f0156c1726c0b4d22"
  def url = ("https://test.oppwa.com/v1/checkouts/{id}/payment?" + data).toURL()
  def connection = url.openConnection()
  connection.setRequestMethod("GET")
  connection.setRequestProperty("Authorization","Bearer OGE4Mjk0MTc1NmEyYWI2ZjAxNTZjMTcyNmQ3NTRkMjZ8Rk1EOVdSRTRocQ==")
  def json = new JsonSlurper().parseText(connection.inputStream.text)
  json
}
println request()
private String request() throws IOException {
	URL url = new URL("https://test.oppwa.com/v1/checkouts/{id}/payment		"&entityId=8a82941756a2ab6f0156c1726c0b4d22");

	HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
	conn.setRequestMethod("GET");
        conn.setRequestProperty("Authorization", "Bearer OGE4Mjk0MTc1NmEyYWI2ZjAxNTZjMTcyNmQ3NTRkMjZ8Rk1EOVdSRTRocQ==");
	int responseCode = conn.getResponseCode();
	InputStream is;

	if (responseCode >= 400) is = conn.getErrorStream();
	else is = conn.getInputStream();

	return IOUtils.toString(is);
}
var https = require('https');
var querystring = require('querystring');

function request(callback) {
	var path='/v1/checkouts/{id}/payment';
	path += '?entityId=8a82941756a2ab6f0156c1726c0b4d22';
	var options = {
		port: 443,
		host: 'https://test.oppwa.com',
		path: path,
		method: 'GET',
		headers: {
			'Authorization':'Bearer OGE4Mjk0MTc1NmEyYWI2ZjAxNTZjMTcyNmQ3NTRkMjZ8Rk1EOVdSRTRocQ=='
		}
	};
	var postRequest = https.request(options, function(res) {
		res.setEncoding('utf8');
		res.on('data', function (chunk) {
			jsonRes = JSON.parse(chunk);
			return callback(jsonRes);
		});
	});
	postRequest.end();
}
	
request(function(responseData) {
	console.log(responseData);
});
function request() {
	$url = "https://test.oppwa.com/v1/checkouts/{id}/payment";
	$url .= "?entityId=8a82941756a2ab6f0156c1726c0b4d22";

	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                   'Authorization:Bearer OGE4Mjk0MTc1NmEyYWI2ZjAxNTZjMTcyNmQ3NTRkMjZ8Rk1EOVdSRTRocQ=='));
	curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// this should be set to true in production
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	$responseData = curl_exec($ch);
	if(curl_errno($ch)) {
		return curl_error($ch);
	}
	curl_close($ch);
	return $responseData;
}
$responseData = request();
import urllib, urllib2, json

def request():
	url = "https://test.oppwa.com/v1/checkouts/{id}/payment"
	url += '?entityId=8a82941756a2ab6f0156c1726c0b4d22'
	try:
		opener = urllib2.build_opener(urllib2.HTTPHandler)
		request = urllib2.Request(url, data='')
		request.add_header('Authorization', 'Bearer OGE4Mjk0MTc1NmEyYWI2ZjAxNTZjMTcyNmQ3NTRkMjZ8Rk1EOVdSRTRocQ==')
		request.get_method = lambda: 'GET'
		response = opener.open(request)
		return json.loads(response.read());
	except urllib2.HTTPError, e:
		return e.code;

responseData = request();
print responseData;
require 'net/https'
require 'uri'
require 'json'

def request()
	path = ("?entityId=8a82941756a2ab6f0156c1726c0b4d22")
	uri = URI.parse('https://test.oppwa.com/v1/checkouts/{id}/payment' + path)
	http = Net::HTTP.new(uri.host, uri.port)
	http.use_ssl = true
	req = Net::HTTP::Get.new(uri)
	req['Authorization'] = 'Bearer OGE4Mjk0MTc1NmEyYWI2ZjAxNTZjMTcyNmQ3NTRkMjZ8Rk1EOVdSRTRocQ=='
	http.request(req)
	return JSON.parse(res.body)
end

puts request()
def initialPayment : String = {
	val url = "https://test.oppwa.com/v1/checkouts/{id}/payment"
	url +="?entityId=8a82941756a2ab6f0156c1726c0b4d22"
	val conn = new URL(url).openConnection()

	conn match {
		case secureConn: HttpsURLConnection  => secureConn.setRequestMethod("GET")
		case _ => throw new ClassCastException
	}
	conn.setRequestProperty("Authorization", "Bearer OGE4Mjk0MTc1NmEyYWI2ZjAxNTZjMTcyNmQ3NTRkMjZ8Rk1EOVdSRTRocQ==")
	conn.connect()
	if (conn.getResponseCode() >= 400) {
		return IOUtils.toString(conn.getErrorStream())
	}
	else {
		return IOUtils.toString(conn.getInputStream())
	}
}
Public Function Request() As Dictionary(Of String, Object)
	Dim url As String = "https://test.oppwa.com/v1/checkouts/{id}/payment" +
		"?entityId=8a82941756a2ab6f0156c1726c0b4d22"

	Dim req As WebRequest = WebRequest.Create(url)
	req.Method = "GET"
        req.Headers.Add("Authorization", "Bearer OGE4Mjk0MTc1NmEyYWI2ZjAxNTZjMTcyNmQ3NTRkMjZ8Rk1EOVdSRTRocQ==")
	req.ContentType = "application/x-www-form-urlencoded"
	Dim res As WebResponse = req.GetResponse()
	Dim resStream = res.GetResponseStream()
	Dim reader As New StreamReader(resStream)
	Dim response As String = reader.ReadToEnd()
	reader.Close()
	resStream.Close()
	res.Close()
	Dim jss As New System.Web.Script.Serialization.JavaScriptSerializer()
	Dim dict As Dictionary(Of String, Object) = jss.Deserialize(Of Dictionary(Of String, Object))(response)

	Return dict
End Function

responseData = Request()("result")("description")

IMPORTANT: A throttling rule applies for get payment status calls. Per checkout, it is allowed to send two get payment requests in a minute.

We recommend that you verify the following fields from the Payment Status response, by comparing the returned values with expected:

  • ID(s)
  • Amount
  • Currency
  • Brand
  • Type

Payment Security

Payment Gateway that’s fully PCI DSS Level 1 certified and is a member of the PCI Initiative.

Our data recovery sites and two active redundant data centres make sure that our clients have a highly secure and resilient payment service with 99.99% availability.

Fraud Prevention

Quaife.net’s internal risk offering includes more than 120 risk checks, easily configured within our user interface, the Business Intelligence Platform. For an even simpler solution, our payment experts have devised OneClickSafe, three bundled fraud prevention options - smart, advanced, and excellent - that can be selected or changed with just one click. Some of our more popular individual internal fraud prevention options include:

  • 3D Secure
  • Alternative Payment Method
  • Selection
  • Black and whitelisting
  • Geo IP location checks
  • Velocity checks
  • Device fingerprinting

Third party
fraud prevention

For payment providers focused on industries that need specialised risk checks or those that simply want additional layers of security,

Quaife.net offers simple and rapid routing to nearly two dozen fraud prevention providers. In addition, with Fraud Preventer on Demand, we will quickly connect to any third party provider not yet in our network.

Get Started

Mobile SDK

Mobile SDK makes it easy to accept payments in your mobile app on iOS and Android platforms.

The links to the guides below show you how to integrate in-app payments into your mobile shop or build a wallet-style app. The Mobile SDK takes care of the complexity: it routes the payment correctly to your account and handles the interaction with the payment gateway.

iOS Setup   Android Setup

Merchant Account Pricing

Standard Pricing
1.65% + £0.12 Per Transaction*
  • Additional fees will apply to transactions from cards issued outside of the EU/EEA
  • A flat £25 fee is assessed for chargebacks
  • For merchants that have their own American Express account, Quaife can pass through American Express transactions at a cost of £0.12 per transaction with no additional fees.
  • Discounted rates are available for business processing over £50k per month
  • Interchange plus pricing is also available for merchants in Europe
Custom Pricing
Tailored pricing based on volume and business model. Call, email, or submit the form for information on custom quotes.

Bespoke pricing is available for merchants processing over £500,000 per month. Schedule a call with a member of our team.

+44 (0) 330 043 1516 contact@quaife.net

Small Print: There is a minimum monthly fee of £100.00 meaning you pay no monthly fee if your transaction fees are greater than £100.00.