New
Web Payments SDK

Take a Card Payment with Web Payments SDK

Use the Web Payments SDK Quickstart sample project to set up a web application integrated with the Square Web Payments SDK for taking payments.

The Card payment method rendered in a web page: web payments single line entry

Overview Permalink Get a link to this section

To accept a card payment from a buyer, you need a web client where the buyer enters payment card information and a backend that takes a payment with the card. The SDK produces a secure one-time use payment token based on the card. Your web client sends the payment token to your backend where the payment is taken. In summary, a payment is taken with these steps:

  1. Generate a payment token. Use the Web Payments SDK client library to render a card entry form and generate a token that your web client sends to your backend server.

  2. Create a payment with the token. On your backend, use the Square Payments API to create a payment.

This topic shows you where to add HTML and JavaScript to your web client to integrate the Web Payments SDK and take a payment on your backend.

You can find a full example of the Card payment code in GitHub.

Did you know?

You should complete this example using the GitHub project before you attempt to integrate the Web Payments SDK into your project.

Clone the quickstart project template Permalink Get a link to this section

Start by cloning the quickstart project template into a folder on your computer.

Test the application

The project template is not initially integrated with the SDK and does not render the card payment form.

  1. Follow the GitHub repo README instructions to get the development server running.

  2. Open a browser to http://localhost:3000 to verify that the server is running.

    Your web page looks like the following page: web payments sample hello world

Checkpoint 1: If your web page renders as shown in the previous image, you are ready to write the code that adds the Card payment method to the page.

The walkthrough asks you to update the code in these project files:

  • The public/index.html file is an empty static HTML page where you add the Web Payments SDK and application logic.

  • The public/app.css file is the stylesheet that contains some preset styles to help with the page layout.

  • The top-level server.js file contains the server call to the CreatePayment endpoint for charging the payment source. The quickstart project also includes tests in the server.tests.js file.

Important

The value in server.js line 45 sets the currency for the quickstart to US dollars. If your default test account is based in another country, be sure to update server.js with the currency code for your country before you run the quickstart.

Add Web Payments SDK to the web client Permalink Get a link to this section

Get the web client ready to accept a payment card and send the resulting token to the server component of the quickstart application.

Step 1: Get application credentials Permalink Get a link to this section

You need your Sandbox credentials because the quickstart application is configured to send requests to the Square Sandbox instead of your production Square account.

  1. Open the Developer Dashboard and create a new application.

  2. Open the application and choose the Credentials page.

  3. Set the Developer Dashboard mode to Sandbox to get a Sandbox application ID.

  4. Copy the Sandbox Application ID and Sandbox Access Token.

  5. Choose the Locations page and copy the Sandbox location ID.

  6. Paste the application ID, location ID, and Sandbox access token into a temporary text file.

Important

The Sandbox access token is a secure secret. Do not share it with anyone or accidentally upload it to the cloud.

get credentials - animated

Step 2: Configure the quickstart access token Permalink Get a link to this section

The quickstart server code calls the CreatePayment endpoint and needs to be updated to use your Sandbox access token.

  1. In the project root folder, create a copy of the .env.example file and name it .env.sandbox.

    Did you know?

    The dotenv library is used to manage secrets that should not be made public. The .env.sandbox file should never be committed.

  2. Open the copied file to edit.

  3. Define SQUARE_ACCESS_TOKEN with your Sandbox access token from the Developer Dashboard.

    SQUARE_ACCESS_TOKEN={SANDBOX_ACCESS_TOKEN}
    
  4. Restart your server for the sandbox test environment (start:sandbox) to use this new value.

You need a Sandbox application ID and Sandbox location ID in the following steps. You should paste these values into a text file or leave the Developer Dashboard open in another browser tab so that you can copy the values as needed.

Step 3: Add pay elements to the page Permalink Get a link to this section

  1. Replace the body of public/index.html with this HTML:

     <form id="payment-form">
       <div id="card-container"></div>
       <button id="card-button" type="button">Pay $1.00</button>
     </form>
     <div id="payment-status-container"></div>
    

    This HTML adds an element (<div id="card-container" >) that the Web Payments SDK attaches the card element to and adds a button that starts the tokenization process.

Did you know?

The SDK also enables the Apple Pay, Google Pay, ACH (bank transfer), and Square gift card payment methods.

Step 4: Attach the Card payment method to the pay elements Permalink Get a link to this section

