Pay
Overview
The <Pay> verb enables secure payment processing during voice calls. When implemented in your voice application,
it handles the complete payment flow including data collection, validation, and processing through your configured payment gateway.
The <Pay> verb also has two nouns that are embedded within it:
<Parameter>: Pass custom parameters to your payment processor.<Prompt>: Customize the prompts used during payment collection.
Core functionality
- Secure payment information collection
- Real-time payment processing
- Payment method tokenization
- Multi-currency support
- Automated retry handling
- Status tracking via webhooks
Transaction types
The <Pay> verb supports two primary transaction types: immediate charges and tokenization.
Immediate charges
When you need to process a payment right away, use an immediate charge transaction. This collects the payment details and processes the transaction in one step.
To execute an immediate charge:
Setting any positive value for chargeAmount initiates an immediate charge transaction.
Tokenization
Tokenization allows you to securely store payment information for future use. Instead of processing a payment, it generates a secure token that represents the payment method. This is particularly useful for:
- Subscription services
- Recurring billing
To tokenize payment information:
You can also omit the chargeAmount attribute entirely:
The actual token is provided & stored by your payment processor, which can be used for future transactions without requiring customers
to re-enter their payment details. This may differ depending on the payment processor you are using.
Attributes
minPostalCodeLength
Minimum required length for postal code input. Used for input validation.
paymentConnectorUrl
The URL to which to POST the encrypted payment data.
securityCode
Controls whether CVV/security code collection is required. When false, skips security code collection.
action
HTTPS endpoint that receives POST requests after payment completion. Must be HTTPS. Response determines next cXML instructions. For tokenization, receives PaymentToken and ProfileId. For charges, receives PaymentConfirmationCode. Defaults to the current cXML document URL.
chargeAmount
Amount to charge. Set to 0 or omit for tokenization only. Must be between 0 and 1,000,000.
currency
Three-letter currency code (e.g., usd, eur, gbp). Must be supported by selected payment connector. Currently only usd is accepted.
description
Transaction description passed to payment processor. Appears in transaction records.
input
The only supported input method for payment data collection. All captured digits are automatically redacted in logs.
language
Controls prompt language. Supports en-AU, en-CA, en-GB, en-IN, en-US for all payments. Additional es-ES, es-MX, fr-CA, fr-FR, de-DE, it-IT for credit card only. See language list.
maxAttempts
Maximum number of retry attempts when timeout occurs or invalid data is received. Allowed values are 1, 2, or 3. Payment flow terminates after maxAttempts is reached.
paymentMethod
Determines payment collection flow. Credit card flow captures card number, expiration, security code, and postal code. ACH flow captures routing and account numbers.
postalCode
Controls postal code collection. When false, skips collection for postal code. When true, prompts the user for collection. When a String value, uses provided value without needing to collect the postal code from the user.
statusCallback
HTTPS endpoint that receives real-time payment status updates via POST requests. Includes details about current payment stage, errors, and attempt counts. See Status Callback Parameters for more details.
timeout
Number of seconds to wait for the next digit input before timing out. Must be a positive integer greater than 3 seconds. Applies to all input collection stages.
tokenType
Determines token persistence. Allowed values are one-time or reusable. One-time for single use, reusable for recurring use. Payment-method specific to certain processors.
validCardTypes
Space-separated list of accepted card types. Validates card number against specified types. Allowed values: visa, mastercard, amex, maestro, discover, optima, jcb, diners-club, enroute.
Webhook request parameters
paymentConnectorUrl request parameters
When a transaction is completed, SignalWire will POST to your paymentConnectorUrl URL. Based on the transaction type,
the body of the request will contain the below parameters:
Response from paymentConnectorUrl
A valid response from your paymentConnectorUrl must be provided to indicate the success or failure of the transaction.
More information can be found in the Webhook Response section.
Standard Credit Card Payment
Tokenized Credit Card Payment
cardnumber
Customer’s credit card number.
chargeAmount
Amount to charge.
currency_code
Three-letter currency code.
cvv
Card security code.
description
Transaction description.
expiry_month
Card expiration month (2 digits).
expiry_year
Card expiration year (2 digits).
method
Payment method (credit-card).
parameters
Custom key-value parameters.
postal_code
Billing postal code.
transaction_id
Unique identifier for the transaction.
Example
action request parameters
When a transaction is completed, SignalWire will POST to your action URL. The body of the request will contain the standard request parameters
as well as the following parameters:
Response from action URL
A valid cXML response must be provided if the action URL is provided. More information can be found in the Webhook Response section.
BankAccountNumber
Masked bank account number.
BankRoutingNumber
Bank routing number.
ConnectorError
Raw processor error details.
ExpirationDate
Card expiration in MMYY format.
PayErrorCode
Numeric error reference.
PaymentCardNumber
Masked card number (last 4 digits visible).
PaymentCardPostalCode
Postal code provided.
PaymentCardType
Card brand (visa, mastercard, etc.).
PaymentConfirmationCode
Transaction confirmation code.
PaymentError
Detailed error information.
PaymentMethod
Type of payment method used.
PaymentToken
Tokenized payment method reference.
ProfileId
Customer profile identifier from payment processor.
Result
Final outcome of the payment attempt. The possible values can be seen in the Result Values table.
SecurityCode
Masked security code.
Result values
statusCallback request parameters
When a status change occurs, the following parameters are sent to your statusCallback URL:
Attempt
Current attempt number.
ErrorType
Specifies the nature of the error encountered (if any). Refer to the table below for detailed error type descriptions. The possible values can be seen in the Error Types table.
ExpirationDate
Card expiration date.
For
Indicates the present phase of the <Pay> request. The table below outlines the potential values. Possible values can be seen in the For Values table.
PaymentCardNumber
Masked card number.
PaymentCardPostalCode
Postal code provided.
PaymentCardType
Type of card provided.
PaymentMethod
Type of payment being processed.
SecurityCode
Masked security code.
Status callback events
For values
Error types
Webhook response
paymentConnectorUrl response
The response from your paymentConnectorUrl is used to inform if the transaction was successful or not.
Successful transaction
When a transaction is successful, the webhook should respond with one of the following formats (depending on the transaction type):
Unsuccessful transaction
When a transaction is unsuccessful (declined by the payment processor), the webhook should respond with the following format:
action response
When a transaction is completed, SignalWire will POST to your action URL. The response should return valid cXML for the
next step in your application.
Example
Language support
The language attribute controls the language of automated prompts during payment collection.
You can customize prompt messages in any language using the <Prompt> noun, regardless of the selected language attribute.
Credit card payments
All credit card payments support the following languages:
English variants
- en-AU (Australian English)
- en-CA (Canadian English)
- en-GB (British English)
- en-IN (Indian English)
- en-US (American English)
Additional languages
- es-ES (European Spanish)
- es-MX (Mexican Spanish)
- fr-CA (Canadian French)
- fr-FR (European French)
- de-DE (German)
- it-IT (Italian)
Examples
Simple payment collection:
Payment with status tracking:
Basic tokenization:
Tokenization with validation:
Custom retry logic:
International payment:
Example with custom parameters and prompts
Security best practices
- Always use HTTPS for callback URLs
- Implement webhook validation
- Monitor payment status callbacks
- Handle errors gracefully
- Store tokens securely
- Use appropriate timeout values
- Implement proper error handling
- Validate all inputs
- Monitor transaction patterns
- Keep payment connector configurations secure