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
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
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.
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" + "¤cy=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" + "¤cy=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" + "¤cy=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" . "¤cy=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" + "¤cy=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" + "¤cy=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")
Full Documentation
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.
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.
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.
Merchant Account Pricing
- 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
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.netSmall 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.