Currency Codes in Payment Systems (Stripe, PayPal, Square)
How major payment processors use ISO 4217 currency codes. Covers Stripe, PayPal, Square, and Adyen conventions for minor units, supported currencies, and API patterns.
Detailed Explanation
Currency Handling in Payment Processors
Each payment processor has its own conventions for how currency codes and amounts are used in their APIs. Understanding these differences is essential when integrating payments.
Stripe
Stripe uses ISO 4217 codes in lowercase and amounts in the smallest currency unit:
const paymentIntent = await stripe.paymentIntents.create({
amount: 2999, // $29.99 in cents
currency: "usd", // lowercase ISO 4217
});
// For JPY (0-decimal currency):
const jpPayment = await stripe.paymentIntents.create({
amount: 3000, // ¥3,000 (not 30.00!)
currency: "jpy",
});
Stripe supports 135+ currencies. Zero-decimal currencies are listed in their docs and require integer amounts without multiplication.
PayPal
PayPal uses uppercase ISO 4217 codes and amounts as decimal strings:
{
"intent": "CAPTURE",
"purchase_units": [{
"amount": {
"currency_code": "USD",
"value": "29.99"
}
}]
}
For zero-decimal currencies like JPY, PayPal still uses string format but without decimals: "value": "3000".
Square
Square uses ISO 4217 codes and amounts in the smallest currency unit (similar to Stripe):
{
"amount_money": {
"amount": 2999,
"currency": "USD"
}
}
Adyen
Adyen uses ISO 4217 codes and minor units but calls the amount field value:
{
"amount": {
"value": 2999,
"currency": "USD"
}
}
Key Differences Summary
| Processor | Case | Amount Format | JPY ¥3000 |
|---|---|---|---|
| Stripe | lowercase | Minor units (int) | 3000 |
| PayPal | UPPERCASE | Major units (string) | "3000" |
| Square | UPPERCASE | Minor units (int) | 3000 |
| Adyen | UPPERCASE | Minor units (int) | 3000 |
Multi-Processor Tips
When your system integrates with multiple processors, create an abstraction layer that:
- Stores amounts internally in minor units (integers)
- Converts to each processor's format at the API boundary
- Validates currency support before sending requests
Use Case
Developers building multi-processor payment integrations or payment abstraction layers need to know the specific conventions each processor uses. A single codebase often integrates with Stripe for cards, PayPal for PayPal payments, and a local processor for region-specific methods. Understanding the format differences prevents over- or under-charging customers.