Note: CardPointe is owned by Fiserv, but is a different product than Fiserv Commerce Hub. We are using CardPointe Gateway, not Commerce Hub.
Environment: UAT (User Acceptance Testing)
Host URL: https://fts-uat.cardconnect.com
Status: ✅ Active and working
CARDPOINTE_API_URL=https://fts-uat.cardconnect.com
CARDPOINTE_MERCHANT_ID=490000000069
CARDPOINTE_API_USERNAME=testing
CARDPOINTE_API_PASSWORD=testing123
Iframe URL (UAT): https://fts-uat.cardconnect.com/itoke/ajax-tokenizer.html
Parameters:
useexpiry=true - Capture expiration dateusecvv=true - Capture CVVtokenizewheninactive=true - Auto-tokenizeinactivityto=2000 - Tokenize after 2 seconds of inactivityenhancedresponse=true - Return additional dataformatinput=true - Format card number with spacesReturns via postMessage:
token - Tokenized card number (e.g., 9418594164541111)expiry - Expiration in variable format (MMYY, MMYYY, or MMYYYY)Standard test cards for CardPointe UAT environment:
| Card Brand | Card Number | Expected Result |
|---|---|---|
| Visa | 4111111111111111 | Approval |
| Visa | 4387751111111012 | Approval (for testing association codes) |
| Amex | 371449635398431 | Approval |
| Mastercard | 5442981111111064 | Approval |
CVV: Any 3 digits for Visa/MC (4 for Amex, e.g., 1234) Expiry: Any future date (MM/YY format, e.g., 12/25) ZIP: Any 5 digits
CardPointe UAT supports amount-driven responses for testing specific scenarios:
| Amount | Response |
|---|---|
| $9.32 | Approval (respcode: 000) |
| $1,100.35 | Decline - "Do not honor" (respcode: 100) |
How it works: Use amounts in the $1,000-$1,999 range where the last 3 digits (with leading 0 for 2-digit codes) specify the desired response code.
Example: $1,116.95 → respcode 116 ("Not sufficient funds")
POST /cardconnect/rest/auth
Authentication: Basic Auth (username:password)
Request:
{
"merchid": "490000000069",
"account": "9418594164541111",
"expiry": "1225",
"amount": "10.00",
"currency": "USD",
"orderid": "ORD123",
"capture": "Y",
"cof": "C",
"cofscheduled": "N"
}
Response:
{
"respstat": "A",
"retref": "279971160962",
"amount": "10.00",
"respcode": "000",
"resptext": "Approval",
"token": "9418594164541111",
"authcode": "PPS123"
}
POST /cardconnect/rest/capture
POST /cardconnect/rest/refund
POST /cardconnect/rest/void
CardPointe supports Visa/Mastercard Stored Credential Framework:
cof (Card-on-File):
C - Customer-Initiated Transaction (customer is present)M - Merchant-Initiated Transaction (automated/recurring)cofscheduled:
Y - Scheduled/recurring paymentN - One-time paymentExamples:
# Customer making a one-time payment
{ cof: "C", cofscheduled: "N" }
# Customer enrolling in subscription
{ cof: "C", cofscheduled: "Y" }
# Automated subscription charge
{ cof: "M", cofscheduled: "Y" }
# Merchant-initiated split shipment charge
{ cof: "M", cofscheduled: "N" }
Status: 🚧 Awaiting production credentials from Fiserv
Host URL: https://fts.cardconnect.com (Production)
Before going live:
.env# CardPointe Production
CARDPOINTE_API_URL=https://fts.cardconnect.com
CARDPOINTE_MERCHANT_ID=<production_merchant_id>
CARDPOINTE_API_USERNAME=<production_username>
CARDPOINTE_API_PASSWORD=<production_password>
# Payment Processor Selection
DEFAULT_PAYMENT_PROCESSOR=fiserv
// Update in app/views/app/quotes/payment.html.erb
iframe.src = 'https://fts.cardconnect.com/itoke/ajax-tokenizer.html'
Status: ✅ COMPLETED (2025-10-06)
All required validation scenarios tested and retrefs generated:
| Scenario | Amount | Card | Retref | Status |
|---|---|---|---|---|
| Visa Approval | $9.32 | 4111111111111111 | 279319061767 | ✅ Approved |
| Visa Decline | $1,100.35 | 4111111111111111 | 279330061781 | ✅ Declined |
| Amex Approval | $9.32 | 371449635398431 | 279347061815 | ✅ Approved |
| Amex Decline | $1,100.35 | 371449635398431 | 279326161827 | ✅ Declined |
| Scenario | Amount | Retref | cof | cofscheduled |
|---|---|---|---|---|
| Token storage w/ transaction | $55.25 | 279389161947 | C | N |
| Token storage, no transaction | $0.00 | 279510761959 | C | N |
| Stored token usage | $100.25 | 279432061972 | C | N |
| Scenario | Amount | Retref | cof | cofscheduled |
|---|---|---|---|---|
| Token storage for recurring | $40.25 | 279461162062 | M | Y |
| Stored token recurring | $26.50 | 279583762074 | M | Y |
| Stored token one-time | $150.00 | 279499062084 | M | N |
⚠️ IMPORTANT:
.env (already in .gitignore)Base URL: https://fts-uat.cardconnect.com
/cardconnect/rest/auth - Authorization/cardconnect/rest/capture - Capture/cardconnect/rest/refund - Refund/cardconnect/rest/void - Void/cardconnect/rest/inquire - Transaction inquiry/cardconnect/rest/profile - Profile management (optional)All requests use Basic Auth:
auth = Base64.strict_encode64("#{username}:#{password}")
headers = {
"Authorization" => "Basic #{auth}",
"Content-Type" => "application/json"
}
CardPointe Documentation:
Fiserv Support:
Status Page:
| Feature | CardPointe Gateway | Fiserv Commerce Hub |
|---|---|---|
| Product | CardPointe | Commerce Hub |
| API Style | RESTful (simple) | RESTful (complex) |
| Authentication | Basic Auth | HMAC signatures |
| Tokenization | HIT iframe | Hosted Fields |
| Base URL | fts.cardconnect.com | fiservapis.com |
| Endpoints | /cardconnect/rest/* | /ch/payments/v1/* |
| PCI Compliance | SAQ-A | SAQ-A |
| Ownership | Fiserv | Fiserv |
Note: We originally planned to use Commerce Hub but implemented CardPointe Gateway instead due to simpler integration and equivalent PCI compliance.
Last Updated: 2025-10-06 Environment: UAT (Testing) Production Status: Pending Approval