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.

Payment Systems

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:

  1. Stores amounts internally in minor units (integers)
  2. Converts to each processor's format at the API boundary
  3. 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.

Try It — Currency Code Reference

Open full tool