Showing Posts From

支付

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

做支付集成 / 电商网站开发,需要在开发环境测试信用卡表单——不能用真实卡号(隐私、合规、可能被误扣款)。正规做法:用支付平台官方提供的测试卡号,只在 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 位(美国)完整列表: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(罗恩)算法生成,防止手误。这算法能查错但不能验真——只保证格式合法,不能保证卡真的存在。 规则:从右往左数,偶数位(第 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 == 0print(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 Visa51-55, 22-27 Mastercard34, 37 Amex6011, 65 Discover62 银联35 JCBCVV 是什么CVV1:磁条里的验证码 CVV2:卡背面 3 位数字(Amex 是正面 4 位) 网上支付都用 CVV2Stripe 测试环境里 CVV 任意 3 位都行——真实场景由发卡行验证。 一句话总结 开发 / 测试永远用 Stripe 等平台的官方测试卡号(4242 4242 4242 4242),不要用真实卡号。Luhn 算法可以做格式校验和假数据生成,但格式合法 ≠ 真的能用。真实交易由支付网关全套验证。