feat: bank card.
This commit is contained in:
@@ -8,6 +8,8 @@
|
||||
- [Luhn algorithm - geeksforgeeks](https://www.geeksforgeeks.org/luhn-algorithm/)
|
||||
- [Luhn’s 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.
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user