In-Person Payments
supports in-person payments on both TSYS and Paysafe, giving you the flexibility to choose the processor and terminal setup that best suits your business needs. This guide will walk you through the process of setting up your integration, from selecting your processor and terminals to handling key payment scenarios.
Design Your Integration
Choose your processor
offers an in-person payments solution on each of our processors. If you haven’t already, consider which processor you will use.
Choose your terminals
The terminal options available to you depend on the processor you are using for in-person payments.
Valor terminals with TSYS
- VL100: Best for countertop use
- VL110: Best for handheld use
PAX terminals with Paysafe
- A920
- A920 Pro
- A80
Check out our online store (opens in a new tab) for more information.
Identify required functionality
There are several in-person payments features to choose from which you can implement during your integration.
Order Developer Terminals
To test your integration, you’ll need a developer terminal. The easiest and most convenient option is to order a developer terminal (opens in a new tab) from . The terminal will arrive within a few business days, fully activated and ready to use. Simply connect it to Wi-Fi to get started.
If you already own a developer terminal, you can use it as long as it is a VL100 or VL110 model and suitable for test environments. To use your own terminal:
- Email support to request an Activation Code.
- Enter the Activation Code onto the terminal to associate it with your test account.
Collect an In-Person Payment
If you are already familiar with collecting online payments using , the process for in-person payments will be similar.
Retrieve the terminal id
When a merchant orders a terminal, associates the device’s serial number with the merchant’s account and assigns a unique terminal_reader_id
. Before processing a payment, List all Terminal ReadersAPI linked to the merchant’s account to specify the device from which the payment will be collected.
curl -L {{PRODUCTION_API_URL}}/v1/terminal-readers/{{TERMINAL_ID}} \
-H '{{ACCOUNT_HEADER}}-account: {{MERCHANT_ACCOUNT_ID}}' \
-H 'Content-Type: application/json' \
-H '{{ACCOUNT_HEADER}}-api-key: {{SECRET_KEY}}' \
Create a card-present payment method
To Create a Payment MethodAPI for an in-person payment, set the type=card_present
and include the terminal_reader_id
of the intended device.
Create a Payment Method sample request
curl -L '{{PRODUCTION_API_URL}}/v1/payment-methods' \
-H '{{ACCOUNT_HEADER}}-account: {{MERCHANT_ACCOUNT_ID}}' \
-H 'Content-Type: application/json' \
-H '{{ACCOUNT_HEADER}}-api-key: {{SECRET_KEY}}' \
-d '{
"type": "card_present",
"terminal_reader_id": "{{TERMINAL_READER_ID}}"
}'
Collect the payment
Begin by creating a payment intent. Specify the payment_method_type
property as card_present
and use the payment_method_id
obtained from the previous step. Confirming the payment intent transitions its status to requires_action
, indicating that the payment intent has been sent to the terminal, prompting the customer to complete the payment.
Create a payment intent sample request
curl -L '{{PRODUCTION_API_URL}}/v1/payment-intents' \
-H '{{ACCOUNT_HEADER}}-account: {{MERCHANT_ACCOUNT_ID}}' \
-H 'Content-Type: application/json' \
-H '{{ACCOUNT_HEADER}}-api-key: {{SECRET_KEY}}' \
-d '{
"amount": 1000,
"currency": "usd",
"payment_method_types": [
"card_present"
],
"confirm": true,
"capture_method": "automatic",
"payment_method_id": "pm_oeWN5ipwtWkF0N2n7t1zs"
}'
Complete the payment
Swipe or tap a payment method on the terminal to complete the payment.
Confirm payment intent success
Create a Webhook EndpointAPI for payment_intent_events
to receive updates about the success of the payment intent and the associated payment details.
Key Scenarios to Handle
Partial authorizations
A Partial Authorization occurs when a payment is attempted for the full amount, but there are insufficient funds to cover it. Only the available amount is captured. It’s important that your software handles this flow, so that the merchant is aware when the full amount is not captured and can choose to create another payment for the difference.
When there is a partial authorization, the API status for the charge is succeeded
. Developers should compare either charge.amount_captured
or payment_intent.amount_received
to the original charge amount to determine how much was actually received.
Same-day refunds
All refunds are initiated through the Create a RefundAPI endpoint.
For same-day refunds on payments made via a Paysafe terminal reader, the refund must be initiated through the terminal reader, which needs to be powered on and connected to the internet. If the terminal is offline, the same-day refund will not go through. Next-day or later refunds can be processed without the terminal being powered on or connected. Make sure your software is set up to handle these refund events: charge.refund.pending
and charge.refunded
.
Same-day refunds for payments made through TSYS terminal readers are not processed through the terminal.
Certify Your Integration
After completing your integration, you need to certify it by handling specific payment scenarios. If you've implemented additional in-person features such as tip settings or card saving, ensure you test those flows as well.
The developer tasks below are required to be completed in before launching your card-present solution with :
FAQ
How do I calculate the tip amount?
To calculate the tip amount when tips are enabled, subtract thepayment_intent.amount
from the payment_intent.amount_received
.What payment methods are supported?
Card, Apple Pay, Google Pay, and Samsung Pay are supported for in-person payments. HSA/FSA cards are not supported at this time.Can I switch in-person payment providers?
Yes, you can switch between in-person payment providers. If you're moving from TSYS to Paysafe for in-person payments, keep in mind these key differences:- Manual capture: Manual capture is not supported by the Paysafe in-person payments solution.
- Same-day refunds: Same-day refunds for Paysafe are processed directly on the terminal reader. Your software will need to handle refund webhooks to track the final status of each refund.
- Printed receipts: Printed receipts cannot be controlled via the API with Paysafe’s terminals. If you’ve used this feature with TSYS, make sure to disable it in your software and provide merchants with instructions to manage receipts directly from their terminal reader.