开发测试用什么信用卡号:Stripe 测试卡 + Luhn 算法

做支付集成 / 电商网站开发,需要在开发环境测试信用卡表单——不能用真实卡号(隐私、合规、可能被误扣款)。正规做法:用支付平台官方提供的测试卡号,只在 sandbox / test 模式下有效。

Stripe 测试卡(最常用)

Stripe 的 test key(以 sk_test_ 开头)下这些卡号完全有效:

卡号场景
4242 4242 4242 4242Visa 成功
4000 0025 0000 31553DS 认证成功
4000 0000 0000 9995余额不足
4000 0000 0000 0002拒绝
4000 0000 0000 0069过期卡
4000 0000 0000 0127CVV 错误
5555 5555 5555 4444Mastercard 成功
3782 822463 10005Amex 成功

其它字段

  • 有效期:任意未来日期(比如 12/34
  • CVV:任意 3 位数字(Amex 是 4 位)
  • 邮编:任意 5 位(美国)

完整列表:docs.stripe.com/testing

其它支付平台

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(罗恩)算法生成,防止手误。这算法能查错但不能验真——只保证格式合法,不能保证卡真的存在。

规则:

  1. 从右往左数,偶数位(第 2、4、6… 位)乘 2
  2. 乘完之后 > 9 的,减 9(等价于两位数字相加)
  3. 所有数字相加
  4. 和是 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 校验位

发卡组织前缀:

起始位卡种
4Visa
51-55, 22-27Mastercard
34, 37Amex
6011, 65Discover
62银联
35JCB

CVV 是什么

  • CVV1:磁条里的验证码
  • CVV2:卡背面 3 位数字(Amex 是正面 4 位)
  • 网上支付都用 CVV2

Stripe 测试环境里 CVV 任意 3 位都行——真实场景由发卡行验证。

一句话总结

开发 / 测试永远用 Stripe 等平台的官方测试卡号4242 4242 4242 4242),不要用真实卡号。Luhn 算法可以做格式校验和假数据生成,但格式合法 ≠ 真的能用。真实交易由支付网关全套验证。