做支付集成 / 电商网站开发,需要在开发环境测试信用卡表单——不能用真实卡号(隐私、合规、可能被误扣款)。正规做法:用支付平台官方提供的测试卡号,只在 sandbox / test 模式下有效。
Stripe 测试卡(最常用)
Stripe 的 test key(以 sk_test_ 开头)下这些卡号完全有效:
| 卡号 | 场景 |
|---|---|
| 4242 4242 4242 4242 | Visa 成功 |
| 4000 0025 0000 3155 | 3DS 认证成功 |
| 4000 0000 0000 9995 | 余额不足 |
| 4000 0000 0000 0002 | 拒绝 |
| 4000 0000 0000 0069 | 过期卡 |
| 4000 0000 0000 0127 | CVV 错误 |
| 5555 5555 5555 4444 | Mastercard 成功 |
| 3782 822463 10005 | Amex 成功 |
其它字段:
- 有效期:任意未来日期(比如
12/34) - CVV:任意 3 位数字(Amex 是 4 位)
- 邮编:任意 5 位(美国)
其它支付平台
PayPal Sandbox:注册测试账号(personal + business),登录时用测试账号密码,不用真实卡号。
Braintree:
4111 1111 1111 1111 → Visa 成功
4000 1111 1111 1115 → Visa 拒绝
Adyen:
4111 1111 4555 1142 → Visa 成功
2223 0000 4841 0010 → Mastercard 成功
支付宝 / 微信支付沙箱:用它们的沙箱环境,扫码支付按提示走。国内也不涉及信用卡。
Luhn 算法:卡号是怎么校验的
信用卡号的最后一位是校验位,用 Luhn(罗恩)算法生成,防止手误。这算法能查错但不能验真——只保证格式合法,不能保证卡真的存在。
规则:
- 从右往左数,偶数位(第 2、4、6… 位)乘 2
- 乘完之后 > 9 的,减 9(等价于两位数字相加)
- 所有数字相加
- 和是 10 的倍数 → 合法
例:4242 4242 4242 4242
4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2
×2 ×2 ×2 ×2 ×2 ×2 ×2 ×2
= 8 2 8 2 8 2 8 2 8 2 8 2 8 2 8 2
和 = 80,能被 10 整除 → 合法
Python 实现 Luhn 校验
def luhn_check(card: str) -> bool:
digits = [int(c) for c in card if c.isdigit()]
if not digits:
return False
total = 0
for i, d in enumerate(reversed(digits)):
if i % 2 == 1: # 偶数位(从右数)
d *= 2
if d > 9:
d -= 9
total += d
return total % 10 == 0
print(luhn_check("4242 4242 4242 4242")) # True
print(luhn_check("4242 4242 4242 4241")) # False
生成一个合法但假的卡号
前 15 位随便填,用 Luhn 算最后一位:
def luhn_checksum(partial: str) -> int:
"""给一串数字算 Luhn 校验位"""
digits = [int(c) for c in partial]
total = 0
for i, d in enumerate(reversed(digits)):
if i % 2 == 0: # 从右数第一位不动
d *= 2
if d > 9:
d -= 9
total += d
return (10 - total % 10) % 10
# 例:Visa 前缀 4,前 15 位随便填
partial = "424242424242424"
check = luhn_checksum(partial)
card = partial + str(check)
print(card) # 4242424242424242
注意:这样生成的卡号格式合法但不代表真的能用——支付网关会实时验证 BIN、发卡行、账户状态。用于开发时的假数据填充可以,但绕不过实际支付流程。
卡号结构
一张信用卡号一般 15-16 位:
4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2
├───┤ ├─────────────┤
BIN 账户 + 校验位
6 位 后面剩余
- BIN(前 6 位):Bank Identification Number,标识发卡机构
- 中间位:账户号
- 最后一位:Luhn 校验位
发卡组织前缀:
| 起始位 | 卡种 |
|---|---|
| 4 | Visa |
| 51-55, 22-27 | Mastercard |
| 34, 37 | Amex |
| 6011, 65 | Discover |
| 62 | 银联 |
| 35 | JCB |
CVV 是什么
- CVV1:磁条里的验证码
- CVV2:卡背面 3 位数字(Amex 是正面 4 位)
- 网上支付都用 CVV2
Stripe 测试环境里 CVV 任意 3 位都行——真实场景由发卡行验证。
一句话总结
开发 / 测试永远用 Stripe 等平台的官方测试卡号(4242 4242 4242 4242),不要用真实卡号。Luhn 算法可以做格式校验和假数据生成,但格式合法 ≠ 真的能用。真实交易由支付网关全套验证。
