feat: bank card.
This commit is contained in:
@@ -8,6 +8,8 @@
|
|||||||
- [Luhn algorithm - geeksforgeeks](https://www.geeksforgeeks.org/luhn-algorithm/)
|
- [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)
|
- [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)
|
- [干货丨银行卡号编码规则及其应用](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)
|
- [BankCards](https://github.com/geekgao/BankCards/blob/master/bankcode.py)
|
||||||
- [bcbc](https://github.com/hexindai/bcbc)
|
- [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
|
package bank_card
|
||||||
|
|
||||||
import "strings"
|
import (
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
var BANKBIN = []string{
|
var BANKBIN = []string{
|
||||||
"621098", "622150", "622151",
|
"621098", "622150", "622151",
|
||||||
@@ -651,3 +654,22 @@ func GetNameOfBank(cardNo string) string {
|
|||||||
|
|
||||||
return BANKNAME[index]
|
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",
|
"6228481698729890079",
|
||||||
"621661280000447287",
|
"621661280000447287",
|
||||||
"6222081106004039591",
|
"6222081106004039591",
|
||||||
|
"6201140000000000000",
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, w := range validBankCards {
|
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
|
db *sql.DB
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewDatabase() *Database {
|
func NewDatabase(openFile bool) *Database {
|
||||||
return &Database{}
|
db := &Database{}
|
||||||
|
|
||||||
|
if openFile {
|
||||||
|
db.openFromFile()
|
||||||
|
} else {
|
||||||
|
_ = db.openFromEmbed()
|
||||||
|
}
|
||||||
|
|
||||||
|
return db
|
||||||
}
|
}
|
||||||
|
|
||||||
// OpenFromFile 从文件打开数据库
|
// openFromFile 从文件打开数据库
|
||||||
func (d *Database) OpenFromFile() {
|
func (d *Database) openFromFile() {
|
||||||
db, err := sql.Open("sqlite3", "bank_card.db")
|
db, err := sql.Open("sqlite3", "bank_card.db")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic("failed to connect database")
|
panic("failed to connect database")
|
||||||
@@ -34,8 +42,8 @@ func (d *Database) OpenFromFile() {
|
|||||||
d.initTables()
|
d.initTables()
|
||||||
}
|
}
|
||||||
|
|
||||||
// OpenFromEmbed 从内嵌文件打开数据库
|
// openFromEmbed 从内嵌文件打开数据库
|
||||||
func (d *Database) OpenFromEmbed() error {
|
func (d *Database) openFromEmbed() error {
|
||||||
db, err := sql.Open("sqlite3", "file::memory:?mode=ro&cache=shared")
|
db, err := sql.Open("sqlite3", "file::memory:?mode=ro&cache=shared")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic("failed to connect database")
|
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 查询银行信息
|
// queryBank 查询银行信息
|
||||||
func (d *Database) queryBank(bankCode string) *Bank {
|
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)
|
rows, err := d.db.Query(strSql)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal("query bank failed:", err)
|
log.Fatal("query bank failed:", err)
|
||||||
@@ -134,7 +150,7 @@ func (d *Database) queryBank(bankCode string) *Bank {
|
|||||||
|
|
||||||
// queryBankCard 查询银行卡信息
|
// queryBankCard 查询银行卡信息
|
||||||
func (d *Database) queryBankCard(bin uint32) *BankCard {
|
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)
|
rows, err := d.db.Query(strSql)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal("query bank card failed:", err)
|
log.Fatal("query bank card failed:", err)
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user