Applies to: Point of Sale API - iOS | Point of Sale API - Android
Learn how to open the Square Point of Sale application from a custom mobile web application to process in-person payments using Square hardware.
Requirements and limitations
You've read the introductory review of this API.
You're familiar with basic web development. If you're new to web development, you should read Getting started with the Web by Mozilla.org before continuing.
You can create and run websites on localhost or a development server. If you're new to testing web pages locally, you should read Testing for supported countries before continuing.
You're familiar with HTTP and JSON.
You're building a mobile web application for POS transactions. If you're building a native mobile application, see Build on Android or Build on iOS.
The mobile web application uses JavaScript and HTML.
1. Install the Square Point of Sale application
Install the latest version of the Square Point of Sale application from the Google Play Store (Android) or the Apple App Store (iOS).
2. Configure your web callback URL
You need to go into the Developer Console and set the callback URL in the application. Your callback URL is where the Point of Sale API sends notifications and payment information. For example:
https://your-web-app.com/path/to/your/callback/
Note that /path/to/your/callback
should be the path to the code that processes notifications and transaction information received from the Square Point of Sale application.
To register your callback URL:
- In the Developer Console, choose your application, and then choose Point of Sale API in the left pane.
- In the Web section, enter your Web Callback URL.
- Choose Save.
3. Add code to initiate a transaction from your mobile web application
Mobile web transactions are initiated by choosing a link to the Square Point of Sale application. Because the request URL includes details about the transaction, you should build the URL dynamically instead of hardcoding it. The link URL includes the transaction information as parameters and is formatted differently for Android and iOS applications.
Initiate a mobile web transaction on Android
Square Point of Sale application request URLs for Android are formatted as intent requests. For example:
<a href="intent:#Intent;
action=com.squareup.pos.action.CHARGE;
package=com.squareup;
S.browser_fallback_url=https://my.website.com/index.html;
S.com.squareup.pos.WEB_CALLBACK_URI=https://my.website.com/index.html;
S.com.squareup.pos.CLIENT_ID=sq0ids-yourClientId;
S.com.squareup.pos.API_VERSION=v2.0;
i.com.squareup.pos.TOTAL_AMOUNT=100;
S.com.squareup.pos.CURRENCY_CODE=USD;
S.com.squareup.pos.TENDER_TYPES=com.squareup.pos.TENDER_CARD,com.squareup.pos.TENDER_CASH;
end">Start Transaction</a>
Android requires URLs to be wrapped with Android start and end tokens when they contain key-value pairs delimited with semicolons. The Android start and end tokens are intent:#Intent;
and end
.
To build your request URL:
- Create a JavaScript file called open_pos.js.
Add code to define some useful constants, configure your mobile web application, and set the transaction total.
var callbackUrl = "{YOUR CALLBACK URL}";
var applicationId = "{YOUR APPLICATION ID}";
var transactionTotal = "{TRANSACTION TOTAL}";
var currencyCode = "USD";
var sdkVersion = "v2.0";
Add code to build the request URL. For a detailed list of all possible URL parameters, see Mobile Web Technical Reference.
function openURL(){
// Configure the allowable tender types
var tenderTypes =
"com.squareup.pos.TENDER_CARD, \
com.squareup.pos.TENDER_CARD_ON_FILE, \
com.squareup.pos.TENDER_CASH, \
com.squareup.pos.TENDER_OTHER";
var posUrl =
"intent:#Intent;" +
"action=com.squareup.pos.action.CHARGE;" +
"package=com.squareup;" +
"S.com.squareup.pos.WEB_CALLBACK_URI=" + callbackUrl + ";" +
"S.com.squareup.pos.CLIENT_ID=" + applicationId + ";" +
"S.com.squareup.pos.API_VERSION=" + sdkVersion + ";" +
"i.com.squareup.pos.TOTAL_AMOUNT=" + transactionTotal + ";" +
"S.com.squareup.pos.CURRENCY_CODE=" + currencyCode + ";" +
"S.com.squareup.pos.TENDER_TYPES=" + tenderTypes + ";" +
"end";
window.open(posUrl);
}
Add the following script tag to your HTML head to load your open_pos.js file:
<head>
<script type="text/javascript" src="/open_pos.js"></script>
</head>
Add a button to your mobile web application that runs open-POS.js.
<button onclick="openUrl()">
Start Transaction
</button>```
Initiate a mobile web transaction on iOS
To initiate a Square Point of Sale transaction from your website, call the Square Point of Sale application with a URL using the following format:
square-commerce-v1://payment/create?data={REPLACE ME}
Add code to create a percent-encoded JSON object that contains the information that the Square Point of Sale application needs to process the transaction request.
<script>
var dataParameter = {
amount_money: {
amount: "500",
currency_code: "USD"
},
callback_url: "https://www.example.com",
client_id: "MY_APPLICATION_ID",
version: "1.3",
notes: "notes for the transaction",
options: {
supported_tender_types: ["CREDIT_CARD","CASH","OTHER","SQUARE_GIFT_CARD","CARD_ON_FILE"]
}
};
window.location =
"square-commerce-v1://payment/create?data=" +
encodeURIComponent(JSON.stringify(dataParameter));
</script>
Did you know?
Information in the notes
field is saved in the Square Dashboard and printed on receipts.
4. Add code to your callback file to process the transaction response
When the transaction completes and the device reactivates the mobile web application, the Square Point of Sale application sends a POST request to your mobile web application. The POST parameters provide information about whether the associated transaction succeeded or failed along with its accompanying metadata.
You need to add code to the callback file that processes the result:
- Declare your parameters.
- Process the result from Square.
- Print the result to the screen.
You add code to your callback file to process the response from the Square Point of Sale application. If you don't already have a callback file, you can make a file called callback.html and paste it in the following template:
<html>
<head>
<script type="text/javascript" src="/callback.js"></script>
</head>
<body onload="printResponse()">
<h1>Callback!</h1>
<div id="url">
</div>
</body>
</html>
Initialize your transaction variables
Make a file called callback.js. This is where you put your JavaScript code that handles the response. In your callback.js file, declare the possible parameter keys that the Square Point of Sale application might return to your application.
For Android devices, you need to declare the following variables:
const clientTransactionId = "com.squareup.pos.CLIENT_TRANSACTION_ID";
const transactionId = "com.squareup.pos.SERVER_TRANSACTION_ID";
const errorField = "com.squareup.pos.ERROR_CODE";
For iOS devices, you need to declare the following variables:
const clientTransactionId = "client_transaction_id";
const transactionId = "transaction_id";
const errorField = "error_code";
The Square Point of Sale application packages the transaction details differently for iOS and Android devices.
Square Point of Sale applications installed on Android devices send the transaction results back as parameters in a URL.
Add a function called getUrlParams
that grabs the URL parameters and puts them in an array.
function getUrlParams(URL) {
var vars = {};
var parts = URL.replace(/[?&]+([^=&]+)=([^&]*)/gi,
function(m,key,value) {
vars[key] = value;
});
return vars;
}
Square Point of Sale applications installed on IOS devices send back a URL with a single parameter called data
, which contains the transaction details in a JSON block.
function getTransactionInfo(URL) {
var data = decodeURI(URL.searchParams.get("data"));
console.log("data: " + data);
var transactionInfo = JSON.parse(data);
return transactionInfo;
}
Depending on the result of the transaction, the data
object includes some or all of the following fields.
If an error occurs during a Point of Sale API transaction, the JSON data object returns the error_code
field.
Do something with the transaction details
Add functions that handle the success and error responses. If it's successful, handleSuccess()
saves the parameters to resultString
. If it's an error, handleError()
saves the error code and description to a resultString
.
function handleSuccess(transactionInfo){
var resultString ="";
if (clientTransactionId in transactionInfo) {
resultString += "Client Transaction ID: " + transactionInfo[clientTransactionId] + "<br>";
}
if (transactionId in transactionInfo) {
resultString += "Transaction ID: " + transactionInfo[transactionId] + " <br>";
}
else {
resultString += "Transaction ID: NO CARD USED<br>";
}
return resultString;
}
function handleError(transactionInfo){
var resultString ="";
if (errorField in transactionInfo) {
resultString += "Client Transaction ID: " + transactionInfo[clientTransactionId] + "<br>";
}
if (transactionId in transactionInfo) {
resultString += "Transaction ID: " + transactionInfo[transactionId] + " <br>";
}
else {
resultString += "Transaction ID: PROCESSED OFFLINE OR NO CARD USED<br>";
}
return resultString;
}
Add a function that grabs the URL returned by Square and grabs the URL parameters using getUrlParams()
. It then uses an if
statement to call the correct handler and prints the resultString
.
function printResponse() {
var responseUrl = window.location.href;
var transactionInfo = getTransactionInfo(responseUrl);
var resultString = "";
if (errorField in transactionInfo) {
resultString = handleError(transactionInfo);
} else {
resultString = handleSuccess(transactionInfo);
}
document.getElementById('url').innerHTML = resultString;
}
For more information about Android and iOS error codes, see Mobile Web Technical Reference.
Did you know?
Your application should keep track of whether a Point of Sale API request has been issued and whether a callback has been received. Because of the constraints of application-switching APIs, sellers can leave Square Point of Sale during an API request and return to your application. It's your responsibility to direct them to return to Square and finish the transaction.
- Initialize the Point of Sale application before testing your first transaction:
- Sign in to the Square Point of Sale application with the business location and employee you want to accept payments.
- If you're using the Square Contactless and Chip Reader, connect it to the Square Point of Sale application. You get an error if you call the Point of Sale API without initializing the Point of Sale application first.
- Open your web application in an emulator or on your mobile device, and then choose Start transaction to open the Point of Sale application.
- To test the cancellation callback, cancel the transaction in the Point of Sale application.
- To test the success callback, complete a cash payment, and then choose the checkmark to indicate you're done.
You cannot install the Square Point of Sale application on a virtual Xcode machine. For this reason, you need to test your code on a real iOS device. You can test your code that processes the data by creating a test response URL instead of receiving it from Square.
Add a test URL to your callback code.
const responseUrl = new URL(
'/create?data={' +
'"transaction_id":"transaction123",' +
'"client_transaction_id":"40",' +
'"status":"ok"' +
'}',
'https://squareup.com'
);
Comment out the line in printResponse()
that gets the response URL from Square.