λ―Έκ΅ μμ₯μμ SaaS λΉμ¦λμ€λ₯Ό μ΄μνλ€ λ³΄λ©΄, κ²°μ λ¨κ³μμ μμμΉ λͺ»ν μ€λ₯λ‘ κ³ κ°μ μλ μν κ²½νμ νκ² λ©λλ€. νΉν Stripe κ°μ κ²°μ κ²μ΄νΈμ¨μ΄λ₯Ό μ²μ μ°λνλ νμ΄λΌλ©΄, μμ κ°μ§ μ€λ₯ μ½λ μμμ λΉνΉμ€λ¬μμ λλ μλ°μ μμ£ . νμ§λ§ μ΄ μ€λ₯ μ½λλ€μ μ νν μ΄ν΄νκ³ λμνλ κ²μ΄μΌλ§λ‘ κ²°μ μ±κ³΅λ₯ μ λμ΄κ³ κ³ κ° μ΄νμ λ§λ ν΅μ¬ μ΄μ μ λλ€.
μ μΈκ³ SaaS κΈ°μ λ€μ΄ κ°μ₯ μ λ’°νλ Stripeλ λ¨μν κ²°μ μ²λ¦¬λ₯Ό λμ΄, μμΈν μ€λ₯ μ½λμ λͺ νν μ²λ¦¬ κ°μ΄λλ₯Ό μ 곡ν©λλ€. μ΄λ² κΈμμλ λ―Έκ΅ νμ§μμ μ€μ λ‘ κ°μ₯ μμ£Ό λ§μ£ΌμΉλ Stripe μ€λ₯λ€κ³Ό, κ°κ°μ λν μ€μ ν΄κ²°λ²μ κΉμ΄ μκ² λ€λ€λ³΄κ² μ΅λλ€.
κ°μ₯ νν κ²°μ κ±°μ μ€λ₯, μ΄λ κ² λμνμΈμ
κ²°μ κ³Όμ μμ κ°μ₯ λΉλ²νκ² λ§μ£ΌμΉλ κ²μ΄ λ°λ‘ μΉ΄λ κ±°μ μ€λ₯μ
λλ€. card_declined, expired_card, card_error κ°μ μ½λλ€μ΄ μ¬κΈ° μνλλ°μ, μ΄λ€μ λλΆλΆ μΉ΄λ λ°κΈμ¬μμ κ±°λλ₯Ό μΉμΈνμ§ μμ λ λ°μν©λλ€.
μ€μν 건 λ¨μν “κ²°μ κ° μ€ν¨νμ΅λλ€”λΌκ³ λ§ μ리λ κ² μλλΌ, κ³ κ°μ΄ λ€μ μ‘μ μ μ·¨ν μ μλλ‘ λͺ νν μλ΄λ₯Ό μ 곡νλ κ²μ λλ€. μλ₯Ό λ€μ΄:
- card_declined: “μ£μ‘νμ§λ§ κ³ κ°λμ μΉ΄λκ° κ±°λΆλμμ΅λλ€. λ€λ₯Έ κ²°μ μλ¨μ μλν΄μ£ΌμΈμ”
- expired_card: “μΉ΄λ μ ν¨κΈ°κ°μ΄ λ§λ£λμμ΅λλ€. μ ν¨ν μΉ΄λλ‘ λ€μ μλν΄μ£ΌμΈμ”
- μ¬κΈ° μμ¬ μ°¨λ¨: “보μμμ μ΄μ λ‘ κ±°λκ° μ°¨λ¨λμμ΅λλ€. μΉ΄λμ¬μ λ¬Έμν΄μ£ΌμΈμ”
μ΄λ° μΈμ¬ν λ©μμ§ μ°¨λ³νλ κ³ κ° κ²½νμ ν¬κ² κ°μ νλ©°, 무μλ³΄λ€ κ³ κ°μ΄ “μ μ λλμ§” μ΄ν΄νκ³ μ€μ€λ‘ ν΄κ²°ν μ μκ² λ§λλλ€.
κ²°μ μλ μν μ€λ₯, νλ‘μΈμ€ νλ¦μ μ νν μ΄ν΄νκΈ°
payment_intent_unexpected_state μ€λ₯λ κ²°μ νλ‘μΈμ€μ μμλ₯Ό μ λλ‘ μ΄ν΄νμ§ λͺ»νμ λ μμ£Ό λ°μν©λλ€. μ΄λ―Έ μλ£λ κ²°μ λ₯Ό λ€μ μμ νλ € νκ±°λ, μ€ν¨ν κ²°μ λ₯Ό μ¬νμΈνλ € ν λ λνλμ£ .
ν΄κ²°μ±
μ λͺ
νν©λλ€. κ²°μ μλ(PaymentIntent)μ νμ¬ μνλ₯Ό λ¨Όμ νμΈνκ³ , κ·Έ μνμ λ§λ μμ
λ§ μννλ κ²μ
λλ€. WebHookμ ν΅ν΄ payment_intent.payment_failed μ΄λ²€νΈλ₯Ό μ€μκ°μΌλ‘ λͺ¨λν°λ§νλ©΄, μ€ν¨ν κ²°μ λ₯Ό μ¦μ κ°μ§νκ³ κ³ κ°μκ² μ μ ν μλ΄λ₯Ό λ³΄λΌ μ μμ΅λλ€.
μΈμ¦ μ€ν¨μ κΈμ΅ μ°κ²° κ³μ μ€λ₯ λμλ²
μ΅κ·Ό λ―Έκ΅ μμ₯μμλ μν κ³μ’ μ§μ μ°κ²°μ ν΅ν ACH κ²°μ κ° μ μ λ μ€μν΄μ§κ³ μμ΅λλ€. μ΄ κ³Όμ μμ payment_method_unactivatedλ authentication_error κ°μ μΈμ¦ μ€λ₯κ° λ°μν μ μμ΅λλ€.
νΉν μ£Όλͺ©ν μ μ 2025λ 9μ Stripeκ° μΆκ°ν μλ‘μ΄ κΈμ΅ μ°κ²° κ³μ μ€λ₯ μ½λμ λλ€:
- financial_connections_account_pending_account_numbers: μνμμ κ³μ λ²νΈλ₯Ό μμ§ μ€λΉ μ€μ λλ€. μ΄ κ²½μ° κ³ κ°μκ² “μ μ ν λ€μ μλν΄μ£ΌμΈμ”λΌκ³ μλ΄νμΈμ.
- financial_connections_account_unavailable_account_numbers: ν΄λΉ μν κ³μ’λ₯Ό μ¬μ©ν μ μμ΅λλ€. λ€λ₯Έ κ³μ’ μ°κ²°μ μμ²ν΄μΌ ν©λλ€.
μ΄λ° μΈλ°ν ꡬλΆμ κ³ κ° μ§μ λΉμ©μ νκΈ°μ μΌλ‘ μ€μ΄κ³ , ACH κ²°μ μ±κ³΅λ₯ μ λμ΄λ λ° μ§μ μ μΌλ‘ κΈ°μ¬ν©λλ€.
λΌμ°ν λ²νΈ μ€λ₯, ACH κ²°μ μ μν¬λ μ€κ±΄
routing_number_invalid μ€λ₯λ ACH κ²°μ μμ μμ£Ό λ°μνλ λ¬Έμ μ
λλ€. λ―Έκ΅μ μν λΌμ°ν
μμ€ν
μ νκ΅κ³Ό λ€λ₯΄κΈ° λλ¬Έμ, νμ§ κ²½νμ΄ μλ νμ μ΄ λΆλΆμμ λ§μ΄ λΉν©νκ³€ ν©λλ€.
Stripeλ ACH κ²°μ μ€ν¨μ¨μ μ€μ΄λ ꡬ체μ μΈ κ°μ΄λλ₯Ό μ 곡νλλ°μ, ν΅μ¬μ κ²°μ μ κ²μ¦ λ¨κ³λ₯Ό κ°ννλ κ²μ λλ€. “μν λΌμ°ν λ²νΈκ° μ¬λ°λ₯΄μ§ μμ΅λλ€. μν κ³μ’ νμΈ ν λ€μ μ λ ₯ν΄μ£ΌμΈμ”λΌλ λͺ νν λ©μμ§μ ν¨κ», κ°λ₯νλ€λ©΄ μ€μκ° λΌμ°ν λ²νΈ κ²μ¦ APIλ₯Ό νμ©νλ κ²μ΄ μ’μ΅λλ€.
μλ¬ νΈλ€λ§, μ λ¬Έκ°μ²λΌ ꡬ쑰ννκΈ°
Stripeλ λͺ νν μμΈ μ²λ¦¬ ν¨ν΄μ κΆμ₯ν©λλ€:
- CardError: μΉ΄λ κ΄λ ¨ μ€λ₯ – κ³ κ°μ΄ μ§μ ν΄κ²° κ°λ₯
- InvalidRequestError: μμ² λ°μ΄ν° μ€λ₯ – κ°λ°νμ΄ μμ νμ
- StripeError: κΈ°ν Stripe κ΄λ ¨ μ€λ₯ – μ¬μλ νμ
μ΄λ κ² μ€λ₯λ₯Ό λΆλ₯νλ©΄ κ³ κ°μκ² λ³΄μ¬μ€ λ©μμ§μ κ°λ°ν λ‘κ·Έλ₯Ό λͺ νν ꡬλΆν μ μμ΅λλ€. κ³ κ°μ μΉμ ν μλ΄λ₯Ό λ°κ³ , κ°λ°νμ κΈ°μ μ λν μΌμ ν΅ν΄ λΉ λ₯΄κ² λ¬Έμ λ₯Ό ν΄κ²°ν μ μμ£ .
WebHook λͺ¨λν°λ§μΌλ‘ μ€μκ° λμ μ²΄κ³ κ΅¬μΆ
κ²°μ μ€ν¨λ λ°μ μ¦μ κ°μ§λμ΄μΌ ν©λλ€. payment_intent.payment_failed μ΄λ²€νΈλ₯Ό WebHookμΌλ‘ μμ νλ©΄ μ¬λ¬ κ°μ§ μ λ΅μ λμμ΄ κ°λ₯ν©λλ€:
- μ¦μ κ³ κ°μκ² κ²°μ μ€ν¨ μλ¦Ό λ°μ‘
- μ€ν¨ μ¬μ μ λ°λΌ μλμΌλ‘ μ¬μλ κΆμ λ©μμ§ μ»€μ€ν°λ§μ΄μ§
- λ§μΌν νμ μ€ν¨ ν¨ν΄ λΆμμ ν΅ν 체ν¬μμ νλ‘μΈμ€ κ°μ
νΉν Stripe Health Alertλ₯Ό νμ©νλ©΄ 400, 409, 429 κ°μ μ€λ₯ μ½λ μ¦κ°λ₯Ό μ€μκ°μΌλ‘ κ°μ§ν μ μμ΅λλ€. Rate Limiting μ΄κ³Ό(429)λ API μμ² κ΅¬μ‘° λ¬Έμ λ₯Ό μ‘°κΈ°μ λ°κ²¬ν΄ μμ€ν μμ μ±μ μ§ν¬ μ μμ΅λλ€.
ν μ€νΈ νκ²½μμ λͺ¨λ μλλ¦¬μ€ μ¬μ κ²μ¦
μ€μ κ³ κ°μ΄ μ€λ₯λ₯Ό κ²½ννκΈ° μ μ, λͺ¨λ μλ리μ€λ₯Ό ν μ€νΈ νκ²½μμ κ²μ¦ν΄μΌ ν©λλ€. Stripe CLIλ₯Ό μ¬μ©νλ©΄ κ°λ¨ν©λλ€:
stripe trigger payment_intent.payment_failed
μ΄ λͺ λ Ήμ΄λ‘ λ‘컬 νκ²½μμ μ€μ μ€λ₯ λ©μμ§λ₯Ό νμΈνκ³ , κ³ κ°μκ² νμλ 문ꡬλ₯Ό 미리 μ κ²ν μ μμ΅λλ€. μλ²½ν μ€λΉλ κ³§ κ³ κ° μ λ’°λ‘ μ΄μ΄μ§λλ€.
μ¬μλ μ λ΅μΌλ‘ λ§€μΆ ν볡νκΈ°
Stripeμ μ€ν¨ κ²°μ 볡ꡬ κ°μ΄λμ λ°λ₯΄λ©΄, μΌμμ μ€λ₯(νμμμ, λ€νΈμν¬ μ§μ°)μ κ²½μ° μλ μ¬μλλ₯Ό ꡬννλ©΄ μλΉν λ§€μΆ μ¦κ° ν¨κ³Όκ° μμ΅λλ€.
λ€λ§ μ£Όμν μ μ΄ μμ΅λλ€. μ¦κ°μ μΈ μλ μ¬μλλ μ€νλ € κ±°μ μ€λ₯λ₯Ό λ릴 μ μμΌλ―λ‘, κ³ κ°μ΄ μΉ΄λμ¬μ νμΈν ν μλμΌλ‘ μ¬μλνλλ‘ μ λνλ κ²μ΄ λ ν¨κ³Όμ μ λλ€. νΉν κΈμ΅ μ€λ₯(λΌμ°ν λ²νΈ μ€λ₯ λ±)λ λ°μ΄ν° μμ ν μ¬μλκ° νμμ λλ€.
μ€λ¬΄ 체ν¬λ¦¬μ€νΈλ‘ μλ²½ λμ
κ°λ° λ¨κ³
- λͺ¨λ Stripe μ€λ₯ νμ μ λν try-catch ꡬ쑰 ꡬν
- WebHook μμ λ° λ‘κΉ μ€μ
- ν μ€νΈ μΉ΄λλ‘ κ° μ€λ₯ μλλ¦¬μ€ κ²μ¦
μ΄μ λ¨κ³
- μ€λ₯λ³ κ³ κ° λ©μμ§ λ¬Έκ΅¬ νμ€ν
- μ€ν¨μ¨ λͺ¨λν°λ§ λμ보λ ꡬμΆ
- μ£Όκ° μ€λ₯ λ‘κ·Έ λΆμ λ° UX κ°μ
λ§μΌν νμ©
- κ²°μ μ€ν¨ κ³ κ° λμ μ΄λ©μΌ μΊ νμΈ
- μ€λ₯ μ νλ³ μ¬κ΅¬λ§€ μ λ λ©μμ§ μλν
- κ³ κ° μ§μν κ΅μ‘ (μ€λ₯λ³ μ νν μλ΄ λ°©λ²)
λ―Έκ΅ μμ₯, νμ§ μ λ¬Έκ°μ ν¨κ»λΌλ©΄ λ λΉ λ¦ λλ€
Stripe μ€λ₯ μ½λλ₯Ό μλ²½νκ² μ΄ν΄νκ³ λμνλ κ²μ κΈ°μ μ κ³Όμ μΈ λμμ, λ―Έκ΅ κ³ κ°μ κ²°μ μ΅κ΄κ³Ό κΈμ΅ μμ€ν μ κΉμ΄ μ΄ν΄ν΄μΌ νλ νμ§ν μμ μ λλ€. νΉν ACH κ²°μ , λΌμ°ν λ²νΈ, κΈμ΅ μ°κ²° κ³μ κ°μ κ°λ μ νκ΅ μμ₯μμλ κ²½ννκΈ° μ΄λ €μ΄ μμμ΄μ£ .
20λ κ° λ―Έκ΅ νμ§μμ μλ§μ SaaS κΈ°μ μ κ²°μ μμ€ν μ΅μ νλ₯Ό μ§μν΄μ¨ μΊλ¦¬μμ΄μ΄(Calywire)λ λ¨μν κΈ°μ 컨μ€ν μ λμ΄, κ³ κ° κ²½ν κ°μ κ³Ό λ§€μΆ ν₯μκΉμ§ μ΄μ΄μ§λ ν΅ν© μ루μ μ μ 곡ν©λλ€. μ€λ₯ μ½λ νλνλμ λ΄κΈ΄ λΉμ¦λμ€ μΈμ¬μ΄νΈλ₯Ό λμΉμ§ μκ³ , μ¬λ¬λΆμ SaaSκ° λ―Έκ΅ μμ₯μμ μ±κ³΅μ μΌλ‘ μ리μ‘μ μ μλλ‘ ν¨κ»ν©λλ€.
κ²°μ λ κ³ κ° μ¬μ μ λ§μ§λ§ κ΄λ¬Έμ λλ€. μ΄ μκ°μ μμ±λκ° κ³§ λΉμ¦λμ€μ μ±ν¨λ₯Ό μ’μ°ν©λλ€. λ―Έκ΅ νμ§ μ¬μ μ κ°μ₯ μ μλ ννΈλμ ν¨κ»λΌλ©΄, κ·Έ κΈΈμ΄ ν¨μ¬ λ λͺ νν΄μ§ κ²μ λλ€.
