免費工具 · STRIPE 測試卡號
Stripe 測試卡號
最常用的 Stripe 測試卡號是 4242 4242 4242 4242:安全碼填任意三碼(American Express 是四碼)、有效期限填任何未來日期(例如 12/34),其他欄位隨便填。它只對 Stripe 的測試金鑰有效。下面的表格有 119 張測試卡,2026 年 9 月 26 日對過 Stripe 自己的測試文件,包含 Stripe 按國家列出的 64 張——台灣卡排在那一組的第一個。可以搜尋、點卡號複製,也能把整份表下載成 JSON 或 CSV 放進測試套件。每張會失敗的卡都附上錯誤碼、decline code 和它觸發的 webhook 事件:Stripe 把這三樣分在三個頁面,而且那些頁面沒有繁體中文版。
其他語言:English繁體中文日本語한국어EspañolFrançaisDeutschPortuguês (Brasil)
點任何卡號就能複製(不含空格)。沒有任何東西會送出去——表格和下載檔都在這個頁面裡產生。下載內容跟著篩選走,所以可以只匯出被拒的那幾張;下載檔一律是英文。
| 卡號 | 模擬情境 | 品牌 | PaymentMethod | 代碼與事件 |
|---|---|---|---|---|
| 付款成功(依卡片品牌) · 15 | ||||
| 付款成功 | Visa | pm_card_visa |
||
| 簽帳金融卡付款成功 | Visa (debit) | pm_card_visa_debit |
||
| 付款成功 | Mastercard | pm_card_mastercard |
||
| 2 開頭 BIN 的卡付款成功 | Mastercard (2-series) | |||
| 簽帳金融卡付款成功 | Mastercard (debit) | pm_card_mastercard_debit |
||
| 預付卡付款成功 | Mastercard (prepaid) | pm_card_mastercard_prepaid |
||
| 付款成功(15 碼卡號、4 碼安全碼) | American Express | pm_card_amex |
||
| 付款成功,第二組 Amex BIN | American Express | |||
| 付款成功 | Discover | pm_card_discover |
||
| 19 碼卡號付款成功 | UnionPay (19-digit) | |||
| 付款成功 | Diners Club | pm_card_diners |
||
| 14 碼卡號付款成功 | Diners Club (14-digit) | |||
| 付款成功 | JCB | pm_card_jcb |
||
| 付款成功 | UnionPay | pm_card_unionpay |
||
| 法國聯名卡(Cartes Bancaires)付款成功 | Cartes Bancaires / Visa | pm_card_visa_cartesBancaires |
||
| 被拒 · 10 | ||||
| 一般拒絕(原因不明) | Visa | pm_card_visa_chargeDeclined |
card_declined |
|
| 資金不足被拒 | Visa | pm_card_visa_chargeDeclinedInsufficientFunds |
card_declined |
|
| 遺失卡被拒 | Visa | pm_card_visa_chargeDeclinedLostCard |
card_declined |
|
| 被竊卡被拒 | Visa | pm_card_visa_chargeDeclinedStolenCard |
card_declined |
|
| 過期卡被拒 | Visa | pm_card_chargeDeclinedExpiredCard |
expired_card |
|
| 安全碼錯誤被拒(要送出安全碼,否則不檢查) | Visa | pm_card_chargeDeclinedIncorrectCvc |
incorrect_cvc |
|
| 處理錯誤被拒 | Visa | pm_card_chargeDeclinedProcessingError |
processing_error |
|
| 卡號錯誤——故意過不了 Luhn 檢查 | Visa | incorrect_number |
||
| 短時間嘗試次數過多被拒 | Visa | pm_card_visa_chargeDeclinedVelocityLimitExceeded |
card_declined |
|
| 可以綁定到 Customer,實際扣款時才失敗 | Visa | pm_card_chargeCustomerFail |
card_declined |
|
| Radar、詐欺與地址檢查 · 9 | ||||
| 最高風險——Radar 一律封鎖 | Visa | pm_card_radarBlock |
card_declined |
|
| 風險等級「highest」——依你的規則,Radar 可能封鎖 | Visa | pm_card_riskLevelHighest |
card_declined |
|
| 風險等級「elevated」——Radar 可能送進人工審查 | Visa | pm_card_riskLevelElevated |
||
| 詐欺爭議分數偏高 | Visa | pm_card_highFraudDisputeScore |
||
| 早期詐欺警示分數偏高 | Visa | pm_card_highEfwScore |
||
| 濫用免費試用——開啟該項控制時會被封鎖 | Visa | pm_card_freeTrialAbuseBlock |
card_declined |
|
| 安全碼檢查失敗(有送安全碼才檢查) | Visa | pm_card_cvcCheckFail |
card_declined |
|
| 郵遞區號檢查失敗(有送郵遞區號才檢查) | Visa | pm_card_avsZipFail |
card_declined |
|
| 郵遞區號與地址第一行的檢查都失敗 | Visa | pm_card_avsFail |
card_declined |
|
| 爭議與詐欺警示 · 8 | ||||
| 扣款成功,之後以詐欺為由提出爭議 | Visa | pm_card_createDispute |
||
| Discover 卡扣款成功,之後以詐欺為由提出爭議 | Discover | |||
| 扣款成功,之後以「未收到商品」提出爭議 | Visa | pm_card_createDisputeProductNotReceived |
||
| 扣款成功,之後收到詢問,而不是正式爭議 | Visa | pm_card_createDisputeInquiry |
||
| 扣款成功,之後收到早期詐欺警示 | Visa | pm_card_createIssuerFraudRecord |
||
| 扣款成功,之後被提出不只一次爭議 | Visa | pm_card_createMultipleDisputes |
||
| 符合 Visa Compelling Evidence 3.0 資格的爭議 | Visa | pm_card_createCe3EligibleDispute |
||
| 符合 Smart Disputes 資格的爭議 | Visa | pm_card_createAutoRepresentmentEligibleDispute |
||
| 退款與款項入帳時點 · 4 | ||||
| 退款先是 pending,之後才成功 | Visa | pm_card_pendingRefund |
||
| 退款看起來成功,之後才失敗 | Visa | pm_card_refundFail |
||
| 國內扣款直接進可用餘額 | Visa | pm_card_bypassPending |
||
| 跨國扣款直接進可用餘額 | Visa | pm_card_bypassPendingInternational |
||
| 3D 驗證(3D Secure) · 9 | ||||
| 必須 3D 驗證,驗證成功 | Visa (IE) | pm_card_threeDSecure2Required |
||
| 美國發行的卡必須 3D 驗證,驗證成功 | Visa (US) | |||
| 3D 驗證通過,付款仍然被拒 | Visa | pm_card_threeDSecureRequiredChargeDeclined |
card_declined |
|
| 3D 驗證的查詢本身出錯,付款被拒 | Visa | pm_card_threeDSecureRequiredProcessingError |
card_declined |
|
| 支援 3D 驗證,但預設規則不要求 | Visa | pm_card_threeDSecureOptional |
||
| 支援 3D 驗證,但嘗試驗證時發生處理錯誤 | Visa | pm_card_threeDSecureOptionalProcessingError |
card_declined |
|
| 卡片設定為日後使用之前,顧客不在場的扣款都要 3D 驗證 | Visa | pm_card_authenticationRequiredOnSetup |
||
| 不管卡片怎麼設定,每一筆都要 3D 驗證 | Visa | pm_card_authenticationRequired |
||
| 已設定為可在顧客不在場時扣款;顧客在場的付款仍要驗證 | Visa | pm_card_authenticationRequiredSetupForOffSession |
||
| 付款成功(依發卡國) · 64 | ||||
| 台灣付款成功,發卡國:台灣 | Visa | pm_card_tw |
||
| 付款成功,發卡國:美國 | Visa | pm_card_us |
||
| 付款成功,發卡國:阿根廷 | Visa | pm_card_ar |
||
| 付款成功,發卡國:巴西 | Visa | pm_card_br |
||
| 付款成功,發卡國:加拿大 | Visa | pm_card_ca |
||
| 付款成功,發卡國:智利 | Visa | pm_card_cl |
||
| 付款成功,發卡國:哥倫比亞 | Visa | pm_card_co |
||
| 付款成功,發卡國:哥斯大黎加 | Visa | pm_card_cr |
||
| 付款成功,發卡國:厄瓜多 | Visa | pm_card_ec |
||
| 付款成功,發卡國:墨西哥 | Visa | pm_card_mx |
||
| 付款成功,發卡國:墨西哥 | Carnet | |||
| 付款成功,發卡國:巴拿馬 | Visa | pm_card_pa |
||
| 付款成功,發卡國:巴拉圭 | Visa | pm_card_py |
||
| 付款成功,發卡國:秘魯 | Visa | pm_card_pe |
||
| 付款成功,發卡國:烏拉圭 | Visa | pm_card_uy |
||
| 付款成功,發卡國:阿拉伯聯合大公國 | Visa | pm_card_ae |
||
| 付款成功,發卡國:阿拉伯聯合大公國 | Mastercard | pm_card_ae_mastercard |
||
| 付款成功,發卡國:奧地利 | Visa | pm_card_at |
||
| 付款成功,發卡國:比利時 | Visa | pm_card_be |
||
| 付款成功,發卡國:保加利亞 | Visa | pm_card_bg |
||
| 付款成功,發卡國:白俄羅斯 | Visa | pm_card_by |
||
| 付款成功,發卡國:克羅埃西亞 | Visa | pm_card_hr |
||
| 付款成功,發卡國:賽普勒斯 | Visa | pm_card_cy |
||
| 付款成功,發卡國:捷克 | Visa | pm_card_cz |
||
| 付款成功,發卡國:丹麥 | Visa | pm_card_dk |
||
| 付款成功,發卡國:愛沙尼亞 | Visa | pm_card_ee |
||
| 付款成功,發卡國:芬蘭 | Visa | pm_card_fi |
||
| 付款成功,發卡國:法國 | Visa | pm_card_fr |
||
| 付款成功,發卡國:德國 | Visa | pm_card_de |
||
| 付款成功,發卡國:直布羅陀 | Visa | pm_card_gi |
||
| 付款成功,發卡國:希臘 | Visa | pm_card_gr |
||
| 付款成功,發卡國:匈牙利 | Visa | pm_card_hu |
||
| 付款成功,發卡國:愛爾蘭 | Visa | pm_card_ie |
||
| 付款成功,發卡國:義大利 | Visa | pm_card_it |
||
| 付款成功,發卡國:拉脫維亞 | Visa | pm_card_lv |
||
| 付款成功,發卡國:列支敦斯登 | Visa | pm_card_li |
||
| 付款成功,發卡國:立陶宛 | Visa | pm_card_lt |
||
| 付款成功,發卡國:盧森堡 | Visa | pm_card_lu |
||
| 付款成功,發卡國:馬爾他 | Visa | pm_card_mt |
||
| 付款成功,發卡國:荷蘭 | Visa | pm_card_nl |
||
| 付款成功,發卡國:挪威 | Visa | pm_card_no |
||
| 付款成功,發卡國:波蘭 | Visa | pm_card_pl |
||
| 付款成功,發卡國:葡萄牙 | Visa | pm_card_pt |
||
| 付款成功,發卡國:羅馬尼亞 | Visa | pm_card_ro |
||
| 付款成功,發卡國:沙烏地阿拉伯 | Visa | |||
| 付款成功,發卡國:斯洛維尼亞 | Visa | pm_card_si |
||
| 付款成功,發卡國:斯洛伐克 | Visa | pm_card_sk |
||
| 付款成功,發卡國:西班牙 | Visa | pm_card_es |
||
| 付款成功,發卡國:瑞典 | Visa | pm_card_se |
||
| 付款成功,發卡國:瑞士 | Visa | pm_card_ch |
||
| 付款成功,發卡國:英國 | Visa | pm_card_gb |
||
| 付款成功,發卡國:英國 | Visa (debit) | pm_card_gb_debit |
||
| 付款成功,發卡國:英國 | Mastercard | pm_card_gb_mastercard |
||
| 付款成功,發卡國:澳洲 | Visa | pm_card_au |
||
| 付款成功,發卡國:中國 | Visa | pm_card_cn |
||
| 付款成功,發卡國:香港 | Visa | pm_card_hk |
||
| 付款成功,發卡國:印度 | Visa | pm_card_in |
||
| 付款成功,發卡國:日本 | Visa | pm_card_jp |
||
| 付款成功,發卡國:日本 | JCB | pm_card_jcb |
||
| 付款成功,發卡國:馬來西亞 | Visa | pm_card_my |
||
| 付款成功,發卡國:紐西蘭 | Visa | pm_card_nz |
||
| 付款成功,發卡國:新加坡 | Visa | pm_card_sg |
||
| 付款成功,發卡國:泰國 | Visa (credit) | pm_card_th_credit |
||
| 付款成功,發卡國:泰國 | Visa (debit) | pm_card_th_debit |
||
本地支付方式:測試值
Stripe 為德國、法國、西班牙的 SEPA 扣款,日本的 Konbini 與巴西的 Boleto 公布的測試值。台灣沒有列:Stripe 的支付方式支援表上,沒有任何本地支付方式把台灣列為顧客所在國家。點值即可複製。這些付款會先停在 processing 或 requires_action 才有結果,所以最後一欄列出整串 webhook 事件。
| 測試值 | 模擬情境 | 參數 | PaymentMethod | 代碼與事件 |
|---|---|---|---|---|
| SEPA Direct Debit · 德國 (DE) · 6 | ||||
| PaymentIntent 從 processing 變成 succeeded | sepa_ |
pm_ |
||
| 至少三分鐘後,PaymentIntent 從 processing 變成 succeeded | sepa_ |
pm_ |
||
| PaymentIntent 從 processing 變成 requires_payment_method | sepa_ |
pm_ |
||
| 至少三分鐘後,PaymentIntent 從 processing 變成 requires_payment_method | sepa_ |
pm_ |
||
| PaymentIntent 從 processing 變成 succeeded,接著立刻產生一筆爭議 | sepa_ |
pm_ |
||
| 付款失敗,失敗碼 insufficient_funds | sepa_ |
pm_ |
insufficient_ |
|
| SEPA Direct Debit · 法國 (FR) · 6 | ||||
| PaymentIntent 從 processing 變成 succeeded | sepa_ |
pm_ |
||
| 至少三分鐘後,PaymentIntent 從 processing 變成 succeeded | sepa_ |
pm_ |
||
| PaymentIntent 從 processing 變成 requires_payment_method | sepa_ |
pm_ |
||
| 至少三分鐘後,PaymentIntent 從 processing 變成 requires_payment_method | sepa_ |
pm_ |
||
| PaymentIntent 從 processing 變成 succeeded,接著立刻產生一筆爭議 | sepa_ |
pm_ |
||
| 付款失敗,失敗碼 insufficient_funds | sepa_ |
pm_ |
insufficient_ |
|
| SEPA Direct Debit · 西班牙 (ES) · 6 | ||||
| PaymentIntent 從 processing 變成 succeeded | sepa_ |
pm_ |
||
| 至少三分鐘後,PaymentIntent 從 processing 變成 succeeded | sepa_ |
pm_ |
||
| PaymentIntent 從 processing 變成 requires_payment_method | sepa_ |
pm_ |
||
| 至少三分鐘後,PaymentIntent 從 processing 變成 requires_payment_method | sepa_ |
pm_ |
||
| PaymentIntent 從 processing 變成 succeeded,接著立刻產生一筆爭議 | sepa_ |
pm_ |
||
| 付款失敗,失敗碼 insufficient_funds | sepa_ |
pm_ |
insufficient_ |
|
| Konbini · 日本 (JP) · 6 | ||||
| 3 分鐘後付款成功 | billing_ |
|||
| 立即付款成功 | billing_ |
|||
| 立即逾期 | billing_ |
|||
| 一直沒付款,3 分鐘後逾期 | billing_ |
|||
| 一直沒付款,在你設定的 expires_at 逾期 | billing_ |
|||
| 確認 PaymentIntent 時,確認號被拒 | payment_ |
payment_ |
||
| Boleto · 巴西 (BR) · 6 | ||||
| 繳費單 3 分鐘後付清 | billing_ |
|||
| 繳費單立即付清 | billing_ |
|||
| 繳費單未付即逾期,幾秒內送出 payment_failed | billing_ |
|||
| 繳費單約 3 分鐘後未付逾期 | billing_ |
|||
| 繳費單一直沒付,在它的 expires_at 逾期 | billing_ |
|||
| 沙盒專用、可略過稅籍編號驗證的 CPF | boleto[ |
|||
資料來源:Stripe 文件〈Testing〉(測試卡、按國家分的卡、台灣卡 pm_card_tw、跨境手續費、地點格式 email;這一頁沒有繁體中文版,另有簡體中文版)、〈Payment method support〉(各付款方式支援的顧客國家)、〈Supported currencies〉(TWD 的金額單位與出款規則)、〈Decline codes〉;Stripe〈Global availability〉(可開戶的國家與地區)。以上皆於 2026 年 9 月 26 日查閱。
Stripe 測試卡怎麼用
三個步驟。測試卡只被測試金鑰接受,所以這一頁上的任何東西都碰不到真的卡片或真的顧客。
- 換成測試金鑰。 用測試用的可公開金鑰與私密金鑰,或是沙盒。Stripe 服務協議禁止在正式環境用真實的付款資料做測試;反過來,把測試卡號送進正式環境,只會直接被拒。
- 挑一張對應你要的結果的卡。 單純要成功,用 4242 4242 4242 4242。要練錯誤處理,就挑那一列寫著你想看到的 decline code 的卡,安全碼填任意三碼、有效期限填任何未來日期。
- 伺服器端的程式碼改用 PaymentMethod。 Stripe 建議在 API 呼叫裡傳 pm_card_visa 這類 PaymentMethod,而不是直接寫卡號,這樣測試程式碼裡永遠不會出現卡號。表格的 PaymentMethod 一欄列出每張有對應值的卡;台灣卡是 pm_card_tw。
台灣卡、台灣顧客與新臺幣:Stripe 文件裡讀不到的在地細節
這一頁是 Stripe 測試卡號表的繁體中文版:119 張測試卡,每張附上它模擬的情境、PaymentMethod、錯誤碼與 webhook 事件。Stripe 自己的測試文件有英文、德文、法文、西班牙文、義大利文、日文、巴西葡萄牙文、印尼文和簡體中文,就是沒有繁體中文——用 zh-TW 的瀏覽器打開,拿到的是英文頁。底下幾件事,是台灣開發者在那一頁上讀不到的:
- 台灣卡是 4000 0015 8000 0008。Stripe 按國家列出的測試卡裡,台灣這一列是一張 Visa,PaymentMethod 是
pm_card_tw,模擬台灣發行的卡付款成功。上面的表格把它排在「付款成功(依發卡國)」一組的第一個,並標上「台灣」。 - 對你的 Stripe 帳戶來說,它是一張外國卡。台灣不在 Stripe 公布的可開戶國家/地區清單上,所以收台灣卡的帳戶一定開在別的國家。Stripe 的測試文件寫明:跨境手續費依發卡國計算,發卡國不是美國的卡,即使在測試環境也可能被算跨境費。任何會讀手續費或卡片國別的程式,都該拿這張卡跑一次。
- 沒有台灣的本地支付方式。Stripe 的支付方式支援表列了 43 種付款方式,沒有一種把台灣列為顧客所在國家——日本有 Konbini 與 PayPay,新加坡有 PayNow,泰國有 PromptPay,台灣一個也沒有。所以下面的本地支付方式表沒有台灣的列;在 Stripe 上,台灣顧客要測的主要是卡片。
- 新臺幣金額要乘以 100。Stripe 的 API 以貨幣的最小單位收金額,而 TWD 不在零位小數貨幣的名單上(日圓 JPY 才在),所以 NT$1,290 要傳
amount: 129000;傳 1290,扣的是 NT$12.90。反過來,TWD 的出款(payout)Stripe 當零位小數處理:手動出款的金額必須能被 100 整除。 - 想看台灣顧客看到的結帳頁,用地點格式的 email。測試 Checkout Session、Payment Link 或 pricing table 時,把
test+location_TW@example.com當成 Checkout Session 的customer_email,或 Payment Link 的prefilled_email,打開的結帳頁就會顯示在台灣的顧客會看到的幣別與付款方式。
哪張卡觸發哪一種失敗,webhook 又會收到什麼
把付款失敗處理好,要同時記住三樣東西:API 呼叫丟回來的 error.code、發卡行附上的 decline_code,以及之後才打到你 webhook 端點的事件。Stripe 把這三樣寫在三個不同的頁面,所以大多數整合只照著其中一頁寫,另外兩樣要到上線後才碰到。下面把同樣的資訊排成一種結果一列。
| 測試卡 | 模擬情境 | error.code | decline_code | Webhook 事件 |
|---|---|---|---|---|
| 4000 0000 0000 0002 | 一般拒絕 | card_declined | generic_decline | payment_intent.payment_failed |
| 4000 0000 0000 9995 | 資金不足 | card_declined | insufficient_funds | payment_intent.payment_failed |
| 4000 0000 0000 9987 | 遺失卡 | card_declined | lost_card | payment_intent.payment_failed |
| 4000 0000 0000 9979 | 被竊卡 | card_declined | stolen_card | payment_intent.payment_failed |
| 4000 0000 0000 6975 | 同一張卡嘗試太多次 | card_declined | card_velocity_exceeded | payment_intent.payment_failed |
| 4000 0000 0000 0069 | 過期卡 | expired_card | 無 | payment_intent.payment_failed |
| 4000 0000 0000 0127 | 安全碼錯誤 | incorrect_cvc | 無 | payment_intent.payment_failed |
| 4000 0000 0000 0119 | 處理錯誤 | processing_error | 無 | payment_intent.payment_failed |
| 4242 4242 4242 4241 | 過不了 Luhn 檢查的卡號 | incorrect_number | 無 | 無——扣款還沒建立就被擋下 |
| 4100 0000 0000 0019 | Radar 一律封鎖 | card_declined | generic_decline | payment_intent.payment_failed |
| 4000 0000 0000 9235 | 風險偏高,送進審查 | 無——扣款照樣建立 | 無 | review.opened |
| 4000 0000 0000 0101 | Radar 的安全碼檢查失敗 | card_declined | generic_decline | payment_intent.payment_failed |
| 4000 0000 0000 0036 | Radar 的郵遞區號檢查失敗 | card_declined | generic_decline | payment_intent.payment_failed |
| 4000 0000 0000 0259 | 扣款成功,之後以詐欺為由提出爭議 | 無 | 無 | charge.dispute.created |
| 4000 0000 0000 2685 | 扣款成功,之後以「未收到商品」提出爭議 | 無 | 無 | charge.dispute.created |
| 4000 0000 0000 5423 | 扣款成功,之後收到早期詐欺警示 | 無 | 無 | radar.early_fraud_warning.created |
| 4000 0000 0000 7726 | 退款先是 pending,之後才成功 | 無 | 無 | refund.updated |
| 4000 0000 0000 5126 | 退款看起來成功,之後才失敗 | 無 | 無 | refund.failed |
| 4000 0000 0000 3220 | 必須 3D 驗證 | 無 | 無 | payment_intent.requires_action |
| 4000 0084 0000 1629 | 驗證通過,之後仍被拒 | card_declined | 無 | payment_intent.payment_failed |
| 4000 0084 0000 1280 | 3D 驗證的查詢本身出錯 | card_declined | 無 | payment_intent.payment_failed |
把它當成一張表來讀,會養成兩個習慣。第一,card_declined 不是原因,是類別——原因在 decline_code。上面八種被拒裡,五種帶著 decline_code;另外三種(過期、安全碼錯誤、處理錯誤)沒有,原因直接寫在 error.code。錯誤處理只看 error.code 的話,資金不足和被竊卡對它來說一模一樣。不過要區分的是你的內部處理,不是顧客看到的字:Stripe 在 lost_card、stolen_card 和 fraudulent 的說明裡都寫著,不要把更詳細的原因告訴顧客,照 generic_decline 的方式呈現。
第二,有些結果根本不會出現在回應裡。被送進審查的扣款、幾週後才開的爭議、從成功翻成失敗的非同步退款——API 呼叫的當下都看不到。它們以事件的形式到達,或者因為端點根本沒寫而永遠不會到。這才是值得刻意去測的失敗:先讓卡被擋下,再看你的系統怎麼處理那個事件。
表格放不下的兩個註腳。你不送安全碼或郵遞區號,Stripe 就直接跳過這兩項檢查,檢查也就不可能失敗——所以模擬檢查失敗的那幾張卡,在沒收這兩個欄位的表單上會安靜地成功。至於被 Radar 擋下的付款,generic_decline 的官方說明本來就包含「Stripe Radar 或 Adaptive Acceptance 封鎖了付款」。
測試 3D 驗證
3D Secure(3D 驗證)是線上刷卡時額外的一道身分驗證;在歐洲經濟區,強化客戶驗證(SCA)法規要求線上付款做這一步。它也是整合最常出狀況的地方,因為一路成功的測試永遠碰不到它。需要驗證的付款不會失敗、也不會成功:PaymentIntent 會停在 requires_action,前端必須把流程交給 Stripe.js,讓顧客完成驗證。
表格裡有九張卡在測這些分支,最省時間的區分是「必須」與「支援」:
- 4000 0000 0000 3220——必須驗證,而且驗證成功。這是拿來開發的那一張:用它,就會知道你的前端是真的呼叫了確認步驟,還是默默把
requires_action當成失敗。 - 4000 0000 0000 3055——支援 3D 驗證,但預設不要求。用來確認你沒有不小心把驗證變成強制。
- 4000 0084 0000 1629 與 4000 0084 0000 1280——流程收尾出錯的兩種方式:顧客驗證完、發卡行照樣拒絕;以及驗證的查詢本身出錯。兩者都回
card_declined,所以一個以為「驗證完成=付款完成」的錯誤處理,會替一筆根本沒成立的付款顯示成功畫面。 - 4000 0025 0000 3155 與 4000 0027 6000 3184——儲存卡片的情況。前者在卡片設定為日後使用之前,顧客不在場的扣款都要驗證;後者每一筆都要。如果你打算之後在顧客不在場時扣款(像訂閱續扣),這兩張就是續扣會不會成功的分水嶺。
容易踩的一個坑:只有這一組的卡真正測得到 3D 驗證。其他測試卡也可能觸發它,但 Stripe 會回 attempt_acknowledged 並略過額外步驟,於是你的驗證畫面從沒出現過,你卻以為它能動。另外,直接在 Stripe Dashboard 建立的付款不會跳轉到 3D 驗證——請從你自己的前端或 API 呼叫去跑。
按國家分的 Stripe 測試卡
Stripe 另外列了一份按國家分的測試卡:58 個國家/地區、64 張卡,每張都模擬「該國發行的卡付款成功」。它們是上面表格的最後一組,這一頁把台灣排在最前面。PaymentMethod 跟著國家代碼走——pm_card_tw、pm_card_jp、pm_card_de——例外有三個:墨西哥的 Carnet 卡和沙烏地阿拉伯那張沒有 PaymentMethod,日本的 JCB 卡用的是 pm_card_jcb,和品牌組那張 JCB 同一個。美國那一列就是 4242 4242 4242 4242 本身,另有 pm_card_us。
這些卡改變的是發卡國,用途也就在這裡:任何會讀手續費或卡片國別的流程,都該拿它們跑一遍。它們不測的是驗證。強化客戶驗證法規要求歐洲經濟區內的線上付款做 3D 驗證,但 Stripe 註明,歐洲與中東那一段的卡模擬的是不經驗證就成功的付款——德國卡、法國卡在這裡不會觸發你的驗證流程,要測驗證,請用 3D 驗證那一組。
卡片表下面還有 Stripe 為三種本地付款方式公布的測試值:德國、法國、西班牙的 SEPA 扣款 IBAN,日本的 Konbini,巴西的 Boleto。它們的結果來得跟卡片不一樣:SEPA 扣款會先停在 processing 再成功或失敗,Konbini 與 Boleto 的繳費單則停在 requires_action,直到付清或逾期,所以每一列列的是 webhook 會依序收到的整串事件,不是單一事件。Konbini 與 Boleto 的結果由顧客的 email 決定;Boleto 在沙盒裡可以用稅籍編號 000.000.000-00,Stripe 對它免除驗證。這張表沒有台灣的列,原因見本頁開頭:Stripe 沒有面向台灣顧客的本地付款方式。
退款、爭議,以及那些晚到的事件
正式環境裡的退款不是即時的,也不保證成功:它可能先回報成功、之後才失敗,也可能先停在 pending、之後才有結果。幾乎每一套測試都漏掉這件事,因為用一般的測試卡,退款會立刻完成,而且再也不會改變狀態。有兩張卡能把真實的行為找回來:4000 0000 0000 7726 讓退款先 pending、之後變成成功;4000 0000 0000 5126 先回報成功、之後才失敗。兩者事後都會送出事件——這正是你該在顧客打電話來問「錢怎麼沒退回來」之前就寫好的那段程式。
爭議也是同一回事,只是更慢。扣款照常成功,幾天後才出現爭議,而 charge.dispute.created 是你唯一會收到的通知。4000 0000 0000 0259 以詐欺為由提出爭議,4000 0000 0000 2685 以「未收到商品」提出,4000 0000 0000 1976 則是詢問(inquiry)而不是正式爭議。4000 0000 0000 5423 產生的是早期詐欺警示:卡組織在告訴你爭議大概要來了,而你還有時間主動退款。
要連結果一起模擬,就用 Stripe 保留給測試的證據字串回覆爭議:winning_evidence 讓爭議以勝訴結案,losing_evidence 以敗訴結案,escalate_inquiry_evidence 把詢問升級成正式爭議。
晚到的這一組還有最後一張:4000 0000 0000 0077 讓款項直接進可用餘額,而不是待入帳餘額。這不是付款測試,是記帳測試——下游有任何東西在對帳出款、又不想等結算期才知道對不對時,就用它。
把卡表下載成 JSON 或 CSV
要手抄的表,就是會抄錯的表。頁面最上面的兩個下載按鈕,把同樣的 119 張卡給你成機器讀得懂的檔案,由瀏覽器從渲染這一頁的同一份資料產生——所以你下載的內容,不可能和你剛剛讀到的不一樣。
JSON 是一個物件,帶著 source、checked、count 和 cards 陣列。每張卡都有一個固定的 id(可以直接拿來當測試名稱)、卡號、品牌、分組、一行說明、安全碼與有效期限的規則、四個對照欄位——payment_method、error_code、decline_code、webhook_event——以及 country:按國家分組那些卡的發卡國 ISO 代碼,台灣卡就是 "TW"。不適用的欄位是 null 而不是缺鍵,解析時不必到處防呆。
CSV 帶著同樣的十二個欄位,照 RFC 4180 加引號,用試算表打開、或用 pandas 讀進來都不需要額外參數。寫種子資料,或交給一定會有人來要的 QA 試算表,都很方便。下載檔一律是英文、依規範順序排列,不管你從哪個語言的頁面下載;表格下方的本地付款方式測試值只供複製,兩個檔案都不包含。
兩種下載都跟著目前的篩選走。把表格縮小到「被拒」、按下載 JSON,你拿到的是十列而不是全部 119 列——參數化測試通常要的正是這個:
test.each(fixtures.cards.filter(c => c.group === 'decline'))(
'$id surfaces $decline_code',
async ({ payment_method, error_code, decline_code }) => { /* … */ },
);
檔案裡帶著來源網址和核對日期,因為沒有日期的卡號表,半年後就沒辦法信任。Stripe 改了卡號時,老實的做法是回頭重新核對來源,而不是在程式庫裡留一份過期的副本。
你真正在做的東西
沒有人會為了好玩去查測試卡。你會在這裡,是因為正在接結帳,而結帳只是更大一件事的一塊:一份商品目錄、一個顧客改不了的價格、一個在某處用密鑰建立的 session、一個決定這筆訂單算不算已付款的 webhook,以及錢進來之後的所有事。
最常出錯的不是卡,是價格。一個把價格寫在 HTML 裡、再把金額送到結帳端點的靜態網站,等於把那個數字交給瀏覽器決定,而瀏覽器不值得信任——這是一整類測試卡永遠抓不到的錯誤,因為被竄改的付款會漂亮地成功。
Clize 正是為了這個原因建在 Stripe Checkout 上,並把價格放在伺服器端:代管的商店會拿隨網站部署的 _catalog.json 為每一筆購物車定價,完全不理會用戶端宣稱的金額。如果你的問題長這樣,目錄檔的產生器與檢查工具在這裡(英文);如果你只需要讓一位顧客付一筆金額,clize pay link --amount 49 會回傳一個正式(live)的 Stripe Checkout 網址,不需要你自己的 Stripe 帳戶——那一筆是真的錢,所以千萬別和這一頁上的號碼混在一起。
常見問題
Stripe 測試卡號是多少?
最常用的 Stripe 測試卡號是 4242 4242 4242 4242:安全碼填任意三碼(American Express 是四碼)、有效期限填任何未來日期(例如 12/34)。這是一張一定成功的 Visa,其他欄位隨便填;它只對測試金鑰有效,送到正式環境的金鑰會被拒。
測試卡的有效期限和安全碼要填什麼?
任何未來的日期都可以,12/34 就是 Stripe 自己用的例子。安全碼填任意三碼,American Express 則是任意四碼。你不送安全碼的話,Stripe 會直接跳過安全碼檢查,所以模擬安全碼檢查失敗的那張卡,在沒有安全碼欄位的表單上看起來會成功。
為什麼 Stripe 測試卡一直被拒?
通常是三個原因之一。你把它送到了正式環境的金鑰,那本來就會拒絕測試卡號;你複製到一張本來就設計成被拒的卡,例如 4000 0000 0000 0002 和整個「被拒」分組;或者你用了過不了 Luhn 檢查的卡號,例如 4242 4242 4242 4241,它在扣款建立之前就回 incorrect_number。
台灣可以用 Stripe 嗎?有台灣的測試卡嗎?
台灣不在 Stripe 公布的可開戶國家與地區清單上(2026 年 9 月 26 日查閱),Stripe 的支付方式支援表上也沒有面向台灣顧客的本地付款方式。測試卡則有:Stripe 按國家列出的台灣卡是 4000 0015 8000 0008,PaymentMethod 為 pm_card_tw,模擬台灣發行的卡付款成功。
新臺幣的金額要怎麼傳給 Stripe?
乘以 100。Stripe 的 API 以貨幣的最小單位收金額,TWD 不是零位小數貨幣,所以 NT$1,290 要傳 129000,傳 1290 扣的是 NT$12.90。出款則相反:Stripe 把 TWD 出款當零位小數處理,手動出款的金額必須能被 100 整除。
Stripe 要怎麼測試 3D 驗證?
用 4000 0000 0000 3220,它必須驗證、而且驗證成功。PaymentIntent 會回到 requires_action,前端要交給 Stripe.js 讓顧客完成驗證。只有 3D 驗證那一組的卡真正測得到這個流程;其他卡也可能觸發它,但 Stripe 會回 attempt_acknowledged 並略過額外步驟。
測試卡可以在正式環境(live mode)用嗎?
不行。測試卡號只被測試金鑰接受,而真實的卡片資料也不能拿來測試——Stripe 服務協議禁止在正式環境用真實付款資料做測試。在設定檔裡把兩組金鑰分開放,因為這個錯誤一個方向是無聲的,另一個方向是要花錢的。
測試卡跑完了,就收一筆真的款。
一行指令回傳一個正式的 Stripe Checkout 付款連結,不需要 Stripe 帳戶、金鑰或申請表單。那是真的錢,所以手上拿的是哪一組號碼,要分清楚。
$ npm i -g @clize/clize && clize login $ clize pay link --amount 49 --for "訂單 1042"[ Agent Storefront → ]