neonpay.js is used to provide client-side tokenization of credit card data for NeonPay. In this guide, we explain how to implement this in your web application.
Breaking Change:
- NeonPayJS now requires a call be made first to retrieve merchant information before mounting any payment fields. This will change the implementation to change. Please review the documentation in full before switching to v2.0. This breaking change is necessary to enable processing for merchant accounts supported via Stripe.
As a application administrator, you can generate and revoke public API keys from the Developer Tools page in the NeonPay portal. This public API key is different from the private API key you use to access the NeonPay Charge API.
When starting development, you will need a public API key from NeonPay Sandbox (https://sandbox.neononepay.com/) to develop against the development version of the tokenization library.
For your production script, you will need a public API key from NeonPay (https://app.neononepay.com/)
We strongly recommend that you include fields in your payment form to collect your customer’s first name, last name, and address. Once you have that information collected, you can pass it as part of the tokenData parameter in .createToken()
API method to create a more complete payment token.
Quickstart Example<form id="paymentForm" action="#" method="POST"> <h2>Payment Form</h2> <div id="cardFields"></div> <input type="hidden" id="token" value="" /> <input id="paymentSubmit" type="submit" value="Process Payment" /> <button id="swipe" type="button" name="button">Swipe</button> </form> <script src="https://cdn.sbx.neononepay.com/2.0/neonpay.js"></script> <script type="text/javascript"> // Set up the NeonPay fields on your form var neonpay = new NeonPay('public_f8564752122b08cc9c20c374562d5cc7', '19', {swipe: true}); var card = neonpay.createField('card'); (async () => { // Check if merchant can process payments first const result = await neonpay.canMakePayments(); if (result) { card.mount('#cardFields'); } else { // There was an error and the payment is not possible for this configuration document.querySelector('#cardFields').style.display = 'none'; } })(); var paymentForm = document.getElementById('paymentForm'); var tokenField = document.getElementById('token'); // Intercept form submission and retrieve token paymentForm.addEventListener('submit', function (event) { event.preventDefault(); var tokenData = { first_name: 'Robert', middle_name: 'Norman', last_name: 'Ross', email: 'bob@ross.net', phone: '+18888606366', address_line_1: '4545 N. Ravenswood Ave.', address_line_2: '2nd Floor', address_city: 'Chicago', address_state: 'IL', address_zip: '60640', address_country: 'US' }; var token = neonpay.createToken(card, tokenData).then(function(result) { // Pass the token to your Charge API call using // a hidden input that your form will serialize // or to an intermediary API on your server if (result.token) { tokenField.value = result.token; } }); }); </script>
Google Pay Example<form id="paymentForm" action="#" method="POST"> <h2>Payment Form</h2> <div id="googlePayButton"></div> <input type="hidden" id="token" value="" /> <input id="paymentSubmit" type="submit" value="Process Payment" /> </form> <script src="https://cdn.sbx.neononepay.com/2.0/neonpay.js"></script> <script type="text/javascript"> // Set up the NeonPay fields on your form var neonpay = new NeonPay('public_f8564752122b08cc9c20c374562d5cc7', '19', {swipe: true}); var googlepay = neonpay.createField('googlepay', {price: '25.00'}); (async () => { // Check if merchant can process payments first const result = await neonpay.canMakePayments(); if (result) { googlepay.mount('#googlePayButton'); } else { // There was an error and the payment is not possible for this configuration document.querySelector('#googlePayButton').style.display = 'none'; } })(); var paymentForm = document.getElementById('paymentForm'); var tokenField = document.getElementById('token'); // Intercept form submission and retrieve token paymentForm.addEventListener('submit', function (event) { event.preventDefault(); var tokenData = { first_name: 'Robert', middle_name: 'Norman', last_name: 'Ross', email: 'bob@ross.net', phone: '+18888606366', address_line_1: '4545 N. Ravenswood Ave.', address_line_2: '2nd Floor', address_city: 'Chicago', address_state: 'IL', address_zip: '60640', address_country: 'US' }; var token = neonpay.createToken(googlepay, tokenData).then(function(result) { // Pass the token to your Charge API call using // a hidden input that your form will serialize // or to an intermediary API on your server if (result.token) { tokenField.value = result.token; } }); }); </script>
Include the NeonPay JS library in your payment form.
Include NeonPay.js<script src="https://cdn.app.neononepay.com/2.0/neonpay.js"></script>
If you are developing in the Sandbox environment, your script will be:
NeonPay.js for Sandbox<script src="https://cdn.sbx.neononepay.com/2.0/neonpay.js"></script>
Add a container field where you wish NeonPay to populate the payment fields on your page. Be sure to give it a unique HTML id attribute so that you can target it directly.
Create DOM Elements<div id="cardFields"></div>
In a <script> that runs on page load, create an instance of the NeonPay object. You must provide your Public API Key and your Merchant ID, which can be retrieved from the NeonPay merchant portal.
options
Values | |
---|---|
swipe boolean |
Allows for transactions via the use of a supported magnetic card swiper/reader. You must have a button with the id of "swipe" inside your payment form. |
Generate NeonPay Classvar neonpay = new NeonPay(apiKey, merchantId[, options]);
Example With Swiper Onvar neonpay = new NeonPay(apiKey, merchantId, {swipe: true});
In the same script as above, declare which payment fields should appear using this method:
Define Payment Fieldsvar card = neonpay.createField('card');
Use canMakePayments()
to retrieve merchant information necessary for making tokens. It is recommended that this be done in an async method before mounting. Mounting will place your payment fields inside the previously created DOM element. The fields will be added as iFrames to your page.
Mount NeonPay Fields(async () => { // Check if merchant can process payments first const result = await neonpay.canMakePayments(); if (result) { card.mount('#cardFields'); } else { // There was an error and the payment is not possible for this configuration // Handle this error state as your application sees fit document.querySelector('#cardFields').style.display = 'none'; } })(); // Alternatively, you may pass a DOM object reference instead var container = document.querySelector('#cardFields'); (async () => { // Check if merchant can process payments first const result = await neonpay.canMakePayments(); if (result) { card.mount(container); } else { // There was an error and the payment is not possible for this configuration // Handle this error state as your application sees fit container.style.display = 'none'; } })();
Use the neonpay.createToken()
method to catch the payment token and complete your charges with NeonPay.
Set up Callbackneonpay.createToken(card).then(function(result) { // callback methods to handle result.error or result.token });
canMakePayments()
Ensures that the current merchant can process payments. Also retrieves other information about the merchant necessary for rendering the correct payment fields later.
Methodneonpay.canMakePayments();
Example(async () => { const result = await neonpay.canMakePayments(); })();
createField()
When displaying card fields using this method, you can choose either to use the type of card
to display a single consolidated field that collects card number, expiration, and cvc, or else you can display those fields individually by calling this method three times with a different type.
Methodvar field = neonpay.createField(type, options);
type
Values | |
---|---|
card | A set of fields for credit card entry, including card number, card expiration, card CVC, and postal code. |
cardNumber | Credit card number field |
cardExpiration | Credit card expiration field |
cardCvc | Credit card CVC number field |
applepay | Apple Pay Button |
googlepay | Google Pay Button |
options
Values | |
---|---|
cardNetworks array |
Available if type parameter is applepay or googlepay . Specifies what card networks are allowed to be processed for Apple and Google Pay methods. By default, AMEX , DISCOVER , JCB , MASTERCARD , and VISA are enabled if nothing is defined here. (Other networks not listed here are not available at this time). Merchants processed through Stripe will not honor this configuration.
|
buttonSizeMode string |
Available if type parameter is applepay or googlepay .
|
price string |
Available if type parameter is applepay or googlepay . Specifies the price to be shown in the Google or Apple Pay payment sheet. |
label string |
Available if type parameter is applepay . Specifies the label for the item to be shown in the Apple Pay payment sheet. |
storeName string |
Available if type parameter is applepay . Specifies the store name to be shown in the Apple Pay payment sheet. |
style object |
Customize fields’ appearances with CSS. Style is specified as an object for the variants below:
For each of the above, the following styles can be customized.
The following pseudo-classes and pseudo-elements can also be styled with the above properties, as a nested object inside the variant.
|
value object |
Available if type parameter is card . You may pre-fill field values (e.g., {postalCode: ‘90210’} ). You may not prefill card data like number and expiration date due to data protection concerns. |
hidePostalCode boolean |
Only available if type parameter is card . Hide the postal code field. Defaults to false. If you are collecting full billing information elsewhere on your payment form, you can set this to true. |
hideBorders boolean |
Hides the default border styling for card fields. |
disabled boolean |
Applies a disabled state to the field so that it prevents user input. Defaults to false. |
placeholder string |
Available if type parameter is not card or cardExpiration . Customize the field’s placeholder text. |
Example with Optionsvar card = neonpay.createField('card', { style: { base: { color: '#46a0ba', '::placeholder': { color: '#000' } }, invalid: { color: 'yellow' } }, value: { postalCode: '60613' }, hidePostalCode: false, disabled: false }); var googlepay = neonpay.createField('googlepay');
Example with separate card fieldsvar styleObject = { base: { fontFamily: 'Open Sans, sans-serif', color: '#46a0ba' } }; var cardNumberField = neonpay.createField('cardNumber', { style: styleObject, placeholder: 'Enter card number', disabled: false }); var cardExpirationField = neonpay.createField('cardExpiration', { style: styleObject }); var cardCvcField = neonpay.createField('cardCvc', { style: styleObject });
Apple Pay examplevar applepay = neonpay.createField('applepay', { applepayElement: '#applePayButton', price: '1.00', label: 'Donation for 2021 Gala', storeName: 'My Non-Profit' });
Google Pay examplevar googlepay = neonpay.createField('googlepay', { googlepayElement: '#googlePayButton', price: '1.00' });
updateField()
Updates the configuration for a field. Updates are merged into any existing configuration.
Methodfield.updateField(options);
Example Usagevar options = { style: { base: { fontSize: '13px' } } }; card.on('ready', function(event) { card.updateField( options ); });
mount()
IMPORTANT: You must use canMakePayments()
first to retrieve information about the merchant. Otherwise, the field will not mount or render.
You need to first create a container DOM element to mount a Field. After mounting, the method will attach the Field to the specified DOM element, causing the field to display on your page.
Methodfield.mount(domElement)
Example Usage(async () => { // Check if merchant can process payments first const result = await neonpay.canMakePayments(); if (result) { card.mount('#paymentForm'); } else { // There was an error and the payment is not possible for this configuration // Handle this error state as your application sees fit document.querySelector('#paymentForm').style.display = 'none'; } })(); // Alternatively, you may pass a DOM object reference instead var container = document.querySelector('#paymentForm'); card.mount(container);
unmountField()
Unmounts the Field from the DOM. You will need to call .mount() again to re-attach fields to the DOM.
Methodfield.unmountField(domElement)
Example Usagecard.unmountField('#paymentForm'); // Alternatively, you may pass a DOM object reference instead var container = document.querySelector('#paymentForm'); card.unmountField(container);
createToken()
(Credit Card, Apple Pay, Google Pay)Use the createToken() method to convert the information collected by the payment fields into a payment token that you can safely pass to your server to use in a Charge API call.
field
tokenData
Values | |
---|---|
first_name string recommended |
Cardholder first name. For Apple and Google Pay, value is provided automatically via that service. |
middle_name string |
Cardholder middle name |
last_name string recommended |
Cardholder last name. For Apple and Google Pay, value is provided automatically via that service. |
address_line_1 string |
Cardholder billing address line 1. For Apple and Google Pay, value is provided automatically via that service. |
address_line_2 string |
Cardholder billing address line 2. For Apple and Google Pay, value is provided automatically via that service. |
address_city string |
Cardholder billing address city. For Apple and Google Pay, value is provided automatically via that service. |
address_state string |
Cardholder billing address state/province. For Apple and Google Pay, value is provided automatically via that service. |
address_zip string recommended |
Cardholder billing address zip code. For Apple and Google Pay, value is provided automatically via that service. |
address_country string |
Cardholder billing address country. Two character ISO country code (e.g., ‘US’). For Apple and Google Pay, value is provided automatically via that service. |
email string |
Cardholder email address. For Apple and Google Pay, value is provided automatically via that service. |
phone | Cardholder phone number |
Methodneonpay.createToken(field, tokenData)
Example Usageneonpay.createToken(field).then(function(result) { // callback methods to handle result.error or result.token });
Example with Token Datavar tokenData = { first_name: 'Robert', middle_name: 'Norman', last_name: 'Ross', email: 'bob@ross.net', phone: '+18888606366', address_line_1: '4545 N. Ravenswood Ave.', address_line_2: '2nd Floor', address_city: 'Chicago', address_state: 'IL', address_zip: '60640', address_country: 'US' } neonpay.createToken(field,tokenData).then(function(result) { // callback methods to handle result.error or result.token });
createToken()
(Bank Account)Bank account can also be tokenized with this method. Use createToken() with a ‘bank_account’ flag parameter to request a bank account token to pass to the Charge API.
field
Values | |
---|---|
bank_account string required |
Indicates that a bank account token should be created. |
tokenData
Values | |
---|---|
routing_number string required |
The bank account routing number |
account_number string required |
The bank account number |
account_holder_first_name string required |
The first name of the account holder |
account_holder_last_name string required |
The last name of account holder |
email string required |
Account holder's email |
account_type string required |
The type of account (e.g., ‘savings’, ‘checking’, ‘corporate-checking’, ‘corporate-savings’) |
country string |
Two character ISO country code (e.g., ‘US’) |
Methodneonpay.createToken(field, tokenData)
Example Usagevar tokenData = { routing_number: '111000000', account_number: '000111222', account_holder_first_name: 'Robert', account_holder_last_name: 'Ross', account_type: 'checking', country: 'US' } neonpay.createToken('bank_account',tokenData).then(function(result) { // callback methods to handle result.error or result.token });
setPrice()
(Apple or Google Pay)A price must be set for transactions to be tokenized through Apple or Google Pay.
price
xx.xx
. For example, $10 should be passed as 10.00
.Methodfield.setPrice(price)
Example Usagefield.on('ready', function(event) { field.setPrice('10.00'); });
You can set event listeners to catch events emitted by your fields.
event
Values | |
---|---|
blur | Triggers when the Field loses focus. |
change | Triggers when any of the following values has changed in the field:
|
focus | Triggers when the Field gains focus. |
ready | Triggers when the Field is rendered and available for interaction. |
cardbrand | Triggers when the card number field is blurred and has determined a card brand in the form an event object: {brand: 'brand name'} . The brands returned come the following list:
|
applepayButtonClick | Triggers when the customer has clicked on the Apple Pay button and the payment sheet is displayed. |
applepayAuthorized | Triggers when there is a Apple Pay is set up to allow for tokenization through the createToken method. |
applepayCanceled | Triggers when the Apple Pay payment sheet errors or is canceled out. |
applepayIncompatible | Triggers if the Apple Pay API is not supported by the current device/browser. |
googlepayReady | Triggers when the Google Pay integration has been loaded. The Google Pay button may not be fully initialized at this point though, use the googlepayButtonReady event instead. |
googlepayButtonReady | Triggers when the Google Pay Button has been rendered and is ready for customer interaction. |
googlepayButtonClick | Triggers when the customer has clicked on the Google Pay button and the payment sheet is displayed. |
googlepayAuthorized | Triggers when there is a Google Pay is set up to allow for tokenization through the createToken method. |
googlepayIncompatible | Triggers if the Google Pay API is not supported by the current device/browser. |
handler
Methodfield.on(event, handler)
Example Error Handlingcard.on('change', function(event) { var displayError = document.getElementById('card-errors'); if (event.error) { displayError.innerHTML = event.error.message; } else { displayError.innerHTML = ''; } });