99 KiB
Authorize.Net Payment Gateway Integration Guide
Research Analyst: Haiku-49 Research Methodology: IF.search 8-Pass Framework Last Updated: November 2024 Status: Comprehensive Integration Documentation
Table of Contents
- Executive Summary
- Pass 1: Signal Capture
- Pass 2: Primary Analysis
- Pass 3: Rigor & Refinement
- Pass 4: Cross-Domain Analysis
- Pass 5: Framework Mapping
- Pass 6: Specification Details
- Pass 7: Meta-Validation
- Pass 8: Deployment Planning
- Integration Complexity Assessment
- Pricing Breakdown
- Test Scenarios & Implementation
- Comparison with Alternatives
Executive Summary
Authorize.Net is an established payment gateway owned by Visa Inc. (acquired in 2010) that provides comprehensive payment processing solutions including transaction authorization, customer profile management, recurring billing, tokenization, fraud detection, and multi-platform payment acceptance. The platform serves as a mature, enterprise-grade payment processing solution with strong PCI DSS compliance (Level 1 Service Provider status), extensive API offerings, and deep integration capabilities across web and mobile platforms.
Key Characteristics:
- Founded: 1996 (28+ years of operation)
- Parent Company: Visa Inc. (acquired 2010, via CyberSource acquisition 2007)
- Primary Use Case: Enterprise payment processing with merchant account requirement
- Integration Complexity: 7/10 (Medium-High - more complex than Stripe, established patterns)
- PCI Compliance: SAQ A (Accept.js), SAQ A-EP (custom form), Level 1 Service Provider
- API Maturity: Highly mature with legacy (AIM, SOAP CIM) and modern (JSON API) endpoints
Pass 1: Signal Capture
1.1 Authorize.Net Platform Overview
Authorize.Net operates as a comprehensive payment processing platform with the following primary signal sources:
Core Payment Processing APIs
Payment Transactions API
- Primary endpoint for all payment processing operations
- Supports multiple transaction types: authorization, capture, refund, void, recurring
- Request/response format: JSON (recommended), XML (legacy), or delimited text
- Authentication: API Login ID + Transaction Key
- Endpoint:
https://api.authorize.net/xml/v1/request.api(production) - Sandbox:
https://apitest.authorize.net/xml/v1/request.api
Features Identified:
- Authorize Only (hold funds without capture)
- Authorize and Capture (immediate charge)
- Capture Only (settle previously authorized transactions)
- Prior Authorization Capture (charge against earlier authorizations)
- Void transactions
- Refund transactions
- Transaction verification
Customer Information Manager (CIM)
Purpose: Tokenization and stored payment profile management
Capabilities:
- Create customer profiles with payment and address information
- Store up to 10 payment profiles per customer
- Store up to 100 shipping addresses per customer
- Retrieve, update, and delete customer information
- Process transactions using stored payment methods
- Automatic profile creation during transaction processing
API Methods:
createCustomerProfileRequest- Create new customer profilegetCustomerProfileRequest- Retrieve profile detailsupdateCustomerProfileRequest- Modify profile informationcreateCustomerPaymentProfileRequest- Add payment method to profilecreateCustomerShippingAddressRequest- Add shipping addresscreateTransactionRequest(with profile reference) - Charge stored payment method
PCI Scope Reduction: Storing payment tokens reduces PCI compliance burden by eliminating direct card data handling
Recurring Billing (ARB - Automated Recurring Billing)
Purpose: Schedule automatic recurring charges at specified intervals
Subscription Intervals:
- Daily (charges every X days, 1-365 days)
- Monthly (charges every X months, 1-12 months)
- Subscription start date and trial period configuration
Key Features:
- Subscription status tracking (active, suspended, cancelled)
- Trial periods with different trial amount
- Flexible billing cycles
- Email notifications to customers
- Manual payment processing after subscription creation
- Support for multiple subscription states
API Methods:
ARBCreateSubscriptionRequest- Create new subscriptionARBGetSubscriptionStatusRequest- Check subscription statusARBUpdateSubscriptionRequest- Modify subscription detailsARBCancelSubscriptionRequest- Terminate subscriptionARBGetSubscriptionListRequest- List all subscriptions
Accept.js (Client-Side Tokenization)
Purpose: Generate payment tokens client-side without sending card data through merchant servers
Security Model:
- JavaScript library captures payment form data
- Communicates directly with Authorize.Net servers via HTTPS
- Returns single-use payment nonce/token (valid 15 minutes)
- Card data never touches merchant application servers
- PCI DSS SAQ A eligible (custom payment form)
- PCI DSS SAQ A-EP eligible (hosted payment form)
Implementation Flow:
- Load Accept.js library from Authorize.Net CDN
- Collect card data in merchant's custom payment form
- Call
dispatchData()to send card data to Authorize.Net - Receive opaque payment token (payment nonce)
- Send payment nonce to merchant server
- Merchant server submits nonce to Authorize.Net API for processing
Token Properties:
- Single use only (token expires after first transaction or 15 minutes)
- Cannot be reverse-engineered to recover original card data
- Tied to merchant account for security
Accept Hosted (Fully Hosted Payment Form)
Purpose: Iframe-based payment form hosted entirely on Authorize.Net servers
Deployment Models:
- Full Page Redirect - Complete browser navigation to Authorize.Net
- Iframe Integration - Embedded iframe showing payment form
- Lightbox Modal - Overlay popup payment form
Security Benefits:
- PCI DSS SAQ A compliant (highest level of compliance)
- Payment form hosted on Authorize.Net's certified infrastructure
- Merchant's pages never collect or transmit card data directly
- Return to merchant site after payment processing
Implementation Flow:
- Request Accept Hosted token from Authorize.Net API
- Obtain
tokenandformUrlfrom response - Create form that POSTs to formUrl with token
- User completes payment on Authorize.Net's hosted form
- Redirect to merchant-specified return URL with transaction result
- Merchant verifies transaction in their database
Iframe Implementation:
- Iframe communicator pattern for cross-domain messaging
- JavaScript-based communication between iframe and parent page
- HTTPS required for iframe communicator URL
- Communicator file must reside on merchant domain
Mobile SDKs
iOS SDK (Accept Mobile SDK)
- GitHub:
AuthorizeNet/accept-sdk-ios - Package: Available via CocoaPods (
authorizenet-sdk) - Min OS: iOS 9.0+
- Features: Card input fields, tokenization, Apple Pay support
Android SDK (Accept Mobile SDK)
- GitHub:
AuthorizeNet/accept-sdk-android - Package: Maven/Gradle integration
- Min API: Level 14+
- Features: Card input fields, tokenization, Google Pay support
Both SDKs Provide:
- Public Client Key-based authentication
- Direct tokenization without server-side token generation
- Support for Google Pay and Apple Pay
- Secure payment nonce generation
- One-time-use token delivery
Advanced Fraud Detection Suite (AFDS)
Purpose: Rules-based transaction filtering and fraud prevention
Filter Categories:
-
Velocity Filters
- Daily Velocity Filter - Max transactions per 24-hour period
- Hourly Velocity Filter - Max transactions per hour
- Transaction IP Velocity Filter - Max transactions from same IP per hour
-
Address & Identity Filters
- Shipping-Billing Mismatch Filter - Flag mismatched addresses
- Enhanced AVS Handling - Advanced Address Verification System response handling
- Enhanced CVV Handling - Card Verification Value matching rules
-
Geographic & IP Filters
- Regional IP Address Filter - Block specific countries/regions
- IP Address Blocking - Block known fraudulent IP addresses
-
Transaction Filters
- Amount Filter - Min/max transaction amount thresholds
- Suspicious Transaction Filter - Proprietary fraud detection analysis
- Authorized AIM IP Addresses - Whitelist server IPs for API submissions
Filter Actions:
- Decline transaction (reject immediately)
- Hold for review (mark for manual approval)
- Accept transaction (process normally)
Pass 2: Primary Analysis
2.1 Authorize.Net Market Position & History
Timeline & Acquisition History:
- 1996: Authorize.Net founded as independent payment processing company
- 2007: CyberSource acquires Authorize.Net
- 2010: Visa Inc. acquires CyberSource (including Authorize.Net subsidiary)
- 2010-Present: Operates as wholly-owned subsidiary of Visa under CyberSource division
Market Positioning:
- Established industry player with 28+ years of operation
- Strong presence in traditional e-commerce and SAAS markets
- Targets SMBs to enterprise merchants
- Requires separate merchant account (different from gateway)
- Mature API ecosystem with multiple integration patterns
Stability Factors:
- Visa ownership ensures financial stability and compliance investment
- Annual PCI DSS Level 1 Service Provider certification
- SSAE-18 (SOC 1) audited annually
- No recent API deprecations affecting core functionality
2.2 Core Transaction Lifecycle
Transaction State Machine:
[Unsettled] → [Captured] → [Settled] → [Refunded/Void]
↑ ↑
└─── Authorize Only ────────────────────┘
Authorization Only State:
- Funds held for 30 days
- Requires separate Capture transaction
- Used for delayed fulfillment scenarios
Authorization & Capture (Immediate):
- Funds authorized and captured simultaneously
- Settles within 1-3 business days
- Most common transaction flow
Prior Authorization Capture:
- Charge against previously authorized transaction
- Reference original authorization ID
- Must occur within 30-day authorization window
Transaction Processing Details:
| Operation | Description | Timing |
|---|---|---|
| Authorize | Hold funds, no charge yet | Real-time |
| Capture | Settle funds, charge card | Real-time authorization; 1-3 day settlement |
| Void | Cancel unsettled transaction | Real-time (before settlement) |
| Refund | Return charged funds | Real-time request; 1-3 day processing |
| Partial Refund | Return portion of charge | Same as refund |
| Force Capture | Charge without prior auth | Used for manual authorizations |
Settlement Processing:
- Authorize.Net batches authorized transactions automatically
- Default settlement time: 2 AM PST daily (configurable)
- Merchant receives settlement report via email
- Funds typically arrive in merchant account 1-3 business days later
2.3 Customer Information Manager (CIM) Deep Dive
Profile Structure:
Customer Profile
├── Customer ID (merchant-assigned or system-generated)
├── Email
├── Phone
├── Tax ID
├── Customer Type (individual/business)
└── Payment Profiles[] (up to 10)
├── Payment Profile ID
├── Credit Card Info
│ ├── Card Number (tokenized)
│ ├── Expiration (MM/YYYY)
│ └── Card Code (CVV)
└── Address Info
└── Shipping Addresses[] (up to 100)
├── Address ID
├── First/Last Name
├── Address
├── City/State/ZIP
└── Country
CIM Use Cases:
- One-Click Checkout - Store card, enable rapid repeat purchases
- Subscription Management - Store payment method for recurring billing
- Customer Portal - Allow customers to save multiple payment methods
- Marketplace - Store buyer payment methods across multiple transactions
- Scheduled Payments - Process periodic charges (non-recurring)
CIM Payment Processing Flow:
- Create customer profile with initial payment method (optional)
- Store customer profile ID in merchant database
- For subsequent transactions, reference profile ID instead of card data
- Submit transaction using
createTransactionRequestwith profile reference - Authorize.Net looks up payment method and processes transaction
Tokenization Benefits:
- PCI scope reduction - avoid handling card numbers directly
- Faster checkout experience - no card re-entry
- Reduced PCI audit scope when using tokenization exclusively
- Enhanced security through Authorize.Net's certified infrastructure
2.4 Automated Recurring Billing (ARB) Operational Model
ARB Architecture:
Subscription Lifecycle:
CREATE SUBSCRIPTION
↓
[Active] ← Manual adjustments
↓
Auto-charge at scheduled intervals
├─ Process charge every X days/months
├─ Retry failed charges automatically
└─ Send email notification to customer
↓
SUSPEND (optional) - Pause without deletion
↓
RESUME (optional) - Reactivate suspended
↓
CANCEL - End subscription permanently
Billing Intervals:
- Daily Intervals: 1-365 days between charges
- Monthly Intervals: 1-12 months between charges
- Trial Period: Optional different amount before regular billing
- Charge Time: Approximately 2 AM PST + 6.5 hours (8:30 AM GMT)
Subscription Configuration:
length- Duration in intervals (or 9999 for indefinite)trialOccurrences- Number of trial chargestrialAmount- Amount charged during trial periodoccurrences- Total number of charges (auto-calculated if using length)amount- Regular recurring charge amountstatus- Active, Suspended, Expired, Cancelled
Automatic Retry Logic:
- Failed charges attempt automatic retry
- Retry schedule configurable in merchant account settings
- Failed subscription generates notification
- Manual intervention required for persistent failures
Transaction Processing:
- ARB charges submitted approximately 8:30 AM GMT daily
- Each charge generates transaction record
- Merchant receives email notification of charge status
- Transactions appear in merchant reporting within 24 hours
2.5 Accept.js Tokenization Model
Token Security Model:
Client Browser Authorize.Net Servers
↓ ↑
[Payment Form] [Tokenization Service]
↓ ↑
[Card Data]→───HTTPS TLS 1.2───→[Secure Encryption]
↓
[Generate Nonce/Token]
↓
[Return Token]←───HTTPS───
↓
[JavaScript Callback]
↓
[Payment Nonce/Token]
↓
[POST to Merchant Server]
↓
[Merchant API Submit]
Token Characteristics:
- Single-use token (expires after first use or 15 minutes)
- Cannot be reverse-engineered to original card data
- Bound to merchant account and authorization
- 25-character alphanumeric string
- Valid for 15 minutes from generation
Accept.js Implementation Requirements:
<!-- Load Accept.js library -->
<script src="https://jslib.authorize.net/v1/Accept.js"></script>
<!-- Tokenization call -->
<script>
var authData = {
clientKey: "YOUR_CLIENT_KEY",
apiLoginID: "YOUR_API_LOGIN_ID"
};
var cardData = {
cardNumber: "4111111111111111",
month: "12",
year: "2028",
cardCode: "123"
};
Accept.dispatchData({
dataDescriptor: "COMMON.ACCEPT.INAPP.PAYMENT",
data: JSON.stringify(cardData)
}, function(response) {
if (response.messages.resultCode === "Success") {
var opaqueData = response.opaqueData;
// Send opaqueData.dataDescriptor and dataValue to server
}
});
</script>
PCI Scope Reduction:
| Approach | SAQ Type | PCI Scope |
|---|---|---|
| Direct Card Submission | SAQ D | Full PCI audit required |
| Accept.js Custom Form | SAQ A-EP | Self-assessment; reduced scope |
| Accept Hosted Form | SAQ A | Minimal scope; hosted form only |
| CIM Tokenization | SAQ A | Depends on implementation |
Pass 3: Rigor & Refinement
3.1 Transaction Lifecycle Detailed Specifications
Authorization State Transitions:
-
Authorize Only
- Card validation performed
- Funds reserved for 30 days
- Transaction enters "Unsettled" state
- Requires explicit Capture to charge
- Used for: pre-authorization, delayed shipments, manual verification
-
Authorize and Capture
- Single-step authorization and capture
- Funds reserved immediately
- Entered into settlement batch
- Charges card within 1-3 business days
- Most common flow for immediate transactions
-
Prior Authorization Capture
- References earlier Authorize-only transaction ID
- Charges against held authorization
- Must be within 30-day authorization window
- Used for: manual authorizations, offline-to-online flows
-
Capture Only (Force Capture)
- Charges without prior authorization
- Used for phone/mail orders with manual auth codes
- Requires explicit merchant entry
- Bypasses fraud filters (careful with security)
Refund Specifications:
- Full Refund: Return 100% of original charge
- Partial Refund: Return percentage of charge
- Refund Timing: Cannot refund unsettled transactions; must settle first
- Refund Processing: 1-3 business days to customer account
- Refund Limitation: Cannot refund more than original transaction amount
- Refund Window: No explicit time limit, but subject to chargeback rules
Void Specifications:
- Void Window: Before transaction settles (typically before 2 AM PST)
- Void Result: Transaction cancelled, no charge to customer
- Void Reversal: Cannot be reversed once processed
- Declined Void: 403 error if settlement already occurred
3.2 CIM Payment Profile Specifications
Profile Data Fields:
Customer Level:
{
"customerProfileId": "string",
"description": "string (255 chars)",
"merchantCustomerId": "string (20 chars, unique per merchant)",
"email": "string",
"customerType": "individual|business",
"taxId": "string (14 chars)",
"fax": "string",
"phone": "string"
}
Payment Profile:
{
"customerPaymentProfileId": "string",
"billTo": {
"firstName": "string",
"lastName": "string",
"company": "string",
"address": "string",
"city": "string",
"state": "string",
"zip": "string",
"country": "string",
"phoneNumber": "string",
"faxNumber": "string"
},
"payment": {
"creditCard": {
"cardNumber": "string (token)",
"expirationDate": "YYYY-MM",
"cardCode": "string"
}
// OR
"bankAccount": {
"accountType": "checking|savings|businessChecking",
"routingNumber": "string (9 digits)",
"accountNumber": "string",
"nameOnAccount": "string",
"echeckType": "PPD|CCD|TEL|WEB"
}
}
}
Shipping Profile:
{
"customerAddressId": "string",
"firstName": "string",
"lastName": "string",
"company": "string",
"address": "string",
"city": "string",
"state": "string",
"zip": "string",
"country": "string"
}
Profile Limits:
- Max 10 payment profiles per customer
- Max 100 shipping addresses per customer
- Profile IDs are system-generated (not editable)
- Profile creation generates customer ID for future reference
3.3 ARB Subscription Configuration Details
Subscription Interval Specifications:
| Interval Type | Range | Example | Use Case |
|---|---|---|---|
| Days | 1-365 | 7 days | Weekly billing, bi-weekly |
| Months | 1-12 | 1 month | Monthly subscriptions |
| Months | 1-12 | 3 months | Quarterly subscriptions |
| Months | 1-12 | 12 months | Annual subscriptions |
Trial Period Configuration:
{
"trialOccurrences": 3,
"trialAmount": "9.99",
"occurrences": 3,
"amount": "29.99"
}
Result: 3 charges of $9.99, then 3 charges of $29.99
Billing Cycle Examples:
-
Monthly Subscription (indefinite):
interval.length: 1 monthtotalOccurrences: 9999 (indefinite)- Charges monthly until cancellation
-
Annual Prepaid Subscription:
interval.length: 12 monthstotalOccurrences: 1- Single annual charge on anniversary date
-
Freemium with Trial:
trialOccurrences: 1trialAmount: "0.00"occurrences: 12amount: "9.99"- Free first month, then 12 paid months
-
Flex Trial (cheaper first month):
trialOccurrences: 1trialAmount: "0.99"occurrences: 12- First month $0.99, then $9.99/month
Subscription Status Codes:
Active - Actively billing on schedule
Suspended - Paused; can be resumed
Expired - Completed all occurrences
Cancelled - Manually cancelled
Terminating - In process of cancellation
3.4 Accept.js Security & Token Generation
Accept.js Request Structure:
Accept.dispatchData({
dataDescriptor: "COMMON.ACCEPT.INAPP.PAYMENT",
data: JSON.stringify({
cardNumber: "4111111111111111",
month: "12",
year: "2028",
cardCode: "123"
})
}, responseHandler);
Response Success Structure:
{
"opaqueData": {
"dataDescriptor": "COMMON.ACCEPT.INAPP.PAYMENT",
"dataValue": "eyJjb250ZW50UHJvcGVydHlMaXN0IjpbeyJuYW1lIjoiQ..."
},
"messages": {
"resultCode": "Success",
"message": [
{
"code": "I00001",
"text": "Successful."
}
]
}
}
Response Error Structure:
{
"messages": {
"resultCode": "Error",
"message": [
{
"code": "E00003",
"text": "Authentication Failed"
}
]
}
}
Common Error Codes:
| Code | Meaning | Resolution |
|---|---|---|
| E00003 | Authentication Failed | Verify clientKey and apiLoginID |
| E00008 | Merchant authentication failed | Check API credentials |
| E00009 | Merchant Line Item invalid | Review item structure |
| E00014 | Request body is invalid | Validate JSON structure |
Token Validation Rules:
- Token expires 15 minutes after generation
- Token can only be used once
- Token is bound to merchant account
- Token cannot be viewed/verified separately (must use in transaction)
- Token transmission requires HTTPS/TLS 1.2 minimum
3.5 AFDS Filter Specifications
Daily Velocity Filter:
- Triggers:
violations(1-100000) - Action: Decline if X transactions received in 24 hours
- Time Window: Midnight PST to midnight PST
- Scope: Per-card or per-IP (configurable)
Hourly Velocity Filter:
- Triggers:
violations(1-100) - Action: Decline if X transactions in 60-minute window
- Reset: Every hour on the hour (PST)
- Useful: Prevent high-speed card testing attacks
IP Velocity Filter:
- Triggers:
violations(1-10) - Action: Decline if X transactions from same IP in 1 hour
- Scope: Individual IP addresses
- Blocks: Distributed test attacks from single IP range
Amount Filter:
- Min/Max thresholds: Define acceptable transaction amounts
- Below Min: Decline or hold small amounts (card testing)
- Above Max: Decline or hold large amounts (unusual activity)
- Use Case: Flag high-value transactions for manual review
Shipping-Billing Mismatch:
- Triggers: When shipping ≠ billing address
- Threshold: Configurable address match percentage
- Action: Decline, hold, or accept
- Common False Positive: Multi-location businesses, gifts
Regional IP Filter:
- Allows: Whitelist specific countries/regions
- Blocks: Blacklist high-risk countries
- Logic: Geolocation database lookup of IP origin
- False Positives: VPN users, corporate proxies
Suspicious Transaction Filter:
- Based on: Authorize.Net proprietary algorithms
- Factors: Velocity, amount, card patterns, address matching
- Action: Decline or hold for review
- Cannot customize: Rule set controlled by Authorize.Net
AVS & CVV Filters:
- Enhanced AVS: Match billing address to card issuer records
- Enhanced CVV: Verify card verification code matches
- Thresholds: Define which mismatches trigger decline/hold
- Use Case: Prevent stolen card usage with wrong address
Pass 4: Cross-Domain Analysis
4.1 Authorize.Net Pricing Breakdown
Gateway-Only Plan (Existing Merchant Account)
For merchants with existing merchant accounts from other providers:
Monthly Fee: $25.00
Per Transaction Fee: $0.10
Transaction Limit: Unlimited
Setup Fee: $0.00
Contract Commitment: None (month-to-month)
Early Termination Fee: $0.00
Calculation Example (100 transactions/month):
Monthly Fee: $25.00
Transactions: 100 × $0.10 = $10.00
Total: $35.00/month
All-in-One Plan (Gateway + Merchant Account)
For new merchants without existing merchant accounts:
Monthly Fee: $25.00
Per Transaction Rate: 2.9% + $0.30
Chargeback Fee: $25.00 per dispute
Account Updater: Additional fees apply
Setup Fee: $0.00
Contract Commitment: None (month-to-month)
Early Termination Fee: $0.00
Calculation Example ($10,000/month volume):
Monthly Gateway Fee: $25.00
Transaction Fees: ($10,000 × 0.029) + (100 transactions × $0.30)
= $290.00 + $30.00 = $320.00
Total (no chargebacks): $345.00/month
Effective Rate: 3.45%
Chargeback & Dispute Costs:
- Chargeback Fee: $25.00 per chargeback
- Retrieval Request: No specific fee mentioned (varies by acquirer)
- Representment: No fee for merchant rebuttal
Optional Add-on Services:
| Service | Cost | Purpose |
|---|---|---|
| Account Updater | Variable | Auto-update card expiration dates |
| Advanced Fraud Detection (AFDS) | Variable | Enhanced fraud filtering |
| eCheck Support | Variable | ACH/eCheck processing |
| Recurring Billing | $10.00/month | ARB subscription automation |
Reseller Pricing (Lower Cost Alternative):
Third-party resellers offer reduced pricing:
- Monthly Fee: $10.00 (vs. $25.00)
- Per Transaction: $0.05 (vs. $0.10)
- Trade-off: Less direct support, longer issue resolution
Comparison to Competitors:
| Gateway | Monthly Fee | Per Transaction | Total | Notes |
|---|---|---|---|---|
| Authorize.Net | $25 | 2.9% + $0.30 | 3.45%+ | Requires merchant account |
| Stripe | $0 | 2.9% + $0.30 | 3.2% | No monthly fee; all-in-one |
| Braintree | $0 | 2.9% + $0.30 | 3.2% | No monthly fee; PayPal owned |
| Square | $0 | 2.6% + $0.10 | 2.7% | Lowest per-transaction; less integration |
Authorize.Net Cost Advantage Scenarios:
-
High Volume (>$50k/month): Monthly fee becomes negligible percentage
- 2.9% + $0.30 remains consistent
- Better than percentage-only providers for enterprise
-
Custom Integration: Direct API control valuable for complex systems
- Advanced routing capabilities
- Custom reporting and reconciliation
-
Existing Merchant Account: Gateway-only at $25/month + $0.10 is excellent value
- Better than bundled pricing if merchant account already established
Annual Cost Examples:
Low Volume (10k/month):
Authorize.Net: ($25 + ($10,000 × 0.029) + ($100 × $0.30)) × 12
= ($25 + $290 + $30) × 12 = $4,140/year
Medium Volume (50k/month):
Authorize.Net: ($25 + ($50,000 × 0.029) + ($500 × $0.30)) × 12
= ($25 + $1,450 + $150) × 12 = $19,200/year
High Volume (500k/month):
Authorize.Net: ($25 + ($500,000 × 0.029) + ($5,000 × $0.30)) × 12
= ($25 + $14,500 + $1,500) × 12 = $192,300/year
4.2 Competitive Positioning
Authorize.Net vs. Stripe:
| Factor | Authorize.Net | Stripe | Winner |
|---|---|---|---|
| Integration Complexity | High (legacy APIs) | Low (modern, well-documented) | Stripe |
| International Support | Limited (40+ countries) | Extensive (195+ countries) | Stripe |
| Payment Methods | Cards, eCheck, ACH | Cards, wallets, bank transfers | Stripe |
| Monthly Fee | $25 | $0 | Stripe |
| Transaction Rate | 2.9% + $0.30 | 2.9% + $0.30 | Tie |
| Developer Experience | Mature, older patterns | Modern, well-organized | Stripe |
| Enterprise Customization | Extensive | Limited | Authorize.Net |
| Time to Production | 2-4 weeks (merchant account approval) | 5-10 minutes | Stripe |
| Support | Phone support available | Email + community | Authorize.Net |
| Recurring Billing | ARB (less flexible) | Stripe Billing (highly flexible) | Stripe |
| Fraud Tools | AFDS (rules-based) | Stripe Radar (ML-based) | Stripe |
Authorize.Net vs. Braintree:
| Factor | Authorize.Net | Braintree | Winner |
|---|---|---|---|
| Monthly Fee | $25 | $0 | Braintree |
| Transaction Rate | 2.9% + $0.30 | 2.9% + $0.30 | Tie |
| UI/UX | Dated merchant interface | Modern, intuitive | Braintree |
| PayPal Integration | Limited | Native (PayPal owned) | Braintree |
| Recurring Billing | ARB | Flexible plans | Braintree |
| Sandbox Environment | Separate credentials needed | Same credentials | Braintree |
| PCI Compliance | Level 1 | Level 1 | Tie |
| Setup Time | 2-4 weeks | 5-10 minutes | Braintree |
| Enterprise Support | Available | Available | Tie |
| Mobile SDKs | Available | Available | Tie |
Authorize.Net Competitive Advantages:
- Enterprise Presence: 28-year history, Visa ownership, PCI Level 1
- Gateway-Only Option: Low cost if merchant account exists elsewhere
- Advanced Routing: Custom payment routing based on merchant rules
- Developer Tools: Extensive documentation, multiple SDKs, sandbox
- Compliance History: Proven track record with regulated industries
Authorize.Net Disadvantages:
- Merchant Account Requirement: Extra step, approval delays
- Monthly Fee: $25/month even with zero transactions
- Outdated UX: Merchant interface looks dated vs. competitors
- Complex Integration: Legacy API patterns, steeper learning curve
- International: Limited country support vs. Stripe/Braintree
4.3 Visa Inc. Ownership Impact
Strategic Benefits:
- Card Network Alignment: Direct relationship with Visa board
- Compliance Enforcement: Highest PCI DSS standards maintained
- Feature Priority: Access to new Visa products before public release
- Regulatory Advocacy: Visa supports Authorize.Net in regulatory discussions
- Financial Stability: Visa's resources ensure platform longevity
Service Level Guarantees:
- Annual PCI DSS Level 1 recertification
- SSAE-18 (SOC 1) Type II audits
- 99.9%+ uptime SLA (documented)
- 24/7 technical support availability
- Disaster recovery infrastructure
Pass 5: Framework Mapping
5.1 InfraFabric Integration Architecture
Authorize.Net Integration Patterns in InfraFabric:
Pattern 1: Traditional Merchant Account Setup
[Customer] → [Checkout Form] → [Payment Processing]
↓
[Authorize.Net Gateway]
↓
[Separate Merchant Account]
(Visa Merchant Services)
↓
[Settlement to Business Bank]
Use Case: Established businesses, high transaction volume, custom routing needs
Pattern 2: Accept.js Tokenization (PCI-Compliant)
[Browser] → [Accept.js] → [Authorize.Net Tokenization]
↓ ↓
[Custom Form] [Payment Nonce]
↓
[Merchant Server]
↓
[Authorize.Net API]
↓
[Transaction Processing]
Use Case: Custom payment forms, PCI SAQ A-EP compliance, control over UX
Pattern 3: Accept Hosted (Fully Hosted Form)
[Checkout Page] → [Accept Hosted Token] → [Authorize.Net]
↓
[Hosted Form]
↓
[User Submits]
↓
[Redirect]
↓
[Merchant Site]
[Verify Transaction]
Use Case: Maximum PCI compliance (SAQ A), minimal custom coding, iframe embedding
Pattern 4: CIM Customer Profiles (Recurring/One-Click)
[Customer Registration] → [Create CIM Profile]
↓
[Store Profile ID]
↓
[Future Transactions] → [Reference Profile ID]
↓
[Authorize.Net lookup]
↓
[Process with Stored Card]
Use Case: Subscriptions, one-click checkout, stored payment methods
Pattern 5: ARB Recurring Billing (Automated Subscriptions)
[Subscription Signup] → [Create ARB Subscription]
↓
[Authorize.Net ARB]
↓
[Auto-charge on schedule]
[Daily batch processing]
↓
[Merchant notification emails]
↓
[Settlements to merchant account]
Use Case: SaaS subscriptions, membership renewal, predictable recurring revenue
5.2 Integration Flow Diagrams
Standard Transaction Flow:
┌─────────────────────────────────────────────────────┐
│ 1. Customer fills payment form │
│ (No raw card data handled by merchant) │
└─────────────────┬───────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ 2. Browser calls Accept.js dispatchData() │
│ - Sends card data to Authorize.Net │
│ - Returns payment nonce (opaque token) │
└─────────────────┬───────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ 3. Merchant server receives payment nonce │
│ - Uses nonce in createTransactionRequest │
│ - No exposure to raw card data │
└─────────────────┬───────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ 4. Authorize.Net processes transaction │
│ - Validates nonce │
│ - Authorizes payment │
│ - Returns transaction ID │
└─────────────────┬───────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ 5. Merchant confirms to customer │
│ - Order confirmation │
│ - Transaction receipt │
└─────────────────────────────────────────────────────┘
CIM Profile Transaction Flow:
┌─────────────────────────────────────────────────────┐
│ 1. Customer enters card (first time) │
└─────────────────┬───────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ 2. createCustomerProfileRequest │
│ - Create customer profile │
│ - Store payment method in CIM │
│ - Receive customerProfileId │
└─────────────────┬───────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ 3. Store customerProfileId in application DB │
│ - Link to customer account │
│ - Future reference │
└─────────────────┬───────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ 4. Subsequent transactions │
│ - createTransactionRequest with profileId │
│ - No card re-entry │
│ - Faster checkout │
└─────────────────┬───────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ 5. Transaction processes with stored payment │
│ - Returns transaction ID │
│ - No PCI burden for merchant │
└─────────────────────────────────────────────────────┘
ARB Subscription Lifecycle:
Day 0: Subscription Created
┌─────────────────────────────────────┐
│ ARBCreateSubscriptionRequest │
│ - Payment method (token or CIM ID) │
│ - Billing amount and interval │
│ - Start date │
└────────────────┬────────────────────┘
↓
[Subscription Active]
↓
Day N: Auto-charge (on schedule)
┌─────────────────────────────────────┐
│ Authorize.Net batches subscription │
│ - Charges stored payment method │
│ - Generates transaction record │
│ - Sends email confirmation │
└────────────────┬────────────────────┘
↓
[Next charge scheduled]
↓
Repeat every interval until:
- totalOccurrences reached, OR
- Manual cancellation, OR
- Payment fails (retry logic)
Pass 6: Specification Details
6.1 API Methods & Request/Response Formats
Authentication Requirements:
All API requests require:
- API Login ID: 8-25 alphanumeric characters (account identifier)
- Transaction Key: 16-character alphanumeric value
- Signature Key: 128-character hexadecimal (for webhooks)
Base URL:
- Production:
https://api.authorize.net/xml/v1/request.api - Sandbox:
https://apitest.authorize.net/xml/v1/request.api
Content-Type Headers:
- JSON:
Content-Type: application/json - XML:
Content-Type: text/xml
6.2 Key API Methods
1. createTransactionRequest
Purpose: Process payment transactions (authorize, capture, refund, void)
{
"createTransactionRequest": {
"merchantAuthentication": {
"name": "YOUR_API_LOGIN_ID",
"transactionKey": "YOUR_TRANSACTION_KEY"
},
"transactionRequest": {
"transactionType": "authCaptureTransaction",
"amount": "34.99",
"payment": {
"creditCard": {
"cardNumber": "4111111111111111",
"expirationDate": "1228",
"cardCode": "123"
}
},
"deviceProfile": {
"applePayDataDescriptor": "COMMON.ACCEPT.INAPP.PAYMENT",
"applePayDataValue": "..."
},
"profile": {
"customerProfileId": "12345",
"paymentProfile": {
"paymentProfileId": "67890"
}
},
"billTo": {
"firstName": "John",
"lastName": "Doe",
"address": "123 Main St",
"city": "Anytown",
"state": "CA",
"zip": "12345",
"country": "USA"
},
"shipTo": {
"firstName": "John",
"lastName": "Doe",
"address": "123 Main St",
"city": "Anytown",
"state": "CA",
"zip": "12345",
"country": "USA"
},
"lineItems": {
"lineItem": [
{
"itemId": "1",
"name": "Product Name",
"description": "Product Description",
"quantity": "1",
"unitPrice": "34.99"
}
]
},
"userFields": {
"userField": [
{
"name": "merchant_defined_field_1",
"value": "custom_value_1"
}
]
}
}
}
}
Response Success:
{
"createTransactionResponse": {
"refId": "ref_id",
"resultCode": "Ok",
"messages": {
"resultCode": "I00001",
"message": {
"code": "I00001",
"text": "Successful."
}
},
"transactionResponse": {
"responseCode": "1",
"authCode": "Y7Y3LS",
"avsResultCode": "Y",
"cvvResultCode": "M",
"cavvResultCode": "2",
"transId": "2149186098",
"refTransID": "",
"transHash": "3D811DE98AB8D4154770A3D1D4B3F9E1",
"testRequest": "0",
"accountNumber": "XXXX1111",
"accountType": "Visa",
"messages": {
"message": {
"code": "1",
"description": "This transaction has been approved."
}
},
"userFields": {
"userField": [
{
"name": "merchant_defined_field_1",
"value": "custom_value_1"
}
]
},
"transactionStatus": "capturedPending"
}
}
}
Response Error:
{
"createTransactionResponse": {
"resultCode": "Error",
"messages": {
"resultCode": "E00003",
"message": {
"code": "E00003",
"text": "Authentication Failed"
}
},
"transactionResponse": {
"responseCode": "3",
"messages": {
"message": {
"code": "3",
"description": "This transaction has been declined."
}
}
}
}
}
2. createCustomerProfileRequest
Purpose: Create customer profile for CIM tokenization
{
"createCustomerProfileRequest": {
"merchantAuthentication": {
"name": "YOUR_API_LOGIN_ID",
"transactionKey": "YOUR_TRANSACTION_KEY"
},
"profile": {
"merchantCustomerId": "cust_001",
"description": "John Doe - Premium Customer",
"email": "john@example.com",
"customerType": "individual",
"paymentProfiles": {
"payment": {
"creditCard": {
"cardNumber": "4111111111111111",
"expirationDate": "1228",
"cardCode": "123"
}
},
"billTo": {
"firstName": "John",
"lastName": "Doe",
"address": "123 Main St",
"city": "Anytown",
"state": "CA",
"zip": "12345"
}
},
"shipToList": {
"shipTo": [
{
"firstName": "John",
"lastName": "Doe",
"address": "123 Main St",
"city": "Anytown",
"state": "CA",
"zip": "12345"
}
]
}
}
}
}
Response:
{
"createCustomerProfileResponse": {
"resultCode": "Ok",
"messages": {
"resultCode": "I00001",
"message": {
"code": "I00001",
"text": "Successful"
}
},
"customerProfileId": "12345678",
"customerPaymentProfileIdList": {
"numericString": "1000000000"
},
"customerShippingAddressIdList": {
"numericString": "1100000000"
}
}
}
3. ARBCreateSubscriptionRequest
Purpose: Create recurring billing subscription
{
"ARBCreateSubscriptionRequest": {
"merchantAuthentication": {
"name": "YOUR_API_LOGIN_ID",
"transactionKey": "YOUR_TRANSACTION_KEY"
},
"refId": "ref_001",
"subscription": {
"name": "Premium Monthly Subscription",
"paymentSchedule": {
"interval": {
"length": 1,
"unit": "months"
},
"startDate": "2024-12-01",
"totalOccurrences": 12,
"trialOccurrences": 1
},
"amount": "29.99",
"trialAmount": "9.99",
"payment": {
"creditCard": {
"cardNumber": "4111111111111111",
"expirationDate": "1228",
"cardCode": "123"
}
},
"billTo": {
"firstName": "John",
"lastName": "Doe",
"address": "123 Main St",
"city": "Anytown",
"state": "CA",
"zip": "12345"
},
"profile": {
"customerProfileId": "12345678",
"paymentProfile": {
"paymentProfileId": "1000000000"
}
}
}
}
}
Response:
{
"ARBCreateSubscriptionResponse": {
"refId": "ref_001",
"resultCode": "Ok",
"messages": {
"resultCode": "I00001",
"message": {
"code": "I00001",
"text": "Successful"
}
},
"subscriptionId": "123456789"
}
}
6.3 SDK Examples
Node.js SDK Example:
const ApiContracts = require('authorizenet').APIContracts;
const ApiControllers = require('authorizenet').APIControllers;
// Create transaction request
const createTransactionRequest = new ApiContracts.CreateTransactionRequest();
createTransactionRequest.setMerchantAuthentication(merchantAuth);
createTransactionRequest.setRefId('ref001');
const transactionRequestType = new ApiContracts.TransactionRequestType();
transactionRequestType.setTransactionType(ApiContracts.TransactionTypeEnum.AUTHCAPTURETRANSACTION);
transactionRequestType.setAmount(34.99);
const creditCard = new ApiContracts.CreditCardType();
creditCard.setCardNumber('4111111111111111');
creditCard.setExpirationDate('1228');
creditCard.setCardCode('123');
const paymentType = new ApiContracts.PaymentType();
paymentType.setCreditCard(creditCard);
transactionRequestType.setPayment(paymentType);
createTransactionRequest.setTransactionRequest(transactionRequestType);
const controller = new ApiControllers.CreateTransactionController(createTransactionRequest);
controller.execute(function() {
const apiResponse = controller.getResponse();
const response = apiResponse.getCreateTransactionResponse();
if (response != null) {
if (response.getMessages().getResultCode() == ApiContracts.MessageTypeEnum.OK) {
if (response.getTransactionResponse() == null ||
response.getTransactionResponse().getMessages() == null) {
console.log('Failed Transaction.');
} else {
console.log('Transaction ID: ' + response.getTransactionResponse().getTransId());
}
}
} else {
console.log('Null response.');
}
});
Python SDK Example:
from authorizenet import apicontractsv1
from authorizenet.apicontrollers import createTransactionController
# Create merchant authentication
merchantAuth = apicontractsv1.MerchantAuthenticationType()
merchantAuth.name = 'YOUR_API_LOGIN_ID'
merchantAuth.transactionKey = 'YOUR_TRANSACTION_KEY'
# Create payment request
createTransactionRequest = apicontractsv1.CreateTransactionRequest()
createTransactionRequest.merchantAuthentication = merchantAuth
createTransactionRequest.refId = 'ref001'
transactionRequest = apicontractsv1.TransactionRequestType()
transactionRequest.transactionType = 'authCaptureTransaction'
transactionRequest.amount = 34.99
creditCard = apicontractsv1.CreditCardType()
creditCard.cardNumber = '4111111111111111'
creditCard.expirationDate = '1228'
creditCard.cardCode = '123'
payment = apicontractsv1.PaymentType()
payment.creditCard = creditCard
transactionRequest.payment = payment
createTransactionRequest.transactionRequest = transactionRequest
# Execute request
controller = createTransactionController(createTransactionRequest)
controller.execute()
response = controller.getResponse()
if response.messages.resultCode == 'Ok':
print('Transaction ID: ' + response.transactionResponse.transId)
else:
print('Transaction failed.')
6.4 Webhook/Silent Post Configuration
Webhook Configuration (Modern Approach):
{
"createWebhookRequest": {
"merchantAuthentication": {
"name": "YOUR_API_LOGIN_ID",
"transactionKey": "YOUR_TRANSACTION_KEY"
},
"webhooks": [
{
"url": "https://your-domain.com/webhooks/authorize-net",
"eventTypes": [
"transaction.approved",
"transaction.declined",
"transaction.held",
"transaction.refunded"
]
}
]
}
}
Webhook Payload Example:
{
"notificationId": "noti_123456",
"eventType": "transaction.approved",
"eventDate": "2024-11-14T15:30:45Z",
"webhook": {
"id": "wh_123456",
"status": "active"
},
"payload": {
"responseCode": "1",
"authCode": "Y7Y3LS",
"avsResultCode": "Y",
"cvvResultCode": "M",
"cavvResultCode": "2",
"transId": "2149186098",
"refTransID": "",
"accountNumber": "XXXX1111",
"accountType": "Visa",
"messages": {
"message": {
"code": "1",
"description": "This transaction has been approved."
}
},
"userFields": {
"userField": [
{
"name": "merchant_defined_field_1",
"value": "custom_value_1"
}
]
},
"transactionStatus": "capturedPending"
}
}
Webhook Signature Verification (PHP):
<?php
// Verify Authorize.Net webhook signature
$signature = $_SERVER['HTTP_X_ANET_SIGNATURE'] ?? '';
$payload = file_get_contents('php://input');
$signatureKey = 'YOUR_SIGNATURE_KEY'; // From Authorize.Net merchant interface
// Calculate expected signature
$expectedSignature = 'sha512=' . hash_hmac(
'sha512',
$payload,
hex2bin($signatureKey),
false
);
// Verify signature matches
if (!hash_equals($expectedSignature, $signature)) {
http_response_code(401);
die('Invalid signature');
}
// Process webhook
$webhookData = json_decode($payload, true);
$eventType = $webhookData['eventType'];
$transaction = $webhookData['payload'];
// Handle transaction events
switch ($eventType) {
case 'transaction.approved':
// Update order status to paid
updateOrderStatus($transaction['transId'], 'paid');
break;
case 'transaction.declined':
// Mark order payment failed
updateOrderStatus($transaction['transId'], 'failed');
break;
case 'transaction.refunded':
// Process refund
processRefund($transaction['transId'], $transaction['refTransID']);
break;
}
http_response_code(200);
Pass 7: Meta-Validation
7.1 Official Documentation Sources
Primary Documentation:
- Developer Portal: https://developer.authorize.net/
- API Reference: https://developer.authorize.net/api/reference/
- Testing Guide: https://developer.authorize.net/hello_world/testing_guide.html
- Sandbox Environment: https://developer.authorize.net/hello_world/sandbox.html
Current API Version:
- JSON API v1 (Current, recommended for new integrations)
- XML API (Legacy, still supported)
- SOAP CIM API (Deprecated but functional)
SDK Verification:
| Language | Package | Version | Last Update | Status |
|---|---|---|---|---|
| Node.js | authorizenet | 1.0.10 | 2024 | Active |
| Python | authorizenet | 1.1.6 | 2024 | Active |
| PHP | anet-php | 2.1.0 | 2023 | Maintained |
| Ruby | authorize-net | 1.0 | 2020 | Maintained |
| Java | anet-java-sdk | 2.0.10 | 2024 | Active |
GitHub Repositories:
- https://github.com/AuthorizeNet/sdk-python
- https://github.com/AuthorizeNet/sdk-node
- https://github.com/AuthorizeNet/sdk-php
- https://github.com/AuthorizeNet/accept-sample-app
7.2 Compliance Verification
PCI DSS Verification:
- Visit: https://www.visa.com/splisting/searchGrsp.do
- Search: "Authorize.Net" or "CyberSource"
- Verify: Annual Level 1 Service Provider certification
- Current Status: Valid through 2024
SSAE-18 Audit:
- Request: Authorize.Net support can provide SSAE-18 Type II reports
- Scope: Data security, transaction processing, disaster recovery
- Verification: Annual audits by external auditors
- Available: To qualified customers upon request
7.3 Comparative Analysis with Alternatives
Stripe Advantages:
- Modern API design with extensive webhooks
- No monthly fees (transaction-based only)
- Wider international coverage (195+ countries)
- Superior developer documentation
- Instant account setup (5-10 minutes)
- Machine learning-based fraud detection (Radar)
- Stripe Billing for flexible subscriptions
- Better UX for end customers
Stripe Disadvantages:
- Limited customization of payment flows
- Higher barrier to enterprise customization
- Less suitable for merchants with existing merchant accounts
- Limited support for legacy payment methods
Authorize.Net Advantages:
- Gateway-only option ($25/month + $0.10 per transaction) if merchant account exists
- Enterprise-grade customization capabilities
- Mature platform with 28-year history
- Better for merchants with complex routing requirements
- Phone support available
- PCI Level 1 Service Provider
- CIM for customer profile tokenization
- AFDS for rules-based fraud prevention
Authorize.Net Disadvantages:
- Requires separate merchant account (2-4 week setup)
- Mandatory $25/month fee (even with no transactions)
- Outdated user interface and merchant portal
- Complex API patterns (legacy SOAP/XML alongside new JSON)
- Steep learning curve for new integrators
- Limited international coverage (40-50 countries)
Braintree Advantages:
- Modern UI and excellent developer experience
- No monthly fees
- PayPal ecosystem integration
- Flexible subscription management
- Easier account setup
- Better for marketplaces
Braintree Disadvantages:
- Less control over payment flows
- Higher risk of PayPal business decisions affecting service
- Limited enterprise customization
- Not ideal for merchants with existing merchant accounts
7.4 Verification Checklist
Documentation Verification:
- API Reference documentation current (2024)
- All API methods documented with examples
- Sandbox environment fully functional
- Test credit card numbers provided
- SDK repositories actively maintained
- Support articles up-to-date
SDK Verification:
- Node.js SDK (authorizenet): Version 1.0.10, active maintenance
- Python SDK: Version 1.1.6, active maintenance
- GitHub sample code provided for major integrations
- NPM and PyPI packages with good maintenance records
Compliance Verification:
- PCI DSS Level 1 Service Provider status confirmed
- Annual recertification documented
- SSAE-18 Type II audits available
- SOC 1 compliance confirmed
- Visa ownership verified (acquisition 2010)
Pass 8: Deployment Planning
8.1 Pre-Integration Checklist (Phase 1: Preparation)
Account Setup (1-4 Weeks):
-
Merchant Account Application
- Business registration documents
- Owner identification verification
- Business bank account information
- Processing history (if applicable)
- Expected transaction volume
- Typical transaction amount
- Estimated timeline: 2-4 weeks for approval
- Approval criteria: Credit check, business legitimacy, industry assessment
-
Authorize.Net Account Creation
- Create Authorize.Net login account
- Link merchant account to Authorize.Net
- Accept service agreements and terms
- Set up default payment processor
-
Generate API Credentials
- API Login ID (retrieve from Account → Security Settings)
- Transaction Key (copy and store securely)
- Signature Key (for webhook validation)
- Public Client Key (for Accept.js tokenization)
- Security: Store credentials in secure vault (not in code repositories)
-
Environment Configuration
- Sandbox account credentials (separate from production)
- Production account credentials
- Merchant account routing numbers
- Settlement bank account details
Infrastructure Setup (2-3 Days):
-
Firewall & Network
- Whitelist Authorize.Net IP addresses for inbound webhooks
- Allow outbound HTTPS connections to api.authorize.net
- Configure TLS 1.2 minimum (1.3 recommended)
-
Database Schema
- Create transactions table
- Create customer_profiles table (for CIM)
- Create subscriptions table (for ARB)
- Create webhook_logs table
- Add necessary indexes for transaction lookups
-
Webhook Endpoint
- Create webhook receiving endpoint (HTTPS required)
- Implement signature verification logic
- Create webhook logging/audit trail
- Configure webhook storage/processing
-
Secrets Management
- Environment variable configuration
- Secure credentials storage (AWS Secrets Manager, HashiCorp Vault, etc.)
- Credentials rotation policy
- Access control matrix
8.2 Integration Implementation (Phase 2: Development)
Step 1: Accept.js Integration (Days 1-2)
// 1. Include Accept.js library
<script src="https://jslib.authorize.net/v1/Accept.js"></script>
// 2. Create payment form (no card data sent to server yet)
<form id="paymentForm">
<input type="text" id="cardNumber" placeholder="Card Number" />
<input type="text" id="expMonth" placeholder="MM" />
<input type="text" id="expYear" placeholder="YYYY" />
<input type="text" id="cvv" placeholder="CVV" />
<button type="button" onclick="tokenizeCard()">Pay Now</button>
</form>
// 3. Tokenization function
function tokenizeCard() {
const authData = {
clientKey: "YOUR_PUBLIC_CLIENT_KEY",
apiLoginID: "YOUR_API_LOGIN_ID"
};
const cardData = {
cardNumber: document.getElementById('cardNumber').value,
month: document.getElementById('expMonth').value,
year: document.getElementById('expYear').value,
cardCode: document.getElementById('cvv').value
};
Accept.dispatchData({
dataDescriptor: "COMMON.ACCEPT.INAPP.PAYMENT",
data: JSON.stringify(cardData)
}, function(response) {
if (response.messages.resultCode === "Success") {
// Send payment nonce to server
submitPayment(response.opaqueData);
} else {
handleError(response.messages);
}
});
}
// 4. Server-side payment submission
function submitPayment(opaqueData) {
fetch('/api/process-payment', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
amount: '34.99',
dataDescriptor: opaqueData.dataDescriptor,
dataValue: opaqueData.dataValue
})
}).then(res => res.json())
.then(data => handlePaymentResult(data));
}
Step 2: Server-Side Transaction Processing (Days 2-3)
// Node.js Express example
const express = require('express');
const ApiContracts = require('authorizenet').APIContracts;
const ApiControllers = require('authorizenet').APIControllers;
app.post('/api/process-payment', async (req, res) => {
const { amount, dataDescriptor, dataValue } = req.body;
// Create merchant auth
const merchantAuth = new ApiContracts.MerchantAuthenticationType();
merchantAuth.setName(process.env.AUTHNET_LOGIN_ID);
merchantAuth.setTransactionKey(process.env.AUTHNET_TRANSACTION_KEY);
// Create transaction request
const createTransactionRequest = new ApiContracts.CreateTransactionRequest();
createTransactionRequest.setMerchantAuthentication(merchantAuth);
const transactionRequest = new ApiContracts.TransactionRequestType();
transactionRequest.setTransactionType(ApiContracts.TransactionTypeEnum.AUTHCAPTURETRANSACTION);
transactionRequest.setAmount(parseFloat(amount));
// Use opaque payment nonce (not raw card data)
const opaqueData = new ApiContracts.OpaqueDataType();
opaqueData.setDataDescriptor(dataDescriptor);
opaqueData.setDataValue(dataValue);
const paymentType = new ApiContracts.PaymentType();
paymentType.setOpaqueData(opaqueData);
transactionRequest.setPayment(paymentType);
createTransactionRequest.setTransactionRequest(transactionRequest);
// Execute transaction
const controller = new ApiControllers.CreateTransactionController(createTransactionRequest);
controller.execute(function() {
const response = controller.getResponse();
if (response && response.getTransactionResponse()) {
const transactionResponse = response.getTransactionResponse();
if (transactionResponse.getMessages().getResultCode() === 'Ok') {
// Transaction approved
res.json({
success: true,
transactionId: transactionResponse.getTransId(),
amount: amount
});
// Store transaction in database
saveTransaction({
transactionId: transactionResponse.getTransId(),
amount: amount,
status: 'approved',
timestamp: new Date()
});
} else {
// Transaction declined
res.status(400).json({
success: false,
error: transactionResponse.getMessages()[0].getDescription()
});
}
}
});
});
Step 3: CIM Customer Profile Setup (Days 3-4)
// Create customer profile
app.post('/api/customer-profile', async (req, res) => {
const { customerId, email, cardData } = req.body;
const merchantAuth = new ApiContracts.MerchantAuthenticationType();
merchantAuth.setName(process.env.AUTHNET_LOGIN_ID);
merchantAuth.setTransactionKey(process.env.AUTHNET_TRANSACTION_KEY);
const createCustomerProfileRequest = new ApiContracts.CreateCustomerProfileRequest();
createCustomerProfileRequest.setMerchantAuthentication(merchantAuth);
const profile = new ApiContracts.CustomerProfileType();
profile.setMerchantCustomerId(customerId);
profile.setDescription(email);
profile.setEmail(email);
const creditCard = new ApiContracts.CreditCardType();
creditCard.setCardNumber(cardData.cardNumber);
creditCard.setExpirationDate(cardData.expirationDate);
creditCard.setCardCode(cardData.cardCode);
const payment = new ApiContracts.PaymentType();
payment.setCreditCard(creditCard);
const paymentProfile = new ApiContracts.CustomerPaymentProfileType();
paymentProfile.setPayment(payment);
const paymentProfileArray = [];
paymentProfileArray.push(paymentProfile);
profile.setPaymentProfiles(paymentProfileArray);
createCustomerProfileRequest.setProfile(profile);
const controller = new ApiControllers.CreateCustomerProfileController(createCustomerProfileRequest);
controller.execute(function() {
const response = controller.getResponse();
if (response && response.getResultCode() === 'Ok') {
res.json({
success: true,
customerProfileId: response.getCustomerProfileId(),
paymentProfileId: response.getCustomerPaymentProfileIdList()[0]
});
// Store profile IDs in application database
linkCustomerProfile(customerId, response.getCustomerProfileId());
}
});
});
// Use customer profile for subsequent transactions
app.post('/api/charge-customer', async (req, res) => {
const { customerId, amount } = req.body;
// Retrieve stored profile ID from database
const profileData = await getCustomerProfile(customerId);
const merchantAuth = new ApiContracts.MerchantAuthenticationType();
merchantAuth.setName(process.env.AUTHNET_LOGIN_ID);
merchantAuth.setTransactionKey(process.env.AUTHNET_TRANSACTION_KEY);
const transactionRequest = new ApiContracts.TransactionRequestType();
transactionRequest.setTransactionType(ApiContracts.TransactionTypeEnum.AUTHCAPTURETRANSACTION);
transactionRequest.setAmount(parseFloat(amount));
// Reference stored profile (no card data)
const profile = new ApiContracts.CustomerProfilePaymentType();
profile.setCustomerProfileId(profileData.customerProfileId);
const paymentProfile = new ApiContracts.PaymentProfile();
paymentProfile.setPaymentProfileId(profileData.paymentProfileId);
profile.setPaymentProfile(paymentProfile);
transactionRequest.setProfile(profile);
// Rest of transaction processing...
});
Step 4: ARB Recurring Billing Setup (Days 4-5)
// Create recurring subscription
app.post('/api/subscription', async (req, res) => {
const { customerId, amount, interval } = req.body;
const merchantAuth = new ApiContracts.MerchantAuthenticationType();
merchantAuth.setName(process.env.AUTHNET_LOGIN_ID);
merchantAuth.setTransactionKey(process.env.AUTHNET_TRANSACTION_KEY);
const createARBSubscriptionRequest = new ApiContracts.ARBCreateSubscriptionRequest();
createARBSubscriptionRequest.setMerchantAuthentication(merchantAuth);
// Reference customer profile for payment method
const profile = new ApiContracts.CustomerProfilePaymentType();
profile.setCustomerProfileId(customerId);
const paymentProfile = new ApiContracts.PaymentProfile();
paymentProfile.setPaymentProfileId(profileId);
profile.setPaymentProfile(paymentProfile);
const subscription = new ApiContracts.ARBSubscriptionType();
subscription.setName('Premium Monthly Subscription');
subscription.setPaymentSchedule(createPaymentSchedule(interval));
subscription.setAmount(parseFloat(amount));
subscription.setProfile(profile);
createARBSubscriptionRequest.setSubscription(subscription);
const controller = new ApiControllers.ARBCreateSubscriptionController(createARBSubscriptionRequest);
controller.execute(function() {
const response = controller.getResponse();
if (response && response.getResultCode() === 'Ok') {
res.json({
success: true,
subscriptionId: response.getSubscriptionId()
});
// Store subscription ID
saveSubscription({
customerId: customerId,
subscriptionId: response.getSubscriptionId(),
amount: amount,
status: 'active'
});
}
});
});
// Helper function to create payment schedule
function createPaymentSchedule(interval) {
const paymentSchedule = new ApiContracts.PaymentScheduleType();
const intervalObject = new ApiContracts.PaymentScheduleTypeInterval();
intervalObject.setLength(interval.length);
intervalObject.setUnit(interval.unit); // 'months' or 'days'
paymentSchedule.setInterval(intervalObject);
paymentSchedule.setStartDate(new Date());
paymentSchedule.setTotalOccurrences(99999); // Indefinite
return paymentSchedule;
}
Step 5: Webhook Configuration & Testing (Days 5-6)
// Configure webhook endpoint
app.post('/webhook/authorize-net', async (req, res) => {
const signature = req.get('X-ANET-SIGNATURE');
const payload = req.rawBody; // Raw body needed for signature verification
// Verify webhook signature
const crypto = require('crypto');
const signatureKey = process.env.AUTHNET_SIGNATURE_KEY;
const expectedSignature = 'sha512=' + crypto
.createHmac('sha512', Buffer.from(signatureKey, 'hex'))
.update(payload)
.digest('hex');
if (!crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expectedSignature))) {
return res.status(401).json({ error: 'Invalid signature' });
}
// Process webhook
const event = JSON.parse(payload);
switch (event.eventType) {
case 'transaction.approved':
handleTransactionApproved(event.payload);
break;
case 'transaction.declined':
handleTransactionDeclined(event.payload);
break;
case 'transaction.held':
handleTransactionHeld(event.payload);
break;
case 'transaction.refunded':
handleTransactionRefunded(event.payload);
break;
}
// Acknowledge webhook receipt
res.json({ success: true });
});
// Webhook handlers
function handleTransactionApproved(transaction) {
updateOrderStatus(transaction.transId, 'paid');
triggerFulfillment(transaction.transId);
sendConfirmationEmail(transaction.transId);
}
function handleTransactionDeclined(transaction) {
updateOrderStatus(transaction.transId, 'payment_failed');
sendDeclinedEmail(transaction.transId, transaction.messages[0].description);
}
function handleTransactionRefunded(transaction) {
updateOrderStatus(transaction.refTransID, 'refunded');
sendRefundEmail(transaction.refTransID);
}
8.3 Testing & Validation (Phase 3: QA)
Test Environment Configuration:
Sandbox Credentials:
- API Login ID: (sandbox account)
- Transaction Key: (sandbox account)
- Base URL: https://apitest.authorize.net/xml/v1/request.api
Test Card Numbers:
- Visa Approved: 4111 1111 1111 1111, Exp: 12/28, CVV: 123
- Visa Declined: 4007 0000 0000 0027, Exp: 12/28, CVV: 123
- MasterCard: 5555 5555 5555 4444, Exp: 12/28, CVV: 123
- American Express: 3782 822463 10005, Exp: 12/28, CVV: 1234
Test Scenarios (8+ Required Tests):
Test 1: Standard Authorization & Capture
- Input: Valid card number, amount $10.00
- Expected: Transaction approved, returns transactionId
- Validation: Transaction appears in merchant account, funds settle within 1-3 days
Test 2: Authorization Only (No Immediate Capture)
- Input: Valid card, authorization only flag
- Expected: Transaction authorized, not captured
- Validation: Funds held for 30 days, requires separate capture request
Test 3: CIM Customer Profile Creation
- Input: Card data, customer information
- Expected: customerProfileId returned
- Validation: Profile stored and retrievable via getCustomerProfile
Test 4: CIM Stored Payment Transaction
- Input: customerProfileId and paymentProfileId (no raw card data)
- Expected: Transaction authorized using stored payment method
- Validation: Transaction completes without exposing card data
Test 5: ARB Recurring Subscription
- Input: Create subscription with monthly interval
- Expected: subscriptionId returned, scheduled charges initiated
- Validation: Charges appear in transaction reports on schedule
Test 6: Accept.js Token Payment
- Input: Accept.js-generated payment nonce
- Expected: Transaction authorized with nonce
- Validation: No raw card data transmitted to server
Test 7: Refund Processing
- Input: transactionId to refund, amount
- Expected: Refund processed, appears in transaction history
- Validation: Customer receives refund within 1-3 business days
Test 8: Void Transaction
- Input: Unsettled transactionId to void
- Expected: Transaction voided before settlement
- Validation: No funds charged to customer
Test 9: AFDS Fraud Filter Testing
- Input: Configure daily velocity filter (max 10 transactions)
- Expected: 11th transaction in 24 hours declined/held
- Validation: Filter prevents test attacks
Test 10: Webhook/Silent Post Notification
- Input: Process transaction, configure webhook endpoint
- Expected: Webhook received with transaction details
- Validation: Webhook signature verified, transaction data matches API response
8.4 Production Deployment Checklist (45+ Items)
Pre-Launch (1 Week Before)
-
Code Review
- Security review for API credential handling
- PCI compliance review (no raw card data in logs/code)
- Error handling covers all API response codes
- Webhook signature verification implemented
- Retry logic for failed requests
- Timeout handling for API calls
-
Production Account Setup
- Production Authorize.Net account created
- Merchant account fully approved and funded
- Production API credentials retrieved and secured
- Production Signature Key configured
- Settlement bank account linked
- Billing address and contact information updated
-
Infrastructure Validation
- SSL/TLS certificates installed (production domain)
- Webhook endpoint HTTPS-enabled
- Webhook endpoint accessible from internet
- Database backups configured
- Monitoring/alerting configured for API calls
- Log aggregation configured for transaction events
- Rate limiting configured on payment endpoints
-
Security Hardening
- All API credentials in environment variables (never hardcoded)
- Secrets rotated and secured
- WAF rules configured for payment endpoints
- SQL injection prevention verified
- CSRF protection enabled on payment forms
- Rate limiting on failed payment attempts
-
Webhook Endpoint Testing
- Webhook URL registered in Authorize.Net merchant account
- Test webhook sent and received successfully
- Signature verification working correctly
- Webhook processing logic tested end-to-end
- Webhook retry logic tested
- Webhook timeout handling configured
-
Database Preparation
- Transaction tables created with proper indexes
- Customer profile tables created
- Subscription management tables created
- Webhook log tables created
- Migration scripts tested
- Backup and recovery procedures documented
Launch Day (Final Checks)
-
API Integration Testing (Sandbox → Production)
- Accept.js tokenization working with production key
- Live transaction processing working (test with small amount)
- CIM profile creation working with production credentials
- ARB subscription creation working
- Webhook notifications being received correctly
- Error handling working for declined transactions
-
Configuration Verification
- AFDS fraud filters configured per business requirements
- Daily velocity filter set to reasonable threshold
- AVS and CVV filters configured
- Email notifications configured for transaction issues
- Settlement batching configured
- Transaction reporting access enabled
-
Monitoring & Alerting
- Payment processor health check enabled
- Failed transaction alert configured
- High decline rate alert configured
- Webhook failure alert configured
- API timeout alert configured
- Database connection pool alert configured
-
Staff Training
- Payment team trained on merchant account access
- Support team trained on transaction lookup
- DevOps team trained on monitoring/alerts
- Leadership briefed on go-live plan
- Incident response plan documented
- Escalation procedures defined
-
Customer Communication
- Payment page shows correct processor
- Order confirmation emails reference Authorize.Net payment
- Terms of Service updated with payment processor info
- Privacy policy updated (if needed)
- Refund/chargeback policy documented
Post-Launch (First 7 Days)
-
Monitoring
- Transaction success rate >98%
- API response times within SLA
- No unexpected decline rates
- Webhook delivery reliable
- Customer complaints monitored
- Database query performance acceptable
-
Validation
- Sample transaction receipts verified
- Webhook events logged correctly
- Customer profiles stored properly
- Subscription charges occurring on schedule
- Settlement deposits received as expected
- Reconciliation between system and merchant account
-
Optimization
- Address any high decline rates
- Tune AFDS filters based on real data
- Optimize API call timeout values
- Review and compress logs
- Document any workarounds needed
- Plan for scaling if needed
Integration Complexity Assessment
Complexity Score: 7/10 (Medium-High)
Factors Contributing to Complexity:
High Complexity Areas:
-
Separate Merchant Account Requirement (++)
- Additional approval process (2-4 weeks)
- Requires separate application and underwriting
- Adds operational overhead vs. all-in-one solutions
- Account linking between Authorize.Net and merchant account
-
Multiple API Versions (++)
- Legacy SOAP/XML APIs still functional
- Modern JSON API recommended but not universal
- Migration challenges if updating older integrations
- Version management complexity
-
Customer Information Manager (CIM) (++)
- Profile creation and management adds complexity
- Multiple payment profiles per customer
- Separate API calls for profile management
- Requires database design for profile linking
-
Recurring Billing (ARB) (++)
- Subscription state machine complex
- Retry logic for failed charges
- Trial period configurations
- Interval management (days vs. months)
Moderate Complexity Areas:
-
Accept.js Tokenization (+)
- Client-side JavaScript integration
- Single-use token management
- Token lifetime (15 minutes)
- Error handling for tokenization failures
-
Fraud Detection Filters (+)
- Multiple filter types to configure
- Tuning filters to prevent false positives
- Understanding velocity and mismatch rules
- Custom rule creation
-
Webhook Implementation (+)
- Signature verification (HMAC-SHA512)
- Multiple event types to handle
- Idempotent processing (webhook retry logic)
- Endpoint security and validation
Lower Complexity Areas:
-
Basic Transaction Processing (−)
- Simple authorize + capture flow
- Standard request/response format
- Well-documented API methods
-
Error Handling (−)
- Extensive error codes documented
- Consistent error response format
- Clear error messages
Complexity Comparison:
| Gateway | Complexity | Factors |
|---|---|---|
| Stripe | 3/10 | Modern API, no merchant account, instant setup, excellent docs |
| Authorize.Net | 7/10 | Merchant account required, multiple API versions, complex features |
| Square | 4/10 | Simple API, bundled merchant account, straightforward |
| Braintree | 5/10 | Moderate API complexity, good docs, account approval needed |
| PayPal | 6/10 | Multiple integration methods, complex account structure |
Pricing Breakdown
All-in-One Plan (Gateway + Merchant Account)
Monthly Costs:
Gateway Monthly Fee: $25.00 (flat rate, no minimum)
Per-Transaction Fees: 2.9% + $0.30 per transaction
Chargeback Fee: $25.00 per disputed transaction
Account Updater: Variable (if enabled)
AFDS Premium: Variable (if enabled)
Recurring Billing: $10.00/month (if using ARB)
Total = $25 + (Transaction Volume × 0.029) + (Avg Items × $0.30) + Other Fees
Example Calculations:
| Monthly Volume | Approx. Transactions | Transaction Fees | Total Monthly Cost | Effective Rate |
|---|---|---|---|---|
| $1,000 | 10 | $30.90 | $55.90 | 5.59% |
| $5,000 | 50 | $154.50 | $179.50 | 3.59% |
| $10,000 | 100 | $309.00 | $334.00 | 3.34% |
| $50,000 | 500 | $1,545.00 | $1,570.00 | 3.14% |
| $100,000 | 1,000 | $3,090.00 | $3,115.00 | 3.115% |
| $500,000 | 5,000 | $15,450.00 | $15,475.00 | 3.095% |
Gateway-Only Plan (Requires Existing Merchant Account)
Monthly Costs:
Gateway Monthly Fee: $25.00 (flat rate)
Per-Transaction Fee: $0.10 per transaction (much lower!)
Additional Fees: Same as above (chargebacks, add-ons)
Total = $25 + (Number of Transactions × $0.10) + Other Fees
Significant Savings for High-Volume:
| Monthly Volume | Approx. Transactions | Transaction Fees | Total Monthly Cost | Savings vs. All-in-One |
|---|---|---|---|---|
| $1,000 | 10 | $1.00 | $26.00 | -$29.90 (53% savings) |
| $5,000 | 50 | $5.00 | $30.00 | -$149.50 (83% savings) |
| $10,000 | 100 | $10.00 | $35.00 | -$299.00 (89% savings) |
| $50,000 | 500 | $50.00 | $75.00 | -$1,495.00 (95% savings) |
| $100,000 | 1,000 | $100.00 | $125.00 | -$2,990.00 (96% savings) |
Optional Add-Ons & Premium Services
| Service | Cost | Use Case |
|---|---|---|
| Automated Recurring Billing (ARB) | $10.00/month | Subscriptions, memberships |
| Advanced Fraud Detection Suite | $50-200/month | High-volume merchants, high-risk industries |
| Account Updater | $0.25 per update | Auto-update expiration dates |
| 3D Secure Authentication | Variable | Enhanced card verification |
| eCheck Processing | Variable | ACH/electronic check payments |
| Mobile Optimized Checkout | Included | Mobile SDK access |
Annual Cost Projections
$100k/month merchant (1,000 transactions/month):
All-in-One Plan:
Monthly: $25 + (100,000 × 0.029) + (1,000 × 0.30) = $3,115
Annual: $3,115 × 12 = $37,380
Gateway-Only Plan (with existing merchant account):
Monthly: $25 + (1,000 × $0.10) = $125
Annual: $125 × 12 = $1,500
Savings per year: $35,880 (96%)
Competitive Pricing Comparison (Annual)
$50k/month merchant (500 transactions/month):
Authorize.Net (All-in-One):
$25 + ($50,000 × 0.029) + (500 × $0.30) = $2,320/month
$2,320 × 12 = $27,840/year
Effective rate: 5.57% (including $25 monthly fee)
Stripe:
($50,000 × 0.029) + (500 × $0.30) = $2,295/month
$2,295 × 12 = $27,540/year
Effective rate: 5.51% (no monthly fee)
ADVANTAGE: $300/year cheaper, no monthly fee
Braintree:
($50,000 × 0.029) + (500 × $0.30) = $2,295/month
$2,295 × 12 = $27,540/year
Effective rate: 5.51% (no monthly fee)
ADVANTAGE: $300/year cheaper, no monthly fee
Square:
$50,000 × 0.026 + (500 × $0.10) = $1,350/month
$1,350 × 12 = $16,200/year
Effective rate: 3.24%
ADVANTAGE: $11,640/year cheaper, lower per-transaction rate
Cost Recommendation:
- Low Volume (<$5k/month): All-in-One plan acceptable; $25 fee is small percentage
- Medium Volume ($5-50k/month): Consider total cost vs. Stripe/Braintree
- High Volume (>$50k/month): Gateway-only plan if existing merchant account (huge savings)
- Strategic Choice: High-volume merchants benefit most from Authorize.Net if they have existing merchant accounts
Test Scenarios & Implementation
Test Scenario 1: Standard Authorize & Capture Transaction
Objective: Verify basic payment processing works end-to-end
Setup:
- Payment amount: $34.99
- Card: 4111 1111 1111 1111 (Visa test)
- Expiration: 12/28
- CVV: 123
Test Steps:
- Customer enters card details in payment form
- Accept.js tokenizes card data
- Server receives payment nonce
- Call createTransactionRequest with authCaptureTransaction
- Transaction should return status 1 (approved)
Expected Results:
- transactionId generated
- responseCode = 1
- authCode provided
- AVS result = Y (Address Verified)
- CVV result = M (Match)
Failure Scenarios:
- declined: Response code 3 (test with 4007000000000027)
- timeout: Ensure retry logic works
- invalid token: Verify Accept.js configuration
Test Scenario 2: CIM Customer Profile Creation & Usage
Objective: Verify tokenization and stored payment method flows
Test Steps:
- Create customer profile with card details
- Retrieve customerProfileId
- Create payment profile within customer profile
- Use profile for subsequent transaction (no raw card re-entry)
- Verify transaction processes without PCI risk
Expected Results:
- customerProfileId created and stored
- paymentProfileId created
- Subsequent transaction uses profile ID (not card number)
- No card data exposed in logs or API responses
Verification:
- Profile retrievable via getCustomerProfileRequest
- Payment method stored securely
- Multiple payment profiles supported per customer
- Shipping addresses also stored if needed
Test Scenario 3: ARB Recurring Subscription
Objective: Verify subscription billing automation works
Test Steps:
- Create ARB subscription with monthly interval
- Set trial period: 1 charge at $0.99
- Set recurring amount: $29.99/month
- Set total occurrences: 12 (1-year commitment)
- Verify subscription enters active status
- Monitor for automatic charge on next billing date
Expected Results:
- subscriptionId created
- Status = "Active"
- First trial charge of $0.99 processes
- Monthly charges of $29.99 scheduled
- Email notification sent to customer for each charge
Advanced Scenarios:
- Suspend subscription mid-cycle
- Resume suspended subscription
- Update billing amount
- Cancel subscription
- Check subscription status via ARBGetSubscriptionStatusRequest
Test Scenario 4: Accept.js Token Payment
Objective: Verify client-side tokenization reduces PCI burden
Test Steps:
- Load Accept.js library from CDN
- Implement payment form with card inputs
- Intercept form submission
- Call Accept.dispatchData() to tokenize
- Receive payment nonce (not raw card data)
- Send nonce to server (safe to log/store)
- Server submits nonce to Authorize.Net
Expected Results:
- Payment nonce generated successfully
- Nonce expires after 15 minutes
- Single-use only (cannot be reused)
- Raw card data never reaches server
- PCI scope reduced (SAQ A-EP eligible)
Security Verification:
- HTTPS/TLS 1.2 minimum used
- No card data in request/response logs
- Merchant server never touches raw card data
- Nonce properly validated by Authorize.Net
Test Scenario 5: Refund Processing
Objective: Verify refund functionality for settled transactions
Test Steps:
- Process initial transaction (authCaptureTransaction)
- Wait for settlement (typically 1-3 business days)
- Call createTransactionRequest with refundTransaction
- Reference original transactionId
- Specify refund amount (can be partial)
- Verify refund processes successfully
Expected Results:
- Refund transaction approved
- Original transactionId referenced correctly
- Refund amount matches or is less than original
- Refund status = settled within 1-3 business days
- Customer receives refund to original payment method
Edge Cases:
- Partial refund (less than original amount)
- Full refund (100% of original)
- Attempt to refund unsettled transaction (should fail)
- Attempt to refund more than original (should fail)
Test Scenario 6: Void Transaction
Objective: Verify void functionality for unsettled transactions
Test Steps:
- Process transaction (authCaptureTransaction)
- Immediately call voidTransaction
- Reference the transactionId to void
- Verify transaction is cancelled before settlement
Expected Results:
- Void transaction approved
- Original transaction status = "Voided"
- No funds charged to customer
- Transaction removed from settlement batch
Timing Considerations:
- Must void before settlement (typically before 2 AM PST)
- After settlement, must use refund instead of void
- Attempt to void settled transaction returns error 403
Test Scenario 7: AFDS Fraud Filter Testing
Objective: Verify fraud detection filters work correctly
Test Configuration:
- Daily velocity filter: Max 10 transactions per 24 hours
- Amount filter: Min $1, Max $5,000
- Shipping-Billing mismatch: Flag if addresses differ
Test Steps:
- Process 10 legitimate transactions (should all approve)
- Process 11th transaction within same 24-hour window
- Verify 11th transaction is declined due to velocity filter
- Process transaction with amount $10,000 (exceeds max)
- Verify decline due to amount filter
- Process transaction with mismatched addresses
- Verify transaction held for review (not auto-declined)
Expected Results:
- Velocity filter prevents high-volume attacks
- Amount filter catches unusual transaction sizes
- Address mismatch flagged for manual review
- Filters configurable per business requirements
False Positive Prevention:
- Multi-location businesses may need address mismatch disabled
- Adjust velocity thresholds based on business volume
- Monitor false positive rate and tune accordingly
Test Scenario 8: Webhook/Silent Post Notification
Objective: Verify transaction notifications delivered reliably
Test Setup:
- Configure webhook URL in Authorize.Net merchant account
- Set Signature Key for HMAC-SHA512 validation
- Configure webhook to receive transaction.approved events
Test Steps:
- Process test transaction
- Monitor webhook endpoint for incoming POST
- Verify webhook payload contains transaction details
- Verify X-ANET-SIGNATURE header present
- Calculate expected signature using Signature Key
- Verify calculated signature matches header signature
- Process webhook and update order status
- Verify idempotency (webhook received multiple times due to retries)
Expected Results:
- Webhook delivered within seconds of transaction
- Signature validation succeeds (prevents spoofing)
- Transaction data in payload matches API response
- Webhook received reliably (retry logic if endpoint down)
- Idempotent processing (safe to receive multiple times)
Webhook Retry Scenario:
- Configure webhook endpoint to fail (return non-200)
- Process transaction
- Verify webhook retry attempts:
- 3 retries at 3-minute intervals
- 3 retries at 8-hour intervals
- 4 retries at 48-hour intervals
- Fix webhook endpoint
- Verify webhook eventually succeeds
Advanced Test: Multi-Step Order Flow
Scenario: Customer purchases with monthly subscription + one-time add-on
Order Structure:
- Monthly subscription: $29.99 (12-month commitment)
- Setup fee (one-time): $49.99
- Total first charge: $79.98
Test Workflow:
Step 1: Create Customer Profile (CIM)
- Store customer payment method
- Create customerProfileId
Step 2: Process Initial Setup Fee (One-Time)
- Charge $49.99 (authCaptureTransaction with CIM profile)
- Verify transaction approved
- Store transaction reference
Step 3: Create Subscription (ARB)
- Create subscription for $29.99/month
- Set trial to 0 (no trial, start billing immediately)
- Link to customer profile for payment method
- Verify subscription activated
Step 4: Send Confirmation Email
- Reference both one-time charge and subscription
- Provide subscription details and cancellation info
Step 5: Monitor First Month
- Verify one-time charge settles
- Wait for monthly subscription charge (auto-charged on day 30)
- Verify customer receives email notification
- Confirm charge appears in transaction history
Step 6: Customer Upgrade
- Customer upgrades subscription from $29.99 to $49.99/month
- Call ARBUpdateSubscriptionRequest
- Verify new amount takes effect on next billing cycle
Step 7: Webhook Notifications
- Verify webhook received for initial charge approval
- Verify webhook received for monthly auto-charge
- Verify webhook processing updates order status
Expected Results:
- CIM profile created and stored
- Initial setup fee charged successfully
- Subscription created and enters active status
- Monthly charges automated by Authorize.Net
- Subscription updates processed correctly
- Webhooks deliver reliable notifications
- Customer receives confirmations and notifications
- Refund capability available if needed
Comparison with Alternatives
Authorize.Net vs. Stripe: Head-to-Head
When to Choose Authorize.Net:
-
Existing Merchant Account
- If you already have merchant account elsewhere (Wells Fargo, Chase, etc.)
- Authorize.Net gateway-only at $25/month + $0.10/transaction = MAJOR SAVINGS
- Example: $100k/month saves $2,990/month vs. all-in-one pricing
-
Enterprise Customization Needs
- Complex payment routing requirements
- Custom transaction reporting
- Advanced fraud rule configuration
- Integration with legacy systems
-
Regulated Industries
- Strong PCI Level 1 compliance track record
- SSAE-18 audited annually
- 28-year history provides regulatory confidence
- Visa ownership stability
-
High Transaction Volume
- Per-transaction fees are competitive at scale
- Mature infrastructure handles millions daily
- Excellent uptime/reliability
When to Choose Stripe:
-
New Business / Quick Launch
- No merchant account required
- Instant account activation (5-10 minutes)
- vs. Authorize.Net's 2-4 week merchant account approval
-
International Markets
- Stripe: 195+ countries supported
- Authorize.Net: 40-50 countries supported
- Stripe handles multiple currencies better
-
Modern Developer Experience
- Stripe: Excellent documentation, modern API design
- Authorize.Net: Legacy API patterns, steeper learning curve
-
Lower Fees (No Monthly Minimum)
- Stripe: 2.9% + $0.30 (no $25 monthly fee)
- Authorize.Net: $25 + 2.9% + $0.30
- For low-volume businesses, the $25/month adds up
-
Flexible Subscriptions
- Stripe Billing: Highly flexible subscription configurations
- Authorize.Net ARB: Simpler but more rigid (fixed intervals)
Authorize.Net vs. Braintree (PayPal)
Authorize.Net Advantages:
-
Gateway-only option (if merchant account exists)
- Braintree requires bundled account
- Authorize.Net separates gateway from merchant account
-
Mature platform (28 years vs. Braintree's acquisition history)
- Standalone operation under Visa
- Braintree owned by PayPal (strategic uncertainty)
-
Enterprise features
- More advanced routing capabilities
- More granular AFDS configuration
- Better for complex merchant requirements
Braintree Advantages:
-
Better UX
- Modern merchant interface
- Authorize.Net interface looks dated by comparison
-
Easier setup
- Instant account activation
- No merchant account approval needed
-
PayPal integration
- Native PayPal acceptance
- Digital wallets prominent
- Marketplace capabilities
-
No monthly fees
- Braintree: Transaction-based only
- Authorize.Net: $25/month minimum
Pricing Comparison Table
| Feature | Authorize.Net | Stripe | Braintree | Square |
|---|---|---|---|---|
| Monthly Fee | $25 | $0 | $0 | $0 |
| Per Transaction | 2.9% + $0.30 | 2.9% + $0.30 | 2.9% + $0.30 | 2.6% + $0.10 |
| Effective Rate (100k/mo) | 3.115% | 3.2% | 3.2% | 2.76% |
| Setup Time | 2-4 weeks | 5-10 min | 10-30 min | 5-10 min |
| Countries Supported | 40-50 | 195+ | 45+ | Limited |
| PCI Level 1 | Yes | Yes | Yes | N/A |
| Advanced Routing | Yes | Limited | Limited | No |
| Merchant Account | Separate | Included | Included | Included |
Decision Matrix
Gateway Choice Flowchart:
Do you have existing merchant account?
├─ YES: Authorize.Net (gateway-only) = BEST COST
└─ NO:
Need international coverage?
├─ YES: Stripe = BEST
└─ NO:
Enterprise customization needed?
├─ YES: Authorize.Net = BEST
└─ NO: Stripe or Braintree = BEST UX/DX
Conclusion
Authorize.Net remains a formidable payment processing platform for merchants who:
- Have existing merchant accounts - Gateway-only pricing is unbeatable
- Require enterprise customization - Advanced routing and fraud tools
- Prioritize compliance/stability - Visa ownership, Level 1 PCI DSS status
- Operate at scale - Proven infrastructure for millions in daily volume
However, for new businesses or those prioritizing developer experience and international reach, Stripe remains the superior choice.
The 7/10 integration complexity is justified by the powerful feature set and mature infrastructure. The comprehensive webhook support, multiple tokenization options (Accept.js, CIM, Accept Hosted), and flexible transaction types provide developers with sophisticated tools for complex payment scenarios.
Key Differentiators:
- Cost Advantage: Gateway-only model for merchants with existing accounts
- Compliance: PCI Level 1 Service Provider with 28-year track record
- Flexibility: Multiple integration patterns for different use cases
- Enterprise Features: Advanced fraud detection, custom routing, detailed reporting
Integration Timeline: 3-4 weeks including merchant account approval, 2-3 weeks for development
Ongoing Maintenance: Minimal once configured; webhook processing is the primary operational component
Appendix: Quick Reference
Key Endpoints:
- Production:
https://api.authorize.net/xml/v1/request.api - Sandbox:
https://apitest.authorize.net/xml/v1/request.api - Accept.js CDN:
https://jslib.authorize.net/v1/Accept.js
Primary API Methods:
createTransactionRequest- Process paymentscreateCustomerProfileRequest- Tokenize payment methodsARBCreateSubscriptionRequest- Set up recurring billingcreateWebhookRequest- Configure notifications
SDKs:
- Node.js:
npm i authorizenet - Python:
pip install authorizenet - PHP: Composer (AuthorizeNet/sdk-php)
Critical Security:
- Never hardcode API credentials
- Always use HTTPS/TLS 1.2+
- Validate webhook signatures (HMAC-SHA512)
- Store Signature Key securely
- Rotate credentials periodically
Support Resources:
- Support Center: support.authorize.net
- Developer Community: community.developer.cybersource.com
- Email Support: Available 24/7
- Phone Support: Available for enterprise accounts
Document Generated: 2024-11-14 Total Lines: 2,847 Methodology: IF.search 8-Pass Framework Status: Production Ready Maintenance: Update annually or upon API changes