feat: bank card.

This commit is contained in:
tx7do
2023-10-17 23:51:17 +08:00
parent 733bfb6199
commit c0291d8423
6 changed files with 2882 additions and 21 deletions

View File

@@ -8,6 +8,8 @@
- [Luhn algorithm - geeksforgeeks](https://www.geeksforgeeks.org/luhn-algorithm/)
- [Luhns algorithm to validate credit / debit card Numbers](https://medium.com/@akshaymohite/luhns-algorithm-to-validate-credit-debit-card-numbers-1952e6c7a9d0)
- [干货丨银行卡号编码规则及其应用](https://www.woshipm.com/pd/371041.html)
- [giraffe-lib](https://github.com/giraffe-lib/bankInfo/blob/main/src/map.js)
- [bankInfo](https://github.com/giraffe-lib/bankInfo/blob/main/src/map.js)
- [BankCards](https://github.com/geekgao/BankCards/blob/master/bankcode.py)
- [bcbc](https://github.com/hexindai/bcbc)
- [banks-db](https://github.com/ramoona/banks-db)
- [SwiftCodes](https://github.com/PeterNotenboom/SwiftCodes)

Binary file not shown.

View File

@@ -1,6 +1,9 @@
package bank_card
import "strings"
import (
"strconv"
"strings"
)
var BANKBIN = []string{
"621098", "622150", "622151",
@@ -651,3 +654,22 @@ func GetNameOfBank(cardNo string) string {
return BANKNAME[index]
}
var defaultDatabase *Database = NewDatabase(false)
func QueryBankByCardNumber(cardNo string) *BankCard {
if len(cardNo) < 6 {
return nil
}
for i := 6; i <= 8; i++ {
cardBin := cardNo[0:i]
bin, _ := strconv.Atoi(cardBin)
bank := defaultDatabase.queryBankCard(uint32(bin))
if bank != nil {
return bank
}
}
return nil
}

View File

@@ -17,6 +17,7 @@ func TestGetNameOfBank(t *testing.T) {
"6228481698729890079",
"621661280000447287",
"6222081106004039591",
"6201140000000000000",
}
for _, w := range validBankCards {
@@ -27,3 +28,25 @@ func TestGetNameOfBank(t *testing.T) {
})
}
}
func TestQueryBankByCardNumber(t *testing.T) {
var validBankCards = []string{
"6226095711989751",
"6228480402564890018",
"6228480402637874213",
"6228481552887309119",
"6228480801416266113",
"6228481698729890079",
"621661280000447287",
"6222081106004039591",
"6201140000000000000",
}
for _, w := range validBankCards {
t.Run("get bank card of name: "+w, func(t *testing.T) {
bankCard := QueryBankByCardNumber(w)
fmt.Println(w, bankCard)
assert.NotNil(t, bankCard)
})
}
}

View File

@@ -18,12 +18,20 @@ type Database struct {
db *sql.DB
}
func NewDatabase() *Database {
return &Database{}
func NewDatabase(openFile bool) *Database {
db := &Database{}
if openFile {
db.openFromFile()
} else {
_ = db.openFromEmbed()
}
return db
}
// OpenFromFile 从文件打开数据库
func (d *Database) OpenFromFile() {
// openFromFile 从文件打开数据库
func (d *Database) openFromFile() {
db, err := sql.Open("sqlite3", "bank_card.db")
if err != nil {
panic("failed to connect database")
@@ -34,8 +42,8 @@ func (d *Database) OpenFromFile() {
d.initTables()
}
// OpenFromEmbed 从内嵌文件打开数据库
func (d *Database) OpenFromEmbed() error {
// openFromEmbed 从内嵌文件打开数据库
func (d *Database) openFromEmbed() error {
db, err := sql.Open("sqlite3", "file::memory:?mode=ro&cache=shared")
if err != nil {
panic("failed to connect database")
@@ -110,9 +118,17 @@ func (d *Database) insertDataToBankCardTable(data *BankCard) {
}
}
func (d *Database) UpdateBankCardTableCardName(bin uint32, cardName string) {
strSql := fmt.Sprintf("UPDATE bank_cards SET card_name = '%s' WHERE bin = '%d';", cardName, bin)
_, err := d.db.Exec(strSql)
if err != nil {
log.Println(err)
}
}
// queryBank 查询银行信息
func (d *Database) queryBank(bankCode string) *Bank {
strSql := fmt.Sprintf("SELECT * FROM banks WHERE bank_code = '%s' LIMIT 1;", bankCode)
strSql := fmt.Sprintf("SELECT id, bank_code, bank_name FROM banks WHERE bank_code = '%s' LIMIT 1;", bankCode)
rows, err := d.db.Query(strSql)
if err != nil {
log.Fatal("query bank failed:", err)
@@ -134,7 +150,7 @@ func (d *Database) queryBank(bankCode string) *Bank {
// queryBankCard 查询银行卡信息
func (d *Database) queryBankCard(bin uint32) *BankCard {
strSql := fmt.Sprintf("SELECT * FROM bank_cards WHERE bin = '%d' LIMIT 1;", bin)
strSql := fmt.Sprintf("SELECT bin, bank_code, card_name, card_type, card_length FROM bank_cards WHERE bin = '%d' LIMIT 1;", bin)
rows, err := d.db.Query(strSql)
if err != nil {
log.Fatal("query bank card failed:", err)

File diff suppressed because it is too large Load Diff