项目背景
在现代支付系统中,信用卡(Credit Card)仍然是全球最重要的支付工具之一。无论是电商平台、SaaS 订阅系统、线下 POS 终端,还是移动支付网关,在接收信用卡号时都必须进行基础合法性校验。
如果不进行验证,可能会导致:
- 无效数据进入数据库
- 支付接口频繁失败
- 欺诈风险上升
- 系统性能浪费
- 客户体验下降
信用卡号校验主要分为两类:
- (长度、前缀、数字)
介绍 Go 语言实现信用卡号码校验的方法,基于 Luhn 算法进行合法性验证。内容涵盖项目背景、需求分析、技术原理及完整代码,包括结构体设计、Luhn 算法逻辑、卡前缀匹配等功能。通过去除空格、判空、长度限制及校验位计算,确保数据准确性。方案适用于支付网关、电商平台等场景,支持 Visa、MasterCard 等卡类型识别。
在现代支付系统中,信用卡(Credit Card)仍然是全球最重要的支付工具之一。无论是电商平台、SaaS 订阅系统、线下 POS 终端,还是移动支付网关,在接收信用卡号时都必须进行基础合法性校验。
如果不进行验证,可能会导致:
信用卡号校验主要分为两类:
其中,Luhn 算法(也称为模 10 算法)是全球通用的银行卡校验标准。
实现函数:
func IsValidCreditCard(number string) bool
判断字符串是否为合法信用卡号码。
4111111111111111 // Visa
5500000000000004 // MasterCard
340000000000009 // American Express
1234567890123456
4111111111111112
abcd123456
典型结构:
[发卡机构标识] + [账户号] + [校验位]
长度:
步骤:
示例:
卡号:4111111111111111
计算后总和 % 10 == 0 → 合法
| 类型 | 前缀 |
|---|---|
| Visa | 4 |
| MasterCard | 51–55 |
| AmEx | 34, 37 |
| Discover | 6011 |
整体流程:
type CreditCardValidator struct {
MinLength int
MaxLength int
}
// =============================
// file: validator/creditcard_validator.go
// =============================
package validator
import (
"errors"
"strconv"
"strings"
"unicode"
)
// CreditCardValidator 信用卡校验结构体
type CreditCardValidator struct {
MinLength int
MaxLength int
}
// NewCreditCardValidator 构造函数
func NewCreditCardValidator() *CreditCardValidator {
return &CreditCardValidator{
MinLength: 13,
MaxLength: 19,
}
}
// IsValid 校验信用卡是否合法
func (v *CreditCardValidator) IsValid(number string) (bool, error) {
// 1. 去除空格
number = strings.ReplaceAll(number, " ", "")
// 2. 判空
if number == "" {
return false, errors.New("信用卡号不能为空")
}
// 3. 判断是否全为数字
for _, r := range number {
if !unicode.IsDigit(r) {
return false, errors.New("信用卡号必须为数字")
}
}
// 4. 长度校验
if len(number) < v.MinLength || len(number) > v.MaxLength {
return false, errors.New("信用卡号长度不合法")
}
// 5. Luhn 算法校验
if !luhnCheck(number) {
return false, errors.New("未通过 Luhn 校验")
}
return true, nil
}
// luhnCheck Luhn 算法实现
func luhnCheck(number string) bool {
sum := 0
double := false
// 从右往左遍历
for i := len(number) - 1; i >= 0; i-- {
digit, _ := strconv.Atoi(string(number[i]))
if double {
digit *= 2
if digit > 9 {
digit -= 9
}
}
sum += digit
double = !double
}
return sum%10 == 0
}
// GetCardType 识别卡类型
func GetCardType(number string) string {
number = strings.ReplaceAll(number, " ", "")
if strings.HasPrefix(number, "4") {
return "Visa"
}
if len(number) >= 2 {
prefix2 := number[:2]
if prefix2 == "34" || prefix2 == "37" {
return "American Express"
}
}
if len(number) >= 2 {
prefix2 := number[:2]
if prefix2 >= "51" && prefix2 <= "55" {
return "MasterCard"
}
}
if strings.HasPrefix(number, "6011") {
return "Discover"
}
return "Unknown"
}
// =============================
// file: main.go
// =============================
package main
import (
"fmt"
"creditcard/validator"
)
func main() {
v := validator.NewCreditCardValidator()
testCases := []string{
"4111111111111111",
"5500000000000004",
"340000000000009",
"1234567890123456",
"4111111111111112",
}
for _, t := range testCases {
valid, err := v.IsValid(t)
fmt.Println("卡号:", t)
fmt.Println("是否有效:", valid)
fmt.Println("错误:", err)
fmt.Println("卡类型:", validator.GetCardType(t))
fmt.Println("---------------------")
}
}
初始化校验器,设置长度范围 13–19。
主校验函数:
实现模 10 算法:
根据前缀识别卡类型。
本项目实现了:
✔ 严格数字校验 ✔ Luhn 算法实现 ✔ 卡类型识别 ✔ 可扩展设计 ✔ 企业级基础校验逻辑
适用于:
不是,只是格式合法。
需要调用银行 API 或支付网关。
支持,只要符合 Luhn。
可扩展前缀判断规则,例如:
引入 BIN 数据库做更精确识别。
当前算法时间复杂度 O(n),非常轻量。
使用:
go test
本教程完整实现了 Go 语言验证信用卡号码(Luhn 算法)算法。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online