The following JavaScript instantiates the SDK, provides the Card payment object, attaches it to the page, and generates the payment token:

  1. Add an empty <script> tag to the <head> of index.html, after <script type="text/javascript" src="https://sandbox.web.squarecdn.com/v1/square.js"></script>.

    <script>
    </script>
    
  2. Add the following global constants inside the <script> tag, substituting the IDs from the Developer Dashboard for the placeholder ({YOUR_SANDBOX_APPLICATION_ID} and {YOUR_SANDBOX_LOCATION_ID}) values.

    const appId = '{YOUR_SANDBOX_APPLICATION_ID}';
    const locationId = '{YOUR_SANDBOX_LOCATION_ID}'; 
    
  3. Add the following code inside the <script> tag:

     async function initializeCard(payments) {
       const card = await payments.card();
       await card.attach('#card-container'); 
       return card; 
     }
    
    document.addEventListener('DOMContentLoaded', async function () {
      if (!window.Square) {
        throw new Error('Square.js failed to load properly');
      }
      const payments = window.Square.payments(appId, locationId);
      let card;
      try {
        card = await initializeCard(payments);
      } catch (e) {
        console.error('Initializing Card failed', e);
        return;
      }
    
      // Step 5.2: create card payment
    });
    

The code does the following:

  1. Initializes the Web Payments SDK by calling Square.payments(appId, locationId).

  2. Initializes the Card payment method by calling the Payments .card() method and attaching the payment method to the page DOM by calling the Card .attach() method.

Note

The Card payment method of the Web Payments SDK automatically infers whether to display the postal code and copy (i.e. Zip Code, Postal Code, or Postcode) based on the issuing country of the buyer's Credit Card.

Test the application

  1. Navigate to http://localhost:3000/ in your browser. web payments sample image 1

Checkpoint 2: You should now be able to see the payment card input rendered on your page.

Did you know?

If you need to clear the contents of the card entry fields for the buyer, call card.destroy() to destroy the object and then call the initializeCard(payments) function again to initialize and attach the card to your application DOM.

Step 5: Get the payment token from the Card payment method Permalink Get a link to this section

Before you can take a payment, you need to configure your developer credentials, which can be found in the Developer Dashboard.

Note

This example uses the Square Sandbox to accept a payment. You should use the Sandbox test card values. However, if you choose to use your own payment card, the Sandbox does not charge it.

  1. Add the following code after the initializeCard function inside the <script> tag:

     // Call this function to send a payment token, buyer name, and other details
     // to the project server code so that a payment can be created with 
     // Payments API
     async function createPayment(token) {
       const body = JSON.stringify({
         locationId,
         sourceId: token,
       });
       const paymentResponse = await fetch('/payment', {
         method: 'POST',
         headers: {
           'Content-Type': 'application/json',
         },
         body,
       });
       if (paymentResponse.ok) {
         return paymentResponse.json();
       }
       const errorBody = await paymentResponse.text();
       throw new Error(errorBody);
     }
    
     // This function tokenizes a payment method. 
     // The ‘error’ thrown from this async function denotes a failed tokenization,
     // which is due to buyer error (such as an expired card). It is up to the
     // developer to handle the error and provide the buyer the chance to fix
     // their mistakes.
     async function tokenize(paymentMethod) {
       const tokenResult = await paymentMethod.tokenize();
       if (tokenResult.status === 'OK') {
         return tokenResult.token;
       } else {
         let errorMessage = `Tokenization failed-status: ${tokenResult.status}`;
         if (tokenResult.errors) {
           errorMessage += ` and errors: ${JSON.stringify(
             tokenResult.errors
           )}`;
         }
         throw new Error(errorMessage);
       }
     }
    
     // Helper method for displaying the Payment Status on the screen.
     // status is either SUCCESS or FAILURE;
     function displayPaymentResults(status) {
       const statusContainer = document.getElementById(
         'payment-status-container'
       );
       if (status === 'SUCCESS') {
         statusContainer.classList.remove('is-failure');
         statusContainer.classList.add('is-success');
       } else {
         statusContainer.classList.remove('is-success');
         statusContainer.classList.add('is-failure');
       }
    
       statusContainer.style.visibility = 'visible';
     }    
    
  2. Add the following code to the DOMContentLoaded EventListener in step 3.3 by replacing // Step 5.2: create card payment with the following code:

     async function handlePaymentMethodSubmission(event, paymentMethod) {
       event.preventDefault();
    
       try {
         // disable the submit button as we await tokenization and make a
         // payment request.
         cardButton.disabled = true;
         const token = await tokenize(paymentMethod);
         const paymentResults = await createPayment(token);
         displayPaymentResults('SUCCESS');
    
         console.debug('Payment Success', paymentResults);
       } catch (e) {
         cardButton.disabled = false;
         displayPaymentResults('FAILURE');
         console.error(e.message);
       }
     }
    
     const cardButton = document.getElementById(
       'card-button'
     );
     cardButton.addEventListener('click', async function (event) {
       await handlePaymentMethodSubmission(event, card);
     });
    

Complete example Permalink Get a link to this section

The complete DOMContentLoaded Event Listener should look like the following code:

document.addEventListener('DOMContentLoaded', async function () {
  if (!window.Square) {
    throw new Error('Square.js failed to load properly');
  }

  const payments = window.Square.payments(appId, locationId);
  let card;
  try {
    card = await initializeCard(payments);
  } catch (e) {
    console.error('Initializing Card failed', e);
    return;
  }

  // Checkpoint 2.
  async function handlePaymentMethodSubmission(event, paymentMethod) {
    event.preventDefault();

    try {
      // disable the submit button as we await tokenization and make a
      // payment request.
      cardButton.disabled = true;
      const token = await tokenize(paymentMethod);
      const paymentResults = await createPayment(token);
      displayPaymentResults('SUCCESS');

      console.debug('Payment Success', paymentResults);
    } catch (e) {
      cardButton.disabled = false;
      displayPaymentResults('FAILURE');
      console.error(e.message);
    }
  }

  const cardButton = document.getElementById(
    'card-button'
  );
  cardButton.addEventListener('click', async function (event) {
    await handlePaymentMethodSubmission(event, card);
  });
});

The code does the following:

  1. Binds the Card tokenization to the trigger event, which is clicking the Pay button in this case.

  2. Submits the tokenized card information and payment token by calling the CreatePayment endpoint on the backend.

Test the application Permalink Get a link to this section

  1. Navigate to http://localhost:3000/ in your browser.

  2. Input the card number 5105 1051 0510 5100 from the Sandbox Test Values. Any CVV or postal code works.

  3. Choose the Pay $1.00 button. web payments sample finished form

Checkpoint 3: You should see a green check mark and Payment successful on the page. The payment is credited to your developer test account. The next section shows how to find the payment in the Sandbox Seller Dashboard.

Look at your Developer Dashboard for a debug log of the payment information.

Did you know?

You can use any value from the Sandbox Test Values provided by Square.

Verify the payment in the Sandbox Seller Dashboard Permalink Get a link to this section

The payment is credited to the Sandbox test account whose access token is used in the application that you just built. To see the payment in the Sandbox Seller Dashboard, go to the Developer Dashboard.

  1. Choose Open on the default test account to access the Sandbox Seller Dashboard.

  2. Choose Transactions. web payments : card payments : check sandbox

Complete code example Permalink Get a link to this section

You can see a complete code example in the Web Payments Quickstart.

Deploy the application Permalink Get a link to this section

This section explains how to deploy your application in production with the following tasks:

  • Replace your Sandbox access token and application ID with production values.

  • Update your code to make API calls to Square production endpoints.

Important

Your account must be activated to accept payments. Be sure to activate your account before continuing this walkthrough. If the Developer Dashboard Credentials tab indicates that your account is not activated, follow the steps to activate it.

Deployment tasks:

  1. Get production application credentials. In the Get Sandbox application credentials section, you obtained Sandbox credentials. Follow the steps to open the Developer Dashboard, but this time choose Production mode, and then copy the production application ID and access token.

  2. Update script references. In the ADD SCRIPT REFERENCES section, you added script references in index.html. Update the domain string in the JavaScript reference from sandbox.web.squarecdn.com/v1/square.js to web.squarecdn.com/v1/square.js.

  3. Provide your production application ID. The Web Payments SDK requires a valid application ID to return a payment token. In the Provide your application ID section, you provided a Sandbox application ID. Update the code by providing your production application ID.

  4. Configure your backend server to use a production access token. In the Configure the backend with your access token section, you provided a Sandbox access token. Replace it with the production access token.

If you want to test the application in a production environment (squareup.com), you must use an actual payment card. Note that Square actually charges payment cards in production so if you must test in production, charge minimum amounts.

Next steps Permalink Get a link to this section

Now that you are taking payments with credit and debit cards, you can add additional payment methods or customize the appearance of the Card payment method